ocamlviz/0000755000175000017500000000000011251433245012260 5ustar tonkartonkarocamlviz/doc/0000755000175000017500000000000011251725027013027 5ustar tonkartonkarocamlviz/camlp4/0000755000175000017500000000000011251725027013442 5ustar tonkartonkarocamlviz/src/0000755000175000017500000000000011251725027013051 5ustar tonkartonkarocamlviz/tests/0000755000175000017500000000000011251725146013426 5ustar tonkartonkarocamlviz/CHANGELOG.txt0000644000175000017500000000014111251412152014276 0ustar tonkartonkar############ Changes in version 1.01 - can specify server's timer (>= 0.1 sec) ############ ocamlviz/configure0000755000175000017500000027475111246755411014215 0ustar tonkartonkar#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.63. # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 -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 # PATH needs CR # 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_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. 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 # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF 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 : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF 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 : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell bug-autoconf@gnu.org about your system, echo including any error possibly output before this message. echo This can help us improve future autoconf versions. echo Configuration will now proceed without shell functions. } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, 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= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="src/ocamlviz.ml" ac_subst_vars='LTLIBOBJS LIBOBJS EXE OCAMLWIN32 GUIOPT INCLUDECAIRO CAIRO INCLUDEGTK2 LABLGTK2 OCAMLLIB OCAMLVERSION OCAMLBEST OCAMLWEB OCAMLYACC OCAMLLEXDOTOPT OCAMLLEX OCAMLDEPDOTOPT OCAMLDEP OCAMLOPTDOTOPT OCAMLCDOTOPT OCAMLOPT OCAMLC 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 localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias' # 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' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' 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=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. 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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$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 ;; -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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$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_echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$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_echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 { (exit 1); exit 1; }; } ;; *) $as_echo "$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 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_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } 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 $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 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_echo "$as_me: error: working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # 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 || $as_echo 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_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } 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 this package 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] --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/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF _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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$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 guested configure. 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 $as_echo "$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 configure generated by GNU Autoconf 2.63 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 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 $as_me, which was generated by GNU Autoconf 2.63. Invocation command line was $ $0 $@ _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 test -z "$as_dir" && as_dir=. $as_echo "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=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$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 ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX 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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$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= ;; #( *) $as_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 cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$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'; { (exit 1); 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 # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test -r "$ac_site_file"; then { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" 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. if test -f "$cache_file"; then { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file 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,) { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$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 { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 $as_echo "$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=`$as_echo "$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. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 $as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } 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 # Check for Ocaml compilers # we first look for ocamlc in the path; if not present, we fail # Extract the first word of "ocamlc", so it can be a program name with args. set dummy ocamlc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OCAMLC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OCAMLC"; then ac_cv_prog_OCAMLC="$OCAMLC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OCAMLC="ocamlc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLC" && ac_cv_prog_OCAMLC="no" fi fi OCAMLC=$ac_cv_prog_OCAMLC if test -n "$OCAMLC"; then { $as_echo "$as_me:$LINENO: result: $OCAMLC" >&5 $as_echo "$OCAMLC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLC" = no ; then { { $as_echo "$as_me:$LINENO: error: Cannot find ocamlc." >&5 $as_echo "$as_me: error: Cannot find ocamlc." >&2;} { (exit 1); exit 1; }; } fi # we extract Ocaml version number and library path OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` echo "ocaml version is $OCAMLVERSION" OCAMLLIB=`$OCAMLC -v | tail -1 | cut -f 4 -d " "` echo "ocaml library path is $OCAMLLIB" # then we look for ocamlopt; if not present, we issue a warning # if the version is not the same, we also discard it # we set OCAMLBEST to "opt" or "byte", whether ocamlopt is available or not # Extract the first word of "ocamlopt", so it can be a program name with args. set dummy ocamlopt; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OCAMLOPT+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OCAMLOPT"; then ac_cv_prog_OCAMLOPT="$OCAMLOPT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OCAMLOPT="ocamlopt" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLOPT" && ac_cv_prog_OCAMLOPT="no" fi fi OCAMLOPT=$ac_cv_prog_OCAMLOPT if test -n "$OCAMLOPT"; then { $as_echo "$as_me:$LINENO: result: $OCAMLOPT" >&5 $as_echo "$OCAMLOPT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi OCAMLBEST=byte if test "$OCAMLOPT" = no ; then { $as_echo "$as_me:$LINENO: WARNING: Cannot find ocamlopt; bytecode compilation only." >&5 $as_echo "$as_me: WARNING: Cannot find ocamlopt; bytecode compilation only." >&2;} else { $as_echo "$as_me:$LINENO: checking ocamlopt version" >&5 $as_echo_n "checking ocamlopt version... " >&6; } TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVERSION" != "$OCAMLVERSION" ; then { $as_echo "$as_me:$LINENO: result: differs from ocamlc; ocamlopt discarded." >&5 $as_echo "differs from ocamlc; ocamlopt discarded." >&6; } OCAMLOPT=no else { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } OCAMLBEST=opt fi fi # checking for ocamlc.opt # Extract the first word of "ocamlc.opt", so it can be a program name with args. set dummy ocamlc.opt; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OCAMLCDOTOPT+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OCAMLCDOTOPT"; then ac_cv_prog_OCAMLCDOTOPT="$OCAMLCDOTOPT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OCAMLCDOTOPT="ocamlc.opt" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLCDOTOPT" && ac_cv_prog_OCAMLCDOTOPT="no" fi fi OCAMLCDOTOPT=$ac_cv_prog_OCAMLCDOTOPT if test -n "$OCAMLCDOTOPT"; then { $as_echo "$as_me:$LINENO: result: $OCAMLCDOTOPT" >&5 $as_echo "$OCAMLCDOTOPT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLCDOTOPT" != no ; then { $as_echo "$as_me:$LINENO: checking ocamlc.opt version" >&5 $as_echo_n "checking ocamlc.opt version... " >&6; } TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVERSION" != "$OCAMLVERSION" ; then { $as_echo "$as_me:$LINENO: result: differs from ocamlc; ocamlc.opt discarded." >&5 $as_echo "differs from ocamlc; ocamlc.opt discarded." >&6; } else { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } OCAMLC=$OCAMLCDOTOPT fi fi # checking for ocamlopt.opt if test "$OCAMLOPT" != no ; then # Extract the first word of "ocamlopt.opt", so it can be a program name with args. set dummy ocamlopt.opt; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OCAMLOPTDOTOPT+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OCAMLOPTDOTOPT"; then ac_cv_prog_OCAMLOPTDOTOPT="$OCAMLOPTDOTOPT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OCAMLOPTDOTOPT="ocamlopt.opt" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLOPTDOTOPT" && ac_cv_prog_OCAMLOPTDOTOPT="no" fi fi OCAMLOPTDOTOPT=$ac_cv_prog_OCAMLOPTDOTOPT if test -n "$OCAMLOPTDOTOPT"; then { $as_echo "$as_me:$LINENO: result: $OCAMLOPTDOTOPT" >&5 $as_echo "$OCAMLOPTDOTOPT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLOPTDOTOPT" != no ; then { $as_echo "$as_me:$LINENO: checking ocamlc.opt version" >&5 $as_echo_n "checking ocamlc.opt version... " >&6; } TMPVER=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVER" != "$OCAMLVERSION" ; then { $as_echo "$as_me:$LINENO: result: differs from ocamlc; ocamlopt.opt discarded." >&5 $as_echo "differs from ocamlc; ocamlopt.opt discarded." >&6; } else { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } OCAMLOPT=$OCAMLOPTDOTOPT fi fi fi # ocamldep, ocamllex and ocamlyacc should also be present in the path # Extract the first word of "ocamldep", so it can be a program name with args. set dummy ocamldep; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OCAMLDEP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OCAMLDEP"; then ac_cv_prog_OCAMLDEP="$OCAMLDEP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OCAMLDEP="ocamldep" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLDEP" && ac_cv_prog_OCAMLDEP="no" fi fi OCAMLDEP=$ac_cv_prog_OCAMLDEP if test -n "$OCAMLDEP"; then { $as_echo "$as_me:$LINENO: result: $OCAMLDEP" >&5 $as_echo "$OCAMLDEP" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLDEP" = no ; then { { $as_echo "$as_me:$LINENO: error: Cannot find ocamldep." >&5 $as_echo "$as_me: error: Cannot find ocamldep." >&2;} { (exit 1); exit 1; }; } else # Extract the first word of "ocamldep.opt", so it can be a program name with args. set dummy ocamldep.opt; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OCAMLDEPDOTOPT+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OCAMLDEPDOTOPT"; then ac_cv_prog_OCAMLDEPDOTOPT="$OCAMLDEPDOTOPT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OCAMLDEPDOTOPT="ocamldep.opt" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLDEPDOTOPT" && ac_cv_prog_OCAMLDEPDOTOPT="no" fi fi OCAMLDEPDOTOPT=$ac_cv_prog_OCAMLDEPDOTOPT if test -n "$OCAMLDEPDOTOPT"; then { $as_echo "$as_me:$LINENO: result: $OCAMLDEPDOTOPT" >&5 $as_echo "$OCAMLDEPDOTOPT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLDEPDOTOPT" != no ; then OCAMLDEP=$OCAMLDEPDOTOPT fi fi # Extract the first word of "ocamllex", so it can be a program name with args. set dummy ocamllex; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OCAMLLEX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OCAMLLEX"; then ac_cv_prog_OCAMLLEX="$OCAMLLEX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OCAMLLEX="ocamllex" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLLEX" && ac_cv_prog_OCAMLLEX="no" fi fi OCAMLLEX=$ac_cv_prog_OCAMLLEX if test -n "$OCAMLLEX"; then { $as_echo "$as_me:$LINENO: result: $OCAMLLEX" >&5 $as_echo "$OCAMLLEX" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLLEX" = no ; then { { $as_echo "$as_me:$LINENO: error: Cannot find ocamllex." >&5 $as_echo "$as_me: error: Cannot find ocamllex." >&2;} { (exit 1); exit 1; }; } else # Extract the first word of "ocamllex.opt", so it can be a program name with args. set dummy ocamllex.opt; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OCAMLLEXDOTOPT+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OCAMLLEXDOTOPT"; then ac_cv_prog_OCAMLLEXDOTOPT="$OCAMLLEXDOTOPT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OCAMLLEXDOTOPT="ocamllex.opt" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLLEXDOTOPT" && ac_cv_prog_OCAMLLEXDOTOPT="no" fi fi OCAMLLEXDOTOPT=$ac_cv_prog_OCAMLLEXDOTOPT if test -n "$OCAMLLEXDOTOPT"; then { $as_echo "$as_me:$LINENO: result: $OCAMLLEXDOTOPT" >&5 $as_echo "$OCAMLLEXDOTOPT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLLEXDOTOPT" != no ; then OCAMLLEX=$OCAMLLEXDOTOPT fi fi # Extract the first word of "ocamlyacc", so it can be a program name with args. set dummy ocamlyacc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OCAMLYACC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OCAMLYACC"; then ac_cv_prog_OCAMLYACC="$OCAMLYACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OCAMLYACC="ocamlyacc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLYACC" && ac_cv_prog_OCAMLYACC="no" fi fi OCAMLYACC=$ac_cv_prog_OCAMLYACC if test -n "$OCAMLYACC"; then { $as_echo "$as_me:$LINENO: result: $OCAMLYACC" >&5 $as_echo "$OCAMLYACC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "$OCAMLYACC" = no ; then { { $as_echo "$as_me:$LINENO: error: Cannot find ocamlyacc." >&5 $as_echo "$as_me: error: Cannot find ocamlyacc." >&2;} { (exit 1); exit 1; }; } fi # checking for lablgtk2 as_ac_File=`$as_echo "ac_cv_file_$OCAMLLIB/lablgtk2/lablgtk.cma" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $OCAMLLIB/lablgtk2/lablgtk.cma" >&5 $as_echo_n "checking for $OCAMLLIB/lablgtk2/lablgtk.cma... " >&6; } if { as_var=$as_ac_File; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && { { $as_echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 $as_echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} { (exit 1); exit 1; }; } if test -r "$OCAMLLIB/lablgtk2/lablgtk.cma"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi ac_res=`eval 'as_val=${'$as_ac_File'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_File'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then LABLGTK2=yes else LABLGTK2=no fi # AC_CHECK_PROG(LABLGTK2,lablgtk2,yes,no) not always available (Win32) if test "$LABLGTK2" = yes ; then INCLUDEGTK2="-I +lablgtk2" fi # checking for cairo as_ac_File=`$as_echo "ac_cv_file_$OCAMLLIB/cairo/cairo.cmxa" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $OCAMLLIB/cairo/cairo.cmxa" >&5 $as_echo_n "checking for $OCAMLLIB/cairo/cairo.cmxa... " >&6; } if { as_var=$as_ac_File; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else test "$cross_compiling" = yes && { { $as_echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 $as_echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} { (exit 1); exit 1; }; } if test -r "$OCAMLLIB/cairo/cairo.cmxa"; then eval "$as_ac_File=yes" else eval "$as_ac_File=no" fi fi ac_res=`eval 'as_val=${'$as_ac_File'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_File'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then CAIRO=yes else CAIRO=no fi if test "$CAIRO" = yes ; then INCLUDECAIRO="-I +cairo" fi if test "$LABLGTK2" = yes && test "$CAIRO" = yes ; then GUIOPT=gui.opt else { $as_echo "$as_me:$LINENO: WARNING: Missing lablgtk2 or cairo; the GUI will not be compiled" >&5 $as_echo "$as_me: WARNING: Missing lablgtk2 or cairo; the GUI will not be compiled" >&2;} GUIOPT= fi # Extract the first word of "ocamlweb", so it can be a program name with args. set dummy ocamlweb; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_OCAMLWEB+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$OCAMLWEB"; then ac_cv_prog_OCAMLWEB="$OCAMLWEB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_OCAMLWEB="ocamlweb" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_OCAMLWEB" && ac_cv_prog_OCAMLWEB="true" fi fi OCAMLWEB=$ac_cv_prog_OCAMLWEB if test -n "$OCAMLWEB"; then { $as_echo "$as_me:$LINENO: result: $OCAMLWEB" >&5 $as_echo "$OCAMLWEB" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # platform { $as_echo "$as_me:$LINENO: checking platform" >&5 $as_echo_n "checking platform... " >&6; } echo "print_endline Sys.os_type" > check_arch.ml if ocaml check_arch.ml | grep -q Win32; then { $as_echo "$as_me:$LINENO: result: Win32" >&5 $as_echo "Win32" >&6; } OCAMLWIN32=yes EXE=.exe else OCAMLWIN32=no EXE= fi rm -f check_arch.ml # substitutions to perform # Finally create the Makefile from Makefile.in ac_config_files="$ac_config_files 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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$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= ;; #( *) $as_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+set}" = set || &/ 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 test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 $as_echo "$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}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= 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=`$as_echo "$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. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF || ac_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} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible 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 # PATH needs CR # 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_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. 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 # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&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 $as_me, which was generated by GNU Autoconf 2.63. 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 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTION]... [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, 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 Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.63, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2008 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' 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=$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 ) $as_echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$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_echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$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 \$as_echo "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 $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _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 "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 $as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; 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+set}" = set || CONFIG_FILES=$config_files 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= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { $as_echo "$as_me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # 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=' ' 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 {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } 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 >>"\$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 >>"\$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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 $as_echo "$as_me: error: could not setup config files machinery" >&2;} { (exit 1); exit 1; }; } _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ 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[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " 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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} { (exit 1); exit 1; }; };; :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac ac_file_inputs="$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 '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; 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 || $as_echo 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" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$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 || $as_echo 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$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 # _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@*) { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$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 $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$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 "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 $as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } # 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 || { (exit 1); exit 1; } fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi chmod a-w Makefile ocamlviz/config.status0000755000175000017500000005533511246704175015017 0ustar tonkartonkar#! /bin/bash # Generated by configure. # 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-/bin/bash} ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible 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 # PATH needs CR # 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_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. 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 # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. 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 $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # Required to use basename. 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 # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' 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" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # 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 } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&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 $as_me, which was generated by GNU Autoconf 2.63. 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` " # Files that config.status was made for. config_files=" Makefile" ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTION]... [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, 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 Configuration files: $config_files Report bugs to ." ac_cs_version="\ config.status configured by ./configure, generated by GNU Autoconf 2.63, with options \"\" Copyright (C) 2008 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='/users/demons/gvt/ocamlviz' srcdir='.' test -n "$AWK" || AWK=awk # 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=$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 ) $as_echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$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_echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$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 if $ac_cs_recheck; then set X '/bin/bash' './configure' $ac_configure_extra_args --no-create --no-recursion shift $as_echo "running CONFIG_SHELL=/bin/bash $*" >&6 CONFIG_SHELL='/bin/bash' export CONFIG_SHELL exec "$@" fi exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 $as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; 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+set}" = set || CONFIG_FILES=$config_files 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= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { $as_echo "$as_me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # 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=' ' 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 {' >"$tmp/subs1.awk" && cat >>"$tmp/subs1.awk" <<\_ACAWK && S["LTLIBOBJS"]="" S["LIBOBJS"]="" S["EXE"]="" S["OCAMLWIN32"]="no" S["GUIOPT"]="gui.opt" S["INCLUDECAIRO"]="-I +cairo" S["CAIRO"]="yes" S["INCLUDEGTK2"]="-I +lablgtk2" S["LABLGTK2"]="yes" S["OCAMLLIB"]="/usr/lib/ocaml/3.10.2" S["OCAMLVERSION"]="3.10.2" S["OCAMLBEST"]="opt" S["OCAMLWEB"]="true" S["OCAMLYACC"]="ocamlyacc" S["OCAMLLEXDOTOPT"]="ocamllex.opt" S["OCAMLLEX"]="ocamllex.opt" S["OCAMLDEPDOTOPT"]="ocamldep.opt" S["OCAMLDEP"]="ocamldep.opt" S["OCAMLOPTDOTOPT"]="ocamlopt.opt" S["OCAMLCDOTOPT"]="ocamlc.opt" S["OCAMLOPT"]="ocamlopt.opt" S["OCAMLC"]="ocamlc.opt" S["target_alias"]="" S["host_alias"]="" S["build_alias"]="" S["LIBS"]="" S["ECHO_T"]="" S["ECHO_N"]="-n" S["ECHO_C"]="" S["DEFS"]="-DPACKAGE_NAME=\\\"\\\" -DPACKAGE_TARNAME=\\\"\\\" -DPACKAGE_VERSION=\\\"\\\" -DPACKAGE_STRING=\\\"\\\" -DPACKAGE_BUGREPORT=\\\"\\\"" S["mandir"]="${datarootdir}/man" S["localedir"]="${datarootdir}/locale" S["libdir"]="${exec_prefix}/lib" S["psdir"]="${docdir}" S["pdfdir"]="${docdir}" S["dvidir"]="${docdir}" S["htmldir"]="${docdir}" S["infodir"]="${datarootdir}/info" S["docdir"]="${datarootdir}/doc/${PACKAGE}" S["oldincludedir"]="/usr/include" S["includedir"]="${prefix}/include" S["localstatedir"]="${prefix}/var" S["sharedstatedir"]="${prefix}/com" S["sysconfdir"]="${prefix}/etc" S["datadir"]="${datarootdir}" S["datarootdir"]="${prefix}/share" S["libexecdir"]="${exec_prefix}/libexec" S["sbindir"]="${exec_prefix}/sbin" S["bindir"]="${exec_prefix}/bin" S["program_transform_name"]="s,x,x," S["prefix"]="/usr/local" S["exec_prefix"]="${prefix}" S["PACKAGE_BUGREPORT"]="" S["PACKAGE_STRING"]="" S["PACKAGE_VERSION"]="" S["PACKAGE_TARNAME"]="" S["PACKAGE_NAME"]="" S["PATH_SEPARATOR"]=":" S["SHELL"]="/bin/bash" _ACAWK cat >>"$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 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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 $as_echo "$as_me: error: could not setup config files machinery" >&2;} { (exit 1); exit 1; }; } fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " 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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} { (exit 1); exit 1; }; };; :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac ac_file_inputs="$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 '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; 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 || $as_echo 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" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$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 || $as_echo 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$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 # # 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@*) { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} ac_datarootdir_hack=' s&@datadir@&${datarootdir}&g s&@docdir@&${datarootdir}/doc/${PACKAGE}&g s&@infodir@&${datarootdir}/info&g s&@localedir@&${datarootdir}/locale&g s&@mandir@&${datarootdir}/man&g s&\${datarootdir}&${prefix}/share&g' ;; esac ac_sed_extra="/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// } :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 $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$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 "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; esac done # for ac_tag { (exit 0); exit 0; } ocamlviz/configure.in0000644000175000017500000001445011243250026014570 0ustar tonkartonkar########################################################################## # # # Ocamlviz --- real-time profiling tools for Objective Caml # # Copyright (C) by INRIA - CNRS - Universite Paris Sud # # Authors: Julien Robert # # Guillaume Von Tokarski # # Sylvain Conchon # # Jean-Christophe Filliatre # # Fabrice Le Fessant # # GNU Library General Public License version 2 # # See file LICENSE for details # # # ########################################################################## # # autoconf input for Objective Caml programs # Copyright (C) 2001 Jean-Christophe Filliâtre # from a first script by Georges Mariano # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License version 2, as published by the Free Software Foundation. # # This library 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 Library General Public License version 2 for more details # (enclosed in the file LGPL). # the script generated by autoconf from this input will set the following # variables: # OCAMLC "ocamlc" if present in the path, or a failure # or "ocamlc.opt" if present with same version number as ocamlc # OCAMLOPT "ocamlopt" (or "ocamlopt.opt" if present), or "no" # OCAMLBEST either "byte" if no native compiler was found, # or "opt" otherwise # OCAMLDEP "ocamldep" # OCAMLLEX "ocamllex" (or "ocamllex.opt" if present) # OCAMLYACC "ocamlyac" # OCAMLLIB the path to the ocaml standard library # OCAMLVERSION the ocaml version number # OCAMLWEB "ocamlweb" (not mandatory) # OCAMLWIN32 "yes"/"no" depending on Sys.os_type = "Win32" # EXE ".exe" if OCAMLWIN32=yes, "" otherwise # check for one particular file of the sources # ADAPT THE FOLLOWING LINE TO YOUR SOURCES! AC_INIT(src/ocamlviz.ml) # Check for Ocaml compilers # we first look for ocamlc in the path; if not present, we fail AC_CHECK_PROG(OCAMLC,ocamlc,ocamlc,no) if test "$OCAMLC" = no ; then AC_MSG_ERROR(Cannot find ocamlc.) fi # we extract Ocaml version number and library path OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` echo "ocaml version is $OCAMLVERSION" OCAMLLIB=`$OCAMLC -v | tail -1 | cut -f 4 -d " "` echo "ocaml library path is $OCAMLLIB" # then we look for ocamlopt; if not present, we issue a warning # if the version is not the same, we also discard it # we set OCAMLBEST to "opt" or "byte", whether ocamlopt is available or not AC_CHECK_PROG(OCAMLOPT,ocamlopt,ocamlopt,no) OCAMLBEST=byte if test "$OCAMLOPT" = no ; then AC_MSG_WARN(Cannot find ocamlopt; bytecode compilation only.) else AC_MSG_CHECKING(ocamlopt version) TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVERSION" != "$OCAMLVERSION" ; then AC_MSG_RESULT(differs from ocamlc; ocamlopt discarded.) OCAMLOPT=no else AC_MSG_RESULT(ok) OCAMLBEST=opt fi fi # checking for ocamlc.opt AC_CHECK_PROG(OCAMLCDOTOPT,ocamlc.opt,ocamlc.opt,no) if test "$OCAMLCDOTOPT" != no ; then AC_MSG_CHECKING(ocamlc.opt version) TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVERSION" != "$OCAMLVERSION" ; then AC_MSG_RESULT(differs from ocamlc; ocamlc.opt discarded.) else AC_MSG_RESULT(ok) OCAMLC=$OCAMLCDOTOPT fi fi # checking for ocamlopt.opt if test "$OCAMLOPT" != no ; then AC_CHECK_PROG(OCAMLOPTDOTOPT,ocamlopt.opt,ocamlopt.opt,no) if test "$OCAMLOPTDOTOPT" != no ; then AC_MSG_CHECKING(ocamlc.opt version) TMPVER=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version *\(.*\)$|\1|p' ` if test "$TMPVER" != "$OCAMLVERSION" ; then AC_MSG_RESULT(differs from ocamlc; ocamlopt.opt discarded.) else AC_MSG_RESULT(ok) OCAMLOPT=$OCAMLOPTDOTOPT fi fi fi # ocamldep, ocamllex and ocamlyacc should also be present in the path AC_CHECK_PROG(OCAMLDEP,ocamldep,ocamldep,no) if test "$OCAMLDEP" = no ; then AC_MSG_ERROR(Cannot find ocamldep.) else AC_CHECK_PROG(OCAMLDEPDOTOPT,ocamldep.opt,ocamldep.opt,no) if test "$OCAMLDEPDOTOPT" != no ; then OCAMLDEP=$OCAMLDEPDOTOPT fi fi AC_CHECK_PROG(OCAMLLEX,ocamllex,ocamllex,no) if test "$OCAMLLEX" = no ; then AC_MSG_ERROR(Cannot find ocamllex.) else AC_CHECK_PROG(OCAMLLEXDOTOPT,ocamllex.opt,ocamllex.opt,no) if test "$OCAMLLEXDOTOPT" != no ; then OCAMLLEX=$OCAMLLEXDOTOPT fi fi AC_CHECK_PROG(OCAMLYACC,ocamlyacc,ocamlyacc,no) if test "$OCAMLYACC" = no ; then AC_MSG_ERROR(Cannot find ocamlyacc.) fi # checking for lablgtk2 AC_CHECK_FILE($OCAMLLIB/lablgtk2/lablgtk.cma,LABLGTK2=yes,LABLGTK2=no) # AC_CHECK_PROG(LABLGTK2,lablgtk2,yes,no) not always available (Win32) if test "$LABLGTK2" = yes ; then INCLUDEGTK2="-I +lablgtk2" fi # checking for cairo AC_CHECK_FILE($OCAMLLIB/cairo/cairo.cmxa,CAIRO=yes,CAIRO=no) if test "$CAIRO" = yes ; then INCLUDECAIRO="-I +cairo" fi if test "$LABLGTK2" = yes && test "$CAIRO" = yes ; then GUIOPT=gui.opt else AC_MSG_WARN(Missing lablgtk2 or cairo; the GUI will not be compiled) GUIOPT= fi AC_CHECK_PROG(OCAMLWEB,ocamlweb,ocamlweb,true) # platform AC_MSG_CHECKING(platform) echo "print_endline Sys.os_type" > check_arch.ml if ocaml check_arch.ml | grep -q Win32; then AC_MSG_RESULT(Win32) OCAMLWIN32=yes EXE=.exe else OCAMLWIN32=no EXE= fi rm -f check_arch.ml # substitutions to perform AC_SUBST(OCAMLC) AC_SUBST(OCAMLOPT) AC_SUBST(OCAMLDEP) AC_SUBST(OCAMLLEX) AC_SUBST(OCAMLYACC) AC_SUBST(OCAMLBEST) AC_SUBST(OCAMLVERSION) AC_SUBST(OCAMLLIB) AC_SUBST(LABLGTK2) AC_SUBST(INCLUDEGTK2) AC_SUBST(CAIRO) AC_SUBST(INCLUDECAIRO) AC_SUBST(GUIOPT) AC_SUBST(OCAMLWEB) AC_SUBST(OCAMLWIN32) AC_SUBST(EXE) # Finally create the Makefile from Makefile.in AC_OUTPUT(Makefile) chmod a-w Makefile ocamlviz/INSTALL.txt0000644000175000017500000000050611245700037014127 0ustar tonkartonkarINSTALLATION INSTRUCTIONS ------------------------- DEPENDENCIES: ------------- You need the Cairo package to be installed. BUILDING: --------- 1. Run "autoconf" in the root directory of ocamlviz, to generate the configuration script 2. Run "./configure", to generate the Makefile 3. Run "make" to build the software ocamlviz/LICENSE0000644000175000017500000006342311220402071013262 0ustar tonkartonkarThis software is distributed under the terms of the GNU Library General Public License version 2 (included below). As a special exception to the GNU Library General Public License, you may link, statically or dynamically, a "work that uses the Library" with a publicly distributed version of the Library to produce an executable file containing portions of the Library, and distribute that executable file under terms of your choice, without any of the additional requirements listed in clause 6 of the GNU Library General Public License. By "a publicly distributed version of the Library", we mean either the unmodified Library as distributed, or a modified version of the Library that is distributed under the conditions defined in clause 3 of the GNU Library General Public License. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU Library General Public License. ====================================================================== GNU LIBRARY GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1991 Free Software Foundation, Inc. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the library GPL. It is numbered 2 because it goes with version 2 of the ordinary GPL.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Library General Public License, applies to some specially designated Free Software Foundation software, and to any other libraries whose authors decide to use it. You can use it for your libraries, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library, or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link a program with the library, you must provide complete object files to the recipients so that they can relink them with the library, after making changes to the library and recompiling it. And you must show them these terms so they know their rights. Our method of protecting your rights has two steps: (1) copyright the library, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the library. Also, for each distributor's protection, we want to make certain that everyone understands that there is no warranty for this free library. If the library is modified by someone else and passed on, we want its recipients to know that what they have is not the original version, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that companies distributing free software will individually obtain patent licenses, thus in effect transforming the program into proprietary software. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License, which was designed for utility programs. This license, the GNU Library General Public License, applies to certain designated libraries. This license is quite different from the ordinary one; be sure to read it in full, and don't assume that anything in it is the same as in the ordinary license. The reason we have a separate public license for some libraries is that they blur the distinction we usually make between modifying or adding to a program and simply using it. Linking a program with a library, without changing the library, is in some sense simply using the library, and is analogous to running a utility program or application program. However, in a textual and legal sense, the linked executable is a combined work, a derivative of the original library, and the ordinary General Public License treats it as such. Because of this blurred distinction, using the ordinary General Public License for libraries did not effectively promote software sharing, because most developers did not use the libraries. We concluded that weaker conditions might promote sharing better. However, unrestricted linking of non-free programs would deprive the users of those programs of all benefit from the free status of the libraries themselves. This Library General Public License is intended to permit developers of non-free programs to use free libraries, while preserving your freedom as a user of such programs to change the free libraries that are incorporated in them. (We have not seen how to achieve this as regards changes in header files, but we have achieved it as regards changes in the actual functions of the Library.) The hope is that this will lead to faster development of free libraries. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, while the latter only works together with the library. Note that it is possible for a library to be covered by the ordinary General Public License rather than by this special one. GNU LIBRARY GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Library General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also compile or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. c) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. d) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Library General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! ocamlviz/README0000644000175000017500000000174111243250026013136 0ustar tonkartonkar************************************************************************** * * * Ocamlviz --- real-time profiling tools for Objective Caml * * Copyright (C) by INRIA - CNRS - Universite Paris Sud * * Authors: Julien Robert * * Guillaume Von Tokarski * * Sylvain Conchon * * Jean-Christophe Filliatre * * Fabrice Le Fessant * * GNU Library General Public License version 2 * * See file LICENSE for details * * * ************************************************************************** This is Ocamlviz ocamlviz/Makefile.in0000644000175000017500000001724011251433177014335 0ustar tonkartonkar########################################################################## # # # Ocamlviz --- real-time profiling tools for Objective Caml # # Copyright (C) by INRIA - CNRS - Universite Paris Sud # # Authors: Julien Robert # # Guillaume Von Tokarski # # Sylvain Conchon # # Jean-Christophe Filliatre # # Fabrice Le Fessant # # GNU Library General Public License version 2 # # See file LICENSE for details # # # ########################################################################## # # sample Makefile for Objective Caml # Copyright (C) 2001 Jean-Christophe FILLIATRE # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Library General Public # License version 2, as published by the Free Software Foundation. # # This library 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 Library General Public License version 2 for more details # (enclosed in the file LGPL). # where to install the binaries prefix=@prefix@ exec_prefix=@exec_prefix@ BINDIR=@bindir@ # where to install the man page MANDIR=@mandir@ # other variables set by ./configure OCAMLC = @OCAMLC@ OCAMLOPT = @OCAMLOPT@ OCAMLDEP = @OCAMLDEP@ OCAMLLEX = @OCAMLLEX@ OCAMLYACC= @OCAMLYACC@ OCAMLLIB = @OCAMLLIB@ OCAMLBEST= @OCAMLBEST@ OCAMLVERSION = @OCAMLVERSION@ OCAMLWEB = @OCAMLWEB@ OCAMLWIN32 = @OCAMLWIN32@ EXE = @EXE@ INCLUDES = -I src -I +threads @INCLUDEGTK2@ @INCLUDECAIRO@ BFLAGS = -g -dtypes $(INCLUDES) OFLAGS = -dtypes $(INCLUDES) # main target ############# NAME = ocamlviz all: $(OCAMLBEST) byte: ascii.byte libocamlviz.cma camlp4/pa_ocamlviz.cmo opt: ascii.opt libocamlviz.cma libocamlviz.cmxa camlp4/pa_ocamlviz.cmo @GUIOPT@ # bytecode and native-code compilation ###################################### GENERATED = src/version.ml src/preflexer.ml PROTOCOLCMO = src/binary.cmo src/bproto.cmo PROTOCOLCMX = $(PROTOCOLCMO:.cmo=.cmx) OCAMLVIZCMO = $(PROTOCOLCMO) src/monitor_impl.cmo src/ocamlviz.cmo src/ocamlviz_threads.cmo OCAMLVIZCMX = $(OCAMLVIZCMO:.cmo=.cmx) LIBOCAMLVIZ = libocamlviz.cmxa LIBOCAMLVIZBYTE = libocamlviz.cma $(LIBOCAMLVIZ): $(OCAMLVIZCMX) $(OCAMLOPT) -a $(OFLAGS) -o $@ $^ $(LIBOCAMLVIZBYTE): $(OCAMLVIZCMO) $(OCAMLC) -a $(BFLAGS) -thread -o $@ threads.cma $^ CLIENTCMO = $(PROTOCOLCMO) src/timemap.cmo src/db.cmo src/options.cmo src/net.cmo CLIENTCMX = $(CLIENTCMO:.cmo=.cmx) ASCIICMO = $(CLIENTCMO) src/ascii.cmo ASCIICMX = $(ASCIICMO:.cmo=.cmx) ascii.byte: $(ASCIICMO) $(OCAMLC) -thread $(BFLAGS) -o $@ unix.cma threads.cma $^ ascii.opt: $(ASCIICMX) $(OCAMLOPT) -thread $(OFLAGS) -o $@ unix.cmxa threads.cmxa $^ TREEPANELCMO = $(CLIENTCMO) src/dot.cmo src/tree_panel.cmo TREEPANELCMX = $(TREEPANELCMO:.cmo=.cmx) GUICMO = $(TREEPANELCMO) src/graph.cmo src/preflexer.cmo src/gui_misc.cmo src/gui_models.cmo src/gui_views.cmo src/gui_pref.cmo src/gui.cmo GUICMX = $(GUICMO:.cmo=.cmx) gui.byte: $(GUICMO) $(OCAMLC) $(BFLAGS) -o $@ lablgtk.cma gtkInit.cma unix.cma $^ gui.opt: $(GUICMX) $(OCAMLOPT) $(OFLAGS) -o $@ unix.cmxa threads.cmxa lablgtk.cmxa cairo.cmxa cairo_lablgtk.cmxa gtkThread.cmx $^ camlp4/pa_ocamlviz.cmo: camlp4/pa_ocamlviz.ml ocamlc -c -dtypes -I +camlp4 -I +str -pp camlp4of str.cma $^ tests/pa-%.ml: tests/%.ml camlp4/pa_ocamlviz.cmo camlp4 pa_o.cmo str.cma camlp4/pa_ocamlviz.cmo pr_o.cmo tests/$*.ml -o tests/pa-$*.ml test-%: tests/%.opt gui.opt xterm -e "tests/$*.opt 100" & sleep 1 && ./gui.opt test-%-byte: tests/%.byte gui.opt xterm -e "tests/$*.byte 100" & sleep 1 && ./gui.opt ascii-%: tests/%.opt ascii.opt xterm -e "tests/$*.opt 100" & sleep 1 && ./ascii.opt tests/%.opt: $(LIBOCAMLVIZ) tests/%.ml $(OCAMLOPT) -thread $(OFLAGS) -o $@ unix.cmxa threads.cmxa $^ tests/%.byte: $(LIBOCAMLVIZBYTE) tests/%.ml $(OCAMLC) -thread -I src -o $@ unix.cma threads.cma $^ VERSION=0.1 src/version.ml: Makefile echo "let version = \""$(VERSION)"\"" > $@ echo "let date = \""`date`"\"" >> $@ # installation ############## install-indep: mkdir -p $(BINDIR) mkdir -p $(MANDIR)/man1 cp -f doc/ocamlviz.1 $(MANDIR)/man1/ocamlviz.1 install: install-indep install-$(OCAMLBEST) cp -f src/ocamlviz.mli src/ocamlviz.cmi src/ocamlviz_threads.cmi $(OCAMLLIB) cp -f libocamlviz.cma $(OCAMLLIB) cp -f camlp4/pa_ocamlviz.cmi camlp4/pa_ocamlviz.cmo $(OCAMLLIB)/camlp4 cp -f ascii.$(OCAMLBEST) $(BINDIR)/ocamlviz-ascii install-byte: install-opt: cp -f libocamlviz.cmxa libocamlviz.a $(OCAMLLIB) cp -f gui.$(OCAMLBEST) $(BINDIR)/ocamlviz-gui # documentation ############### DOCFILES=doc/index.html .PHONY: doc/index.html .PHONY: doc/manual.pdf doc: $(DOCFILES) # OCAMLDOCFILES=$(filter-out src/monitor_sig.mli, $(wildcard src/*.mli)) OCAMLDOCFILES=src/*.mli doc/index.html: ocamldoc -html -d doc -I src -I +lablgtk2 $(OCAMLDOCFILES) doc/manual.pdf: doc/manual.tex cd doc && mlpost -native -latex manual.tex -pdf fig.ml && pdflatex manual.tex wc: ocamlwc src/*.ml* tests/*.ml* www/*.html -p # export ######## EXPORTDIR=$(NAME)-$(VERSION) TAR=$(EXPORTDIR).tar FTP = $$HOME/ftp/$(NAME) WWW = $$HOME/WWW/$(NAME) FILES = *.ml* $(NAME).1 manual.tex \ Makefile.in configure configure.in \ .depend README INSTALL COPYING GPL CHANGES # literate programming ###################### SOURCES = $(NAME).tex: $(SOURCES) $(OCAMLWEB) -o $@ $^ # generic rules ############### .SUFFIXES: .mli .ml .cmi .cmo .cmx .mll .mly .tex .dvi .ps .html .mli.cmi: $(OCAMLC) -c $(BFLAGS) $< .ml.cmo: $(OCAMLC) -c $(BFLAGS) $< .ml.o: $(OCAMLOPT) -c $(OFLAGS) $< .ml.cmx: $(OCAMLOPT) -c $(OFLAGS) $< .mll.ml: $(OCAMLLEX) $< .mly.ml: $(OCAMLYACC) -v $< .mly.mli: $(OCAMLYACC) -v $< .tex.dvi: latex $< && latex $< .dvi.ps: dvips $< -o $@ .tex.html: hevea $< # Emacs tags ############ tags: find . -name "*.ml*" | sort -r | xargs \ etags "--regex=/let[ \t]+\([^ \t]+\)/\1/" \ "--regex=/let[ \t]+rec[ \t]+\([^ \t]+\)/\1/" \ "--regex=/and[ \t]+\([^ \t]+\)/\1/" \ "--regex=/type[ \t]+\([^ \t]+\)/\1/" \ "--regex=/exception[ \t]+\([^ \t]+\)/\1/" \ "--regex=/val[ \t]+\([^ \t]+\)/\1/" \ "--regex=/module[ \t]+\([^ \t]+\)/\1/" # file headers ############## headers: headache -c doc/headache_config.txt -h doc/header.txt \ Makefile.in configure.in README \ */*.ml */*.ml[ily4] doc/*.tex # Makefile is rebuilt whenever Makefile.in or configure.in is modified ###################################################################### Makefile: Makefile.in config.status ./config.status config.status: configure ./config.status --recheck configure: configure.in autoconf # clean ####### clean:: rm -f src/*.cm[iox] src/*.o src/*~ src/*.annot rm -f tests/*.cm[iox] tests/*.o tests/*~ tests/*.annot tests/*.byte tests/*.opt rm -f $(GENERATED) rm -f *.byte *.opt rm -f libocamlviz.* rm -f doc/*.html doc/*mps doc/*.aux doc/*.bbl doc/*.blg rm -f doc/*.log doc/*.toc doc/*.vrb doc/*.snm doc.*.out doc/*.nav dist-clean distclean:: clean rm -f Makefile config.cache config.log config.status # depend ######## dep: ocamldep -I src src/*.ml src/*.mli | ocamldot | dot -Tps | gv - .depend depend:: $(GENERATED) rm -f .depend $(OCAMLDEP) $(INCLUDES) src/*.ml src/*.mli > .depend include .depend ocamlviz/doc/hash2.png0000644000175000017500000012522511251431726014551 0ustar tonkartonkar‰PNG  IHDR{YŸ¼»=sRGB®Îé pHYs  šœtIMEÙ.è ±° IDATxÚìy\ ÝÇÏÜ{ë¶—ö e/¤H";ÙwB$)K’”ˆ²d«d—%e-ËãùáA²”=$”Т}×r·™ßÃ}®»µh»·ïû5/f¾sæ{Îùžsf>Y.F€ƒ!@q 8'ŠBh@šÇYx·þÆ4:öúßT¡i0ø< ‰tëoÎÆBÆ„áü¿Ð¾•¿Œ2bëÍÿ1qÚ! œ[‚šÖ¡Zcm‰ ¬²ò”¯Cîâ¶&™€d+NqXûT‡…8"¯qB½¥Ü÷½ÌC•kå­ð £ð “ï@2 ucYucº(o!œ1*Ù 8É·lÄ;Á‰baXrjj¾!Ñ¥¨È°T#M¾`nÍ.+Ó¯’¤iqOþÕìŒUŒì¹ŒáÇÕï@©áéŽJËeò51ÖŠo7°Ö#ˆºå^g·5Ì$œƒÖÍ#,„ÿšGê`¡g'ò„ÛÛAK0±xoŸ˜¤·ÞZíª „R”r-ªºr¢¼!ÄÅ H¬âä Ÿžp¯|ʼn/ÌRä䆔™:•‹¥'dÑ*ó2B} Ôû aL”O dHkÕVQÿ+% bH é·0Ã!ÂãÌç͸– ð’Ê‚ç©wO< ¨dþ@™XͶYÙV³3†°¤ïϯ½:úú[,÷Øi“§/ss××iUüåÈý ‰ñ|Î/,K&Wȇ´¦ííHnŠÊŽdÊÄiK]ÝZë·-®È»öêè×'„T†Egá8Òì/-eý¢ò¼ÞDD¿8B ¢Ú2€ÀÁp&Æ©ø“;×âüzòR˜7œ‰‰9VHâšy{v"¯—½6BèEd^¼!þk4(N@‚'þûlýM×!„Êq&“U\lÃhÃ,,ä; Cˆ]\ì¨<2Fîí섞¹¶p£ U~¶¯íóëŸ'Ž›¸yGe.%ü©E[>r—º’ö²µNÿþï¾Y7óÅ‹]ïÇÜW1¤þœ éÕgú‚±–Ýûí 8âÔgË‚'C”ô¨¼ž§ììxiE2BÈØÄ€´X8+ $2;2í°‘Žî3¬ ^ŽÃ}‹Ó˜±¹‘|eoî4wÀª›.úø¬vœ¹Ø}ÉÊâtæÝÌãCâË på‡ùgwÕ™äk‘Þ8L !d>U‡ïÀ×s„&ï­µ…ªùT×sB/"s¹vó©:F}TÙ•"Ë&ꤊÄë+†³„Ú¯……jŽƒaÂ#+k`«Ž·”^B)€ïUÐ߆ ‹zx(ã-S¥ íAâ „vô·¶ÆŸÕn]^V‘Éd~ýø]YG&µèÇú•Ål™!?/»öm/aüHHˆj­ßæË-fÇq ²*ÂsÑ颀ú‹t­EfG¦Ü´)¯$_ÍHæpÔö‘ÃÇLèéqJßJ†×Û¨³Bþ;YƵǧݗ¬˜ØÎq×0þ2¢ÊLWƒ^HÌ\ÉŸßU'8ˆ¼ü"ÿ¶éõ߇6Ó^”FÁÄâ½!„Z›©ö˜ “p5‡ké1A§M/UN¥¸²‘—iPœ€4À©ÄX¥Âí…gæ)•”Z«¨P)‚ 8!D¡P0„p‚x’ššÙºŒ…cF@ àÎ2 ÐNê½l=ŒÝMäé ä`jj­Êó9ÅÉĩۻç÷¼zá&Žs’3’ŽÝØñøñ£òŒŸÏPfçdkvÇd8! ÃØL¢8…hÕAäÉj˜RBÔ-EeG&ûž•ÙÊH†FǪÔrBúEÉ,eß§†².Bèþÿq-ú†Å_تz2¢Ê ¿p HÌ•« cU`Œ¢º_}X§êçåO¨7VFþËkj¬‰7ÞÃy7E%ãzC¿f[AqÒð·"„¿aP¦\k‘Œew1 ¨!O+--®¬TPSë@§S)6Ž—ÊË¿ÓJR9Ë(Èê™»Õ•µ–x;þ{ûQ“^}Æ0Œà¬(úɉðúÊí¬{Û¬ò\³rfðÔWVŠÚÿÝ¡¦Ò0žûr8‰qýÜ%&;}=-_QÓÓÑCe~Ïd³‰Ê‚ßÜæ—dé´2ìÝß<¿€çí U¢Ë /‚°A”ñNÜ/ývSâ„ôƒõS$±Þ2Þ•¼¿“Íky'Ût¸®‚ñzá' Ö‚0±ó,…teÍÜ´´,yù×­“»ÈS³dK«ªØN[5µ8˜¤ ÍîB¦ÈÉ¿üï%Úm•]Vü'ÙÈ÷¯Ó­¿y–”˜&‹bTU¥Ç1: ÿM¹RéüƒŽ—òª2E9å6­Û2P¹KLv$k¼ýv[×Jâ4jBèØ©0 Ù¿¹Ž;á2zíj¯µÎm#0¼‡‰åÌñóÜ7:âL‘e–Q‚ö$åÒÅóïïNhrÓẂ‰ök0Šð&NÈÖÒ[ÆÛÿä¦ép]nQŠÎîª"½!„„]gAq9nÅ+ÎÑŒŽ·ež•¨TY·þ$OOCÙù,•„ÂBŠ¡ŒI9e!Í6¿ Q¤éo0Av\ôtè¿6òDT^Aιû‡ywÝzy~Þp/³e"Þ~z¹qÃFD ²tBŒO¾Í³1ûíú¹ÆÜzŒ¿¡“øìHîܽºí|kÃ6E?ò‚n>qTYG–"û[škñ'r?–O=矓ñ,ã}Ú‹s7”3Œɉ*³FWxBqŠý\øŒâÓ ñ@©Æ›P [go¡®¶º­ÍTÉ•ÄÛÙÕzuRÅ HäõU¼â,©ª¢©`ou²‡VuÔû¡×*µWê(+{Z/ÆèGßÎM Þp$œ þÞF–óÜy _Ϻ0ª(ÉaàTy,âô©üO r׋Ï1_¾[’ÆdVàB49ŠªQø} Í‚$:þؾàÐÒïLG¡îöŠb²ãú¹µ¼˜Å®Â©2˜²Ž¬B+š‚6.1_/\XY^Àb3 “oEUP£•¤/(ÂËŒÁ- @r'9cÂGW[]1Ó+B„#¥‘¼©èÐIo†f?§3 ÍTI‹Š]Œ7Pœ€4 \á3ö\TåäÈ4YJ?:s4â(é_P®‘¼¢ <…RÓÊ*¤ A$ýŠÐoÃרnJ¥+˳* D Œ†ôº)âì_»ÚSeäØåˆ”ŒT¤ÜC~ŸB³ ÑîJSlEÃYˆ@(÷¡Ý “×¢.¯B(4¤¨‹äu0¾\ä5‘¶¹LEÃ@ކd0]qeI¹r N ¶î¡Z;Íʽü5¼7U]9¾Ï¼‹Éâ7oîªRô—¢ø‰Ô<ùBL =UýbWÒ׆Í$0v;55Œ‚îÊ&(1‚y@ Ð42kÁk¤« zW¾4?×eU‘º*V­O¡YÈkcòÚ¿YÄd'Æà^y $¯!$±¨2€d@A3j:ÛòóúÕœ½Á' MãV¼dü¦P2ˆi¬’)Õúݧ 3åìÒÒÔ¢"Ì:wâ€FÃPzjÖëuöžšÅ{¼ÙzÅ HÕ¸/ó?—Ç”}Å;«0[)É=Î{ÊfjhÐhXk„W2îɽÅ 4&¶º~3útÕªù{¥81‚€™’„¾‘Îø]¹Ÿ@( Âfà/Ž”}ÿšÃk„9N@»òŒYs@óDÈa@q’Gâ¥RH 8 £ƒA»—ŸçÿüÂííè³hrl'Î$Wr2¾:»z€â¤ ;§åhB¢Âw‹OŠ*”@ ÙŠàƒ ŠZr‚æPœÐ°‚Sâç»çÍûe³˜Ðš7h#ˆ ñ‘¾øƒâ¤Bqþº¯žô5þCÚ3oî”B¡ticibÔGTE€ºuÚ"ñšgüAqR2&H>¤=·µžN£Ê4óò²9¬ÛqQ&mûˆªP·@Ad >@óŒ?(N@*Fį»ê8ŽS(4œhþsœ4Ç€_ýÃ@Ad >@óŒ?í;ãÞb HÑ_a„d»a ߯¸cÚ—dø3¼…Ð,›Ú¨~"Ãm\iÔÐsšÉp®?Å©Î1†‡$iú#ŒÀ I,vMþšŒ8ùüÅ‹Ý;ƒ÷î )+û±vÍ*˜*h„¸ÁÌ„T–G¶í:}KýÔl#Ã[<î!äJS•zNKB}ÎqB[Òö70A „ºt²0À:4l†aÜ=]:Yø׬ÿt;_½zmÙ³"Ћ—¯fØMš¸mûN|–oŸ?5áLAÛöþ+@ýþ§qkÄêóCEE¥o+¿µkZ·6lЉ‰&o£C¡aAÁ;¼½<¹,hèR”••íܽ÷Ö;ÙÙ9ŠŠŠ}z[Îs˜kÓ¯ïÏ'šÇy@ C~ûüé·âý¾R/%çæ¨  `aÞcãz¿Ž:4}·ŸFÊý†” gñïØ¡Ãínp¯°5“ÿ)ΪŒÌ‚[wT-{*™uHšàü¯¯ã'W”U•OŸŽš5{oJîÞæVlQ–ß”Óë„ùŽ8¿z°u“¨Ä_?곩îf4B¾ ·F®>Y ‚ ;±ÈÕíúÕK o¶ŽãgÎøùú=vÂy#…BiÐb¸.[Þ¦MëȈ“úúzÅÅ%Oââöìé×ϺY;$_šÔdŽeeeÇOF,óðüûÚ•&ï6bri>·gÅ”D †³(oòòòÿÞ½7lØróÖ;Õº¢ADUzFö¹(fAÁ£¨‹4cDŒ âçÂ]Ghýz¯ÓSS¾ îMOË\²p¥¥ù0ónƒ]œ< ò I»i§~gÏ\1tZ®ƒ&Œùëåó„ËoŒ1£G×S&:|ú˜B&ã°Ù;ƒô·kÑ}ˆçòuå?ÊÿË¢æ o±¹õ–òáÃGFí;µïü95uÌøIƺ”””XÛ 2jß¹z·v›Ü«wßΦfnîå?~v£ö#NŸ0xX'“n¶£Æ>öüÂ…KC†ìØ¥Û˜q“>~øX“Ãm!Ó¿ÿž4"„È“Éîß`;jlÇ.Ýl9{ö|]â&X¯†Œ[ ÃbÔ¾ó¡ÃG,­úuéÚcå*ƒ!X}»³®^»Îõü=ó»•uÿ²ÒR¡ÅÀÒTWw[º$99™›_ÁÈ“¹i˶ž½­Í,z çóóöí»>ý;vBTÛ5m!‚¸ó@UEeޜ٭ÔÔbÄòV0<ü˜µÍ@ã]7ÓÒÒœœ™v·èlÒÝÁqA~~~ #ü$.ÎÇÛ«µ¡•BÑPo5nÌès§Oò…”Œwßó*2öÿ:ÏYN°ä‚ãªj…ת.]{ôîcsèðñC@YIÉeÁü””Ÿ§;¡¡ì6MDUUU«×øvëÑ«[^>küªªªêQu‚qhnùáâ¿ÐÙéàáP®åà¡Ðê'™4ûü…ŠòòŒÔÔ*YYÒÂÌÎÉ ;–w㟟 “ù=ãpX=Té]rsswìÜ=köœq&ý5góòòê?#á‚ó?=J8Aà!%e…õºjlÜ&pÛn‚'ŸˆØ÷ìæØñ¶ =Ä<>z|wܳF޲Î7€LzèäûÄ.‡Ç>¾J§Ëo!íµZx‹ÍûT– 6ýú~INÚ·gçàA¿$'mX·Önê”/ÉI_’“„*rQJ\ 9xø]âûëÑ—^Ä?¢ËÒ·nç&xøèñ¹Ó§^<4aœƒ“˽û1§O{óòéØ1#W­õ«öðøøgÏE&¼ˆ9b¸ÏÚuA|INBñu…—·‡»ÛÛ×ÏÏŸ‰xõ:¡¾þiиÕ$,¡ø§ÏnÞˆŽ½'//×Õw]²hϾ‡C²g_È<‡9JJJ¢Š‘_Prà¹y¡%änîÚ³?99ùFôåØ{w²²²y÷þ{÷Þ¼ùΛ6øÍs˜#ªíš¶‚8yêôÜ91û/û'#xzðæzô¥ÔOï7ç;/š?oî˧ŸÅ=lgl¼i˶F¸WÏž«Öø½|ùªªªJT £ñ%9iëfÿ¡C‹ïù A;×"~Ep¼swYYÙØoÞˆ~öü…ÐL¹ÆÒÒÒáa¦&&ä¦ÐP v›&A;vîÎÎιw矻·o~ÿþ}ç®=u ‹¨º Á84·áÜpñ5Ò¶  ðÅË—A<‰‹/..©É'N8 Ã’SS)&]4‹Š*¾~%¼ôu»¬¬ìÍ›’ø§gž:]•}.ªWVXZÂ’“½l¹ÇóÏ}V­¼unµ·×óÏ—-÷ÈÍ˭ߌjòÌ ñkÅÒʪOÏ}ûÂyBÑ7NYY÷’¥Ë**+º¯XøøÑ3n‚õþ+utµérô9ÓËË+ü6xr7ß'~$“]¼pÝÇw¹¶Ž–‚¢ÂrÏEÿÞ~@üò\ó¥¶<~üdà„Ðã'qýmúŠIiÜÑ„wáÛ{.êÂz¿µºº:ŠŠŠÞ+Wܺõß­­›üõôtåääæÏs(//ß´q=wóÝ»Äj÷ß°NGG[^^ÞeÁüÄ÷IBËF—£çåæéëëlÝÔ7¼þ\û©ˆ3>¾ëò>¬Ú¶kª6JKOûöÝ„qcBãÇŽyûö]zFw¯ïšUêêB7oß¼Þ¯¯5NWVVööòxøðq #|(dŸþªµ~f=­l õß¼­¤¤ThÙ>z|úLäÞ]ÁµŠ^="f‹Aè0¼zý= uu_ÑoΑy™õ´:u:rßžbB-HãÇGèk7Èa¨¥©¹Îomôµëu ‹¨ºÔah4ùpn8(Ê'ǃ‡ÃB‡q^0¿¦Ïq–ÊÑû®\¡ '—{ár^ôuõ!ƒÊÞ0òòBY.e]¸D^ª|NUýžE×Ó…>"NG—x­pïjjŠêjj:žÃŽ]{Nž:½bù²ŸÏyÜþ÷Úõëiééª*ª³ìgŒ9‚´_‰¾N¡PTUTúô±Z0ž‚‚BhÌøI¡eK—œ‹ºPXXd ¯ï8oŽÐÜy†‹Íbð®,vã0Ûݦ¿¥…E7®1áõûÝ;C?|H©¬¬BaÆ=JIQŽ\§Qù7Ùl¹ž››7~ô_Üy¯‚¿&ô÷Ä:šöøï¼¹yI÷+‡¶é+äù³ä÷ B}’+99¹ÃGŽù½ð?(+)ë4*…o“ÍfW{¸’¢¼`z¾Jíß½#ä`èî½û•”•|}¼‡T/ݯAãV“° „ôt´Éu=íüü¡Õ_äâ´}Çî‘¶ÃvîÚëâäH£RKÎ-FIi驈Èõþ›N="´šäf^^¾¾®¶ Ÿ#GM™8¾«Igî.1m×Tmt*âtAaa—næ¼oOr]½•ïQ¼›¯^'ïzŸô¡²²’·.ÕFXAžîé¾ÔÓ})A©_¾=~ÒÕÍýxøa¾B¦|Nõ[ï<ü0]V¦Úžß‘áëdÁö\: óó t´4Éu]m-Q™&¿O "==ÃÇoÛ7oÉ”¢BÍç¤ñã#h/((Ð×Õ!íúºÚ…u ‹¨ºˆbjÚäùAã?iü˜Ý{÷]‰Ž~ÿáÃ}»ݹ^#ÅÙÃù§8Å™LVqqþ?·˜……|I1„ØÅÅ9—¢[Y[)õ4ðòâÅK„PO‹žÜ©øž¡W¯^“–k×o ³êm¹qÃ:*…zæì9nJ£ê`È^]]Ýû1öìÝÏf³=ÜÝþ±)ŸìÛ“ðæ­ÿæ­ë7nÆDÜUç}¤“w…F“Ù´u•—ÇÆˆ3!\ãJOÿ^ mú[)**TTTöï;ï(Ao¼›šê'#öikkŠJVÓ'²köu¤O‰¯ ‹FŽøôqLrJŠë2ÏÛ7¯ŠIOˆ~ö!¤¥©q>ò”޶¶`z¾…nÖáp^{÷n]…ì!âÁÃG>¾ëÇü[?϶7|ܪÝLÏÈhÛ¦ B(#3SC]]hõ‡´kOH𮽯¶ú‹/†Š²²³Ó¼ƒ¡a¤…F£UVVÊÉÉ!„Š‹‹yZD3-=ÃØ¨-ŸŸÓ'ÂçÌsVQQ^0i©aÛ5Z1ŒKW®Þ»õ·>iÉÈÈœf?{™ëb:.>òn˽V{{`£¤¨X^^ѳ ¹·&æÒÎØÈ×ÇÛÒz_ ]—ylÙ¨¯§ËÝ%&z Ñ{ÅŸj²Â»©¡®ž™ù|K:#3SühÝÚ08pË”é³úY÷QTTj>'Í!>êêÜa˜–ž¡ÞªUÝÂ"ª.¢††˜š6ùpnÐøËÈÈÌýkÖÊÕ¾ËÝ–ÈÈTÿS¾{ó_ ËÊË«rs GhŒ¬¬Âûàý€Ò²2„’’"×¢¤¤HþaGn^޾Šrvš¯¦ªª¬¬´ÐÙ‰›ÒnÚÔÖ††24Ú°!ƒBOŸ=ã}ˆdö,{:ÞÓÂ\ü˜à>åIà8ãÜÇZO³°u/×È`0deedhÔŒôï›6ìz”˜M;»qþv¦Ë`3YÉ?¯^¹™7Y —ߊ]ÝÛ¯^'˜uï†!ôòU‚…¹Y-^H°Ûϰó]矖–Æf±?}JöðZ%òM¦ú8\EY95õ ×îáµ*%å3‹Å"pœÃá4ô[)õ·j6Ú\XPXXP¸5`ûøq£…VCh±‹SØÑãK\ÈÒhâ³+++ ?v¢±¹Ù¥s§°£'ª*+srrÖmÜÌM9yâøM[²³sJKK·lçúÑÕÖ>}"ìÂ¥+‡„‹o»¦j£ÿÓ£{7}=®ÅÐ@¿›©éß7ÿWmä †œ¬,]F&##Ãoƒ?woµžíàô÷ÍÿåçåsØì¬¬ìí;v÷0ëΗŢ¥î ÌïiÞƒ÷@‘=¿ÑÞŒA¨+¿oŽ3jÛöE…EE…EÛƒ…gÊcÔÕÖ¶ìiqõú 1¡æë6M‚;zä–mÛ ò ò 6o 7fTÝÂ"ª.B‡_šÛpnèø/\àøþõ3'ǚ̻Ðp6û·gæÌºÜQI©µŠ •B!‚CB C'ˆ'©©}ì¦òÊÊÊÅÅÅ%ÅŪ**?o"”” „”••ÈÞ’Ÿ_€ÒÒPçë<‰ï“""Ϧ~ùJ>È*+ûÁ›FYQg³Å1…÷ó B¿2Ã~Â2W_®q݆;‚¯Ìò×ÒÒœë0íÿ»/êk#B7§#,j¡‹w^^a[#ÃÎöuûEÍ¿Žôêõë=ºˆxðƼGwñÙuêfÁ»ùñÝK^çÎNóvb®Ó¼Ü<#£¶K.¨UÝk{¸“ãÜ)3fUTT’Å6dÐÒåžiééFmÛnØÜÐ_ ªÇ¸‰ B¨§…ùØÉÓÊË+F´]æºHhõB*Ũm›IÇ‹* ·òòò–=-v)7mð]»ÎÿÀáPmmm'ÇnÝ!í®K\‚‚wŸ2Ä’Eμ͡¥¥yòXèÜù Ùlö’E΢ڮ©Úètä¹en‹ùì³fÚ…:2iâ8ñ‘ßâ¿nkÐŽï^ÚÚZNŽsoÜüw¯ø».v‰8sn½ÿ–ååZšýmúîÞÈׇÞ¼MxóvÕÚu¼=ALÏo Þ+æüP“ÞMw·Å~6>JIIÑaö¬Ø‡…fÊk´›:yçžý3§Oj¾nÓøñ°î®þ[†=Òvù²%u ‹¨º‚c¼Y çÆìŸÕ‚æd ZcCigçPp<­´´¸²RAM­N¥P˜οEE®÷ÀøØ½oÿÝûV¸/

z""ñ}‹ÍN|ÿþØÉÓjªª³fN'L?!vôXqqqÙáÇOþü; 'B òò,óÔéÈ:þÆ3Óã’± ZÜT‡¥n7ÕµÕ¦ápðsQ—¾¥¥a mÔ‹ÄE¸1{ïÖÀ%%¥¹yùÁ»† ñ‘ܰ4ÛøW M¨µ*ö‘ÊAœŽí oÿ+O§#=Ý$+¡°°«Uo¥ä”‚«74&Œ𢣭½#h[ä¹ó;v•••)++÷²èa?cº–æÏ×kÆM§Ó¯ÿ}ÓiáUûév¤Ýsù²ÃaG׮ߨ¡®>mʤº*NÞ7‡pI ZmW¨y$›aLÍ{èëï ÚŠaX lèF¨²„F¸qŠª¯¯7rüdƒ1tÐ ·%‹ >’IŒ¿pÅYRUÕ ÃÚUû¨èã'=Ûa&úWÄ?¼pÁ×3çJÒ34 a¢s¹ÛR1 l‡ µ6”ÏØÃ¬û½»¸›£}2 ñÜOçÝœ8yªÐAAþ‡a6‡E¥Ðšy¬88›‚QjýÃê€è³bÓfŸ”ð¬Ú2$%$°hÑ"KKË—/_¾|ùÒÂÂbñâÅâí$ÁÁÁsçÎê_h.’KDDD\\Üýû÷ïÝ»÷øñãÈÈH˜8‘ô¾-ª%%ÅÍÍMEEEEEÅÝÝ=%%E¼!”œœ|ÿþ}Þë±µzõjÕ«WŸ?.’Þ·Eõᨨ¨Ñ£G«¨¨())¹¸¸¼{÷NB+.f‚“» „Ø•wÓÚpü•÷û‹+òŠ+ò®¼ßß×p¼x;E† È`Ž4å['Ä%å?Ñ”7$p„plVç ÷ÓO/K“;‡Aàl¬É%Mgò–¥ÚË»¼¼ü½û1\Ë»wªÿ‹¬!—Þ½z^¼|…Ïx&òœy3Uå8ÍW|¥$½IIzsçæußõþµ:œÉdÊÈP‘4JÎÇGGG'%%=ÚÛÛ[0Áƒzõê%¹ãvøðá!!!¥¥¥¥¥¥û÷ï6l˜x;BÈßßåÊ•t:ÿ‡ž»víÚ¶mÛìÛ·ÃáHÇyíÓ§Offfäz÷îÝ?~üçzIïÛbú0IEEEXXXÿþý%µæÕù8U_2}•öß ß“ëiEIz*íÅØ©²U#U™Õ¬:©õίÌ@êo`'K•ÿ÷Û ñ¹sXs‹™¤ŸÉ[ â¬g'ÇÃG¹›‡uY0Ÿ»Éáp¶ïÜme3¸«yïåžÞåå夽ƒ‰Ù™³ç ibÖsüäéI>pí¼Îù6kÈ"—áÇOâøoÙ1Y¬ˆ3gÌwàõûpôøÉ&f= y.ê¢ø¤§g¸,q3ëemÚÃr¾óâ‚‚B¾L¹);˜˜ñ.âã ʃÐàÔ u¿µ«b=æú?zâTÿÁ¶M{ˆ*YnÄ´cµ®Èd‘ç¢kÄb±·l·ê7¨§•Mø±âc%´½êƶmÛtuu-Z$8瑘˜¸aÆ   É·þþþgÏž5111119þü¦M›ÄÛÿeºñ/Ó?n×’o=¦Ý¢ˆÄu]ÔûmpgË€Û]ZY Ïh^oKÁ™¼Å)NB,¡‘¶Ã ‹^¾zMD\ü³ââ’Ç"òkµqðpXbbRôųñïËÒéÁ»¸Æ?}~îÌÉqG ºv?×Î矨=¦&]Úþó¿Û\˵ë÷0ëfÔ¶-¯O¯UkÝ—.yýìÉ™SÇ_'¼_çÅKçÍ™ýôÑý¸Ø{ÆÆF[‚øpW’ß'Ëæë† (>BóœÚÂ[—Ÿç«_ë o£/žý”øZTÙ’ß' „ÈŠˆoÇj]‘Éâ⟠ÖhÏþÉ)Ÿ£/»wçfVvŽøX m/¡µ®555rE^^žÍfóM:::8p ]»v’;n—/_>mÚ´¤¤¤¤¤¤©S§º»»‹·oܸqýúõ&|Š‚J¥š˜˜„„„œ;wN:ÎkŠŠŠ\•ùãÇ®ú$·o‹ïÙ™™>|ptt\±b…„Vgb†ð…Y†˜eCq˜w©bWÊà äº ®XÅ*ng—#Dáuø&óáêÛ¶«oÛ&fÅÏ6Ùô÷§#ÙEéS:zE$lŒHðŸÚy•ÐÜqví¾¦Ô HÇ™æ8RP(NŽs9Š:vtÁ| å¿£¢.^ò[»ZWGGQQa¥‡û­;ÿrwmX·FG[[^^~Á|‡÷Iê·Ü Â~Í™!„ŸtvräK#G§çæçéëénÝ´A¼Ã›×.÷µ¶¢ÓéÊÊJ^Ë>ŽŸþÑ“¸3gÏïÚXm„R¿Á),,ܰݦ¯5ײfµ—ººzÍË&&M ] ­Ñ•èk~kWéêè¨(+¯]½R¼“ZµWݸzõêÒ¥K9baa!Ñã6>>ÞÝÝû¬[||¼xû‡&OžÌ}»Pè;† EjÞéîÔ©Ó›7oÈõ·oßvîÜÎõ’Þ·«íÃÊÊÊ‹-zõꕤÎoŠxY’Í ØU¹Î—ì{Éç6­LÉõ6­L¾—¤ Úµ»d•¥Šr>Üx.“øÿåA Mä¼ø¤¼§Z †Bs'šÍ§ÔœÉ[5ú]õ)“&ì 9xýï›>~<´7ﮜܼ‘c'r7yÿUSUý©$ääøæ™þœ>V– ÿ̺OïØ‡Z©©ö0ëΗfÿž!C÷í?¨¤¬äëã=tð 1_½N Þõ>éCee%_EIùœºÁëñðÃŠŠ ÕÆAø$\=‡¼Ù­¤¤hÓ¯ï¦ ~\»¶–VMÚ¨&ijèJhòòó[Ö0¯ZµW ;wî\ÇŽ¥@QíÛ·ÏÙÙ!tøðá.]ºˆ·ó¾WÈû…ü%K–,[¶¬C‡™™™¾¾¾cÇŽ•Žóš]``à‘#GB3g΄s½¤÷mQ}xÙ²ennnÆÆÆ………”à§ú„f9L‚œÚü-Ù/ž|¹1ÙlÉÁXo„Ðd³%?G“{¹vª,1±›ë“´h$lnR_¥Ãðösbf8*¨Èì¬n…Ê/Ï ÓóçÞ<ä¦4É[œâ¬vVƒ ™¹ÍZ¹Úw¹Ûîý\„–¦ÆùÈS:ÚÚ¼éùVx7i4Zee¥œœB¨¸¸X0YÍYèì~´•eر“ÎóyýëÝ»u=²‡ ˆùø®ó¯˜¸-÷Zíí9p€’¢byyEÏ>6‚!W ]—ylÙ¨¯§ËÝ%&‚Aœ:ð)ñuµþkÒF5lÇÚ6·–¦fZz†±Q[Þ]¢œm¯zdãÆ¡Áƒÿ½OŸšÿýVî\¹B^h÷ïß¿fÍš „zõêµÿþŸª]„]cÆŒYºtirr²¦¦æøñãW¯^-çµÙ³gûölë9sæØÛÛù^Òû¶(FŒ±xñâääd55µ!C†:tH¼ÿf>ÇÉ'7ñ_‚/ì¯?Wf½@-8Ý !ó颦¢ÿØ(„PLÊŇ)ÑdšŸöqQB±_/>ú-x¡Rhó,ü¯¼ßWP‘EZο žk±!tâåz‚ø-÷f¥8%ôL.õ#·FгÆònþBçù‚vûÓ}×ùû­]¥¯§—úåËÁÃa»‚ÅøéÒ¹Sر JJK·lÛþ'u:xÐÎ=û£¯^/,,8ÀF0‡×*×Å Û´iM‡ƒ‹/ƒÁ£Óé²²™;÷ì“î zZ˜ÿI“š”­†å¯m5'O¿ikÀÖMö8´fÕJ1N„¶WàëýÜM ýÞ¤ÐbwìØ1**ªævQÇ7n\Cýp•JcTUÑåÄýrFkˆ¬1 óõõõõõm9×€&Œvãôí:ôázò^ü·9N>Á·à”¹[^ì¹ðb ýÒÛÝÑ÷ˆÉƒ³·ÜÅky—õÐ;ËVhîÿ)N¢é{ÔÿˆqóËun‚šüÊ%!Æî²`Þ‘p4w¾K^nž‘qÛ% yÒ‚é7oô[ã·ñÀ¡Pmmí… ÿ¹u»Î7aZèä¸Úw]À¡y :x©ûŠ´ôt##£à€Íâ °uÓú­AÁß—géhk99:ܸù?a!B oÞ&¼y»j߯YÆWÕÅAh0‰šýIëÔ¤jØŽµm ƒ‚wM˜< ˆ%‹Å÷¡íH.ƒmÇlõ[!æ¡6Øv, ¢ áE¿Ïq |5†"KPd°:?•-*wÁYXèu0–k'Ûr3¾@ÄÔéö=)Îÿù[v·£ÏÚ9-‡° Ñ,ýÛ’]IԋܤÊÖýp1¹Ë(b9¯8{œ/¶1‚×Ã!D…ï¶øó¡ùœŒ¯Î®=ùM+0“M ù»>LgýÜ”!(´ºèšÜA, BM,8 Äfü±ÜüÛébsçpÂÂ0h, ®Šþj€&Eñ‡:›VH“©ãᘠA¥Qêœ;‡M`‰Îç Š,\EVYEE ¨£â„»êдl·¿A¤\q‚à$¢¢"4oÅ ’š”‘GètÙæ_ÎáS ±€:*Îô/ÉhB˜,Ö¸és›y!oGŸ…–ê®8¿g|ƒ(4&GL|p+âð÷iWœ¡QSæ@ ‡.RPR˜ÿ Á!Ç! yŠ!Tñ£bÑÈ@̈nݺ½{÷âÐävìØ#GŽp8ÒŸ——7xð`KKË+V”–JùÛluˆIeeå©S§¬­­ÉÍÏŸ?wíÚ•\755MIIA×ÜÚ¨%œœbÖýçÍîݺ& ôÃÖ††OâââââÛ´6DEœŽ,¯¨pqv‚žgņˆµiàÍ!@ ñóóSUUE9::>|Xú*èãã3{ö섾¾þéÓ§Iû“'OŠŠŠÆŒמ¼Âáp>þPTTäíí*..ÎÈÈˆŽŽFùûûKqǨmÜHÈÇ•444N:EZ***ÈuEEÅŠŠ tÍ­Z|ý°¼œ¿®óõñòöAmûúíÛî½û/œ?ûðÑÊUk0 Û±=`@8+¶ð³b=ÆÿÍÛâÓÀ' …r!$''Çf³¥¯‚kÖ¬™0a“'OžÐ|Ú¨%À×ùûáÁƒžÅ=|÷p@›+W/s[bldä¿y[PÀ–Àm›7þz¸Ί-ù¬Xñ¯6 (N<^¾|éââÂ}b‰ûl{rròܹs¹o }KÃ0î;­:uâÛq7%%%GGÇ·oß’›íÛ·OLL$×߿ߡCè“Í­Z;vxóöç oß%vÝ ——“›;û/„PZzºM¿~ýúõý––=ΊõPœ …´oß>,,Œ|b)44´cÇŸïð½zÉ}påÊ•ÉÉÉl6;==Ý×××ÖÖ–´Ož«¢.^ºvã&)}ª-9o9yo"ã8~84ìôÙs99¹ÚÚZÙÏXäâL¡üü¼Tø±ÇNœÌÍÍkÛ¶Íbçzo§Ú¶Bèü…‹'NF|þœªÖJÍÝm©ý ;ñµ¬~ë%v„ÐÑã'7mÙF¡PÔÕÕm‡ Y³Ú[II‰›ïöÀ­‚-+´‚0h>dednGŸ…8-Zq’~„‚‚<×v4 (xê”I›7®?¼“F£9;9òJL¾ ÂOÉÉwþ¹Aþ8‡˜Ã—yxåææ†Ü?p@ÿ„7o…†ñ*ÎgÏ^\¾ø öÑâ¥ËV¯ñ»ÿïÿj[a1Y –“—C¡G¶ïؽÐÙÉÃÝ-xçîí;vc[¼È!tüä©Í[F´Ý²i#BhﺆhªZµÂ‰Sü· 2øøÑ#T*uï¾ÕÖB°úõ[¯ªªÊÛ7¯·nm}íú*_‹½=p«ø–ZA´Hcí!@KWœL&ëø‰S¡±cFs§#BK—,’““›?ÏaϾSgxu› +<ܹ2NÌáåååtYY]]]„aV½-­z[þædù2…aC#„ÒÒ«ÿ½„¢¢â€ `„Ðø±£kXrÞròr:òBÈÉÑN§;;9†=~úì9R«;~ !´fµ·z«VäÊÿnÝ©ßvªm+„=Zç룥©‰Ú°nmµµ¬~ë%v„Ð’E É•©“'­òñ½{ï~µ-+´‚j*J|ÙµjÕ F2H°âäÞ"740X»Ú›kÏÎÉA >ŠkÉüþ]¼+uY æpOeÛwN˜éCEEÙpEÅż mY¡TSéã¤Jq~IN*.. Þy.êÊÕëä³€!=]ÝôŒŒ§ObÉ)´Ú"æpG‡¹³fÎHúðñI\|PðNOïº}«VÔK?u.¹¦¦FvvNAA––Vaa!W$‘R,-=ý{VVkCC®P«GêР䮌Ì̶mÚÔ°‚Ô¡^¢ÂîºÌ#///<ôà€þ68Žwéf.þ1œ0q2Œ[,ªÿ]u55Õõ~k554‚‚wäåçÿÔ…óæ „·ï(--+//yë0¿¯tˆ9|‘«[Ò‡¦&&}­û „déõüm:—|ʤI¡ðc' Æ‘ðc!ûÓÉ]sg#„¶o Ü^ïíTÛVpšï€òß¼-/?¿¸¸d˶Àjk!H=Ö‹Àq„²²2“É ÞÙÐ@³¢FïaÐéôùóæíص~æû÷ „æÒér§"Îôîk#ƒåP IDAT+KïÕÓÂÉѱ²Oôá3§ÛnßñòÕk ÃzZX¬õYYÏŠ³®%_¾Ì• ðKW¢ÃŽ×ÖÖZ±|Ùâ…ο|Îa³ÙÇOžêc3°MkÃÅ ]þùßízoªZµ‚ÜÙrrr'Nžî?hh«V­–/[Zm-„ŪÞêµkGІM[ìg;èèh/Yèò'Åû»ÉHXôéC£¦Ì©øQ ±hÜŠ5eÎ?—NAÌëÌ„‰“kç´ÂMHTønÛ‰3ÉõœŒ¯Î®=áM@ (N'Š@q 8PœŠÅ €âPœ(NÅ 444î‡Íb2ªp§¥…Ã…B•¡ËQi2Ð!Jqr8삼Ü{woe¦§q¤HtêêêW›†J¥hiëõ:\INžÃfCŸhÅÉdT=ˆ¹kܾó¸)ö&=·Ú/ž>ºÔ{½ø4,&ãÅ“ñŒždWù£ú@ƒ(N‚ÃNûš:j¢Ak#i«"A..4ZOëþáûƒ©Txª á'8“BÉE¼6›M£Ñ~‹U†ÃÁ CÔ;-`V”œ¿–„„×}ml^óÅO‚J(…EEý1îh"t¯qGÞE”½»Eoæ/05ëÙÇfÐù aðŠó—àD—„„7Ó¦OÿòåË´éÓÞsÆôSÇq7¥©Qc>*..?n¬˜4_’“^=‹Kzû*dßîØG·ñîÅqüHØÑ…ÎN\KaQQZZÆ­¿¯=‰½/'/ç·~£ Oº=/7¯¨°H__/`ë&Òx.êÂz¿µºº:ŠŠŠÞ+Wܺu‡«h×ûùêêꨨ(û­õ¡-Tqffffffò#""âââîß¿ïÞ½ÇGFFŠ·7 ÑIAP©Tâwx-ÒÔ¨[¶­õY…aÕ¿zO¥R»tî¼gçö —.óÚoÜüÇØØ¸}ûv\‹¼¼¼Ïª•jjªjjª¾>«ÿ½w_ÐÛÁý{<|4f¤ACGü{÷iÌÉÉ>r ù’Ußù¤=//¿MkCÐÒ§P¢¢¢V¯^­£££££³zõêóçÏ‹·7¹‰×du8)•"ÏE bÛ¹«Ù¨±ïÝ Ú±«Í N¦fc'L~õê5™2þé³Év3Mº[téfî0ALìæªòÇOŸìfþÅ} ]Ôëê\0 ÿýR‡Y¼Ð™×Ò¥s§ß&g{˜u;|àEüãë}W¯]Gµ´4ãÆpßFJýôžkOKÏ€ 8…ðéÓ'333r½{÷î?~oozʼnQÄ;ILLüçFô}{>~ú4ßyQIqñ½Û7îßó>郧÷Ï;ÂË<¼^¿NØ»+8áE¼ëâE'NF4U•ù^Bç}«>Ý–{~ú”Ìf³¿¥¥­\µf̨‘Ü4÷cÈÉÉ÷êiÁëÓnÚ”­A%%¥%%¥›· 2X0_·åž))ŸY,6Aø¯CgÏš¹z­ß·´46›ýñÓ§eË=IûÔÉ“6nÚœSZZ¶iË6Š ÅÐj{@yy¹¢¢"¹®¤¤Ä}õX”½HNâï¨Ⓦž6W|åËèOn.wwSPP2xBèë·oÜÐeeuuu†Yõ¶´êmÙœ~ÔH[÷+S>ÖÐP7fôJO‡¹8ñ¥Ÿ>mjfæ÷¡¶£**+‡´u³¿ ÏÇ.ruû––nll´sÇÏC¹8c(ì¯¹Ž¹¹yÆÆFK—,"íîn®ÛƒGŸH„›ëŠŠó?ËËË•••B?~üàªLQö&‡Ãf>O|Fe…øêê!rSKS!D¡PBÜùQOeÛwN˜»ŒŒÌ:_Ÿu¾ðÎH?µ¾«Þ©S§7o~~øæíÛ·;woorUU”‹_êåÍ!G‡¹ /â/_8çéáþæí;Ooè^uQœvvv999999Ó§Oooš“üBÎæ{[ˆ×òçÙ,ruKúðÑÔĤ¯u„,]ºWû%Nr…üRÒìÙ³¿}û6xð`„М9sìíþŽ¢({sЛäæû7ÏuôÛjhþü¤ynVFA~®iËúúçÌévÛw¼|õðžk}VB÷¨Fq ~Œ!„a˜¯¯¯¯¯o íÍBqâBȸ}×Ä„xœÍi¥¡™›‘™öÅzð„sØ8GÌᢞƒÜOøËE:j$­5­sù÷=ã$Lqæf›õ¶©(+‘š*é´þðú©4ÕHZkÚrZ ZºâÄ Ã0‚žŸÇ0 'piª‘´Ö´å´´tʼn’ÊK~ËÑ1’^SPœÐ"'’ÊK~ËÑ1’^SPœÐ'ÌqBM¡ü4°âDÒ¨8Q‹Qœ^Ó–ÓRТ'ÜU‡šBùhXÅ wÕ¡¦P~@q‚ŽÅ €$+Îf{[“À9ˆÍÀdê&d$IuIxM[NKPGÅÙl_Ý(»ÌÊHPw:]S×J™˜Y&½yÞj å g³œdbç&W<:гÙUïÑ; ®µŽùƒJ5r@š°¦P~IqòÞÖ,ûñcÿÁл÷brrs-{Z̶Ÿnݧ7BÈÔÜêýë§Õz¬a²jTÎ.8bO°Ù¡¢Î:kža ªµ2¡ÃFßþû NçÝSVV6g¾ËÉðÃ***bŽmꫦ¦æV‚{þ¼!¤¾ü4’âädòô^chhp4ô€ž®NIiéÓg/††÷±²ü¥ j$ÅêaÖ £jû<ýŸdúž=.G_Ÿa7…wWäù‹fݺ)++‹òÙ¨³nõTÓÄWñäfW‹>Üõƨˆ¤—€FRœ<ÒÅ?{±3x›‚¼«¾qÍÊÝû,\ºâctŒ“£Ã׼ǎòlÿ=øT ç_'Ë_XXXLòӵ緊©»ñùIIÉ©iB7×ò‹ÌQwžT’.  ËÉ’wH$/|ÍSìÍ—/V’ð.óʦr=ç[5ýá3GÎþ{#?ß!ëÙÚ¥SGù¯û^²`Ã0…Y¥µ•ÿúÇ_nÙPÞÅ…ˆ&ÛoÐÐùs¦ëC¤J-ê<{þÒ¯»·9ØÛÑŒ©ÿ¹qKÞ®oëOD3¦Lt°·Wv0¼ŒS’Ÿ§øÝÊÒbü¿ñcü†‰üuàȉ©³ænZ÷o¶Q ç³¯6n ËÎÉ!"‡£˜Z°ÛÚ•KwîÙ¿mGP¹råfLß®M+ÖõÈy}A–“¥˜W"‘Tß"ü–#‘È'qÊ9Qæù5æ_~§90Å:|Õ°>‡8Áwï5müÕ»÷í¶žujJòó ³þQüš˜Ô»ß E£bÆ2T©E]€)©).NNò×®.NŠþú¶þDä`/P¼V {ƒzuñ¹0¼Œ“‡Ã©VµÊÌ©ÚuêÉÚaæÜES'Žkݲ¹uVVv›¯}X»yÕ«ûËÚ Ãܾ¿xYÀå³°v³låǵrÈ<³Tþ«T*ÍÍÍýÿZšý»ž²¬4߯nÊ•"é7|ð¾Gš6þjÿácÇ *äúóx¼œÜ\K>Ÿˆ„"±¢ÝÙÙiжò.Îzia6£ƒC\||Å D¯·ë¯D1ìCƒÏ-€aáSÀˆ±“.\ºšœ’"‘Hã~ÙØÀËS>ɶ\¹ˆÈŠž¹¹yææfÑ1±?¯\«XŽR·Ù󗼈ÌÏÏg™T&eÔ3ÿò›r~‡å§Póóó- ÈÏÿ÷\-¿É ÁÔÄã3)Õ¶u˄ĤÓç.¦¥ [µh¦yý/jתñëÁ£Ù99 ‰IËÖ)ÚûÓ{éŠ5?ÆH$’°wïgÏ_ª?‘lQ`×Î_¯ÿe[Zš0-M¸vãVE»¾­¿Ò$ŰãC `p”ïÇ9ê§¡Ç~ûsÅê ™Y™NŽN-›7 X¶PÞaèàïûŽÉÎÎ~|ç*-œ;}ý¦­3æ&¸8;üýùÕ9*ݼ۶ž>{áÇè˜*•+-[8Wó­.Í\ëÊ;ìÙ³‡e2ÃðÜê*­°Zúpˆ|‡ Z´,`é‚YŠvu믘wÁìiKW¬Ýµgygß!ƒ._½.oþã@Ñè S“’SªT®4bøòv}ˆ´`‹ºÇò]¶j]÷¾l¬m~øþÛ;wïëçú+MR »³£>·†…sÆ©/‰0#oëÍäü[=)˜q›Ã±,b*d7/“H×mÚ6ÒwH^^þ†ÍÛÚ·m]’±2-ÅÆ%"æówMÔù—k3$H¾Š6C÷’¿H³ëiPz©»›ë7‡õý~¨m¹rcF3¬õLJÀàÈqêe.ìTßÊ—'ò<g '3Ñ}¤ƒú;¨à“?l)(åŒSoŸ^mÑv\±WϰÉm葚Ζ€bfœFz”Étòëúžqå1&Ó9pfè‘â'€Idœ8ƉH±þPº§QÒ™Nu ¡GŠ:N“È8qˆ‘bý t3N£¼Ç¡éܸÑÐ#Å-6L"ãÄ¥Cˆë¥›qâ¤:"Åú@éfœ8ƉH±þPºç‹Ç÷/0£ Ê(#5-`Òg¿É0›÷à ^ÆIDÙ"Œ”bƉJ:(ÝŒWo@éfœxÒàˇ·¾lÙQ’Ÿ‡A0ñA€RË8q^ã€A€RÍ8‘c`0Pº'Ϊc0Pºgiת\­VTD˜A¤[Ø'0P*§ké-ªT¯ý!<´ R-½9¼WV#P¤Aм’eècÆ©tT«JÚª]?¼gɪԨÍÚΖÈ(7¤§§¯ß¸éâåËññ 666Í›6>lhëV-ÿ}¯2ÉýØÞ´JÚµjÖ¼tþ ‡ÃQädºú¼{ÿ¾°±«¡# ~TƒÕ¼’Z ¡à®(Z6o†-€¡fœJ—'G¾‘¿¨Z£ŽâµºK˜ yi³j7ÿ‰“+W®täà~w¡P|÷î/[¶¶jÕ¢ ‡C],VVVW®^ûúëò_/^¾lmmM%¾¬[G äZëä{ Ã0)©©{÷þÏ-€aáþ—M0ì?ÿMÊÉÉ™=w~ý/×ÿ¢ñœ¹ rrrˆaªÖ¨#ÏJ«Ö¨#ïå7rL½_Õñl0ÌwDrr²Òr þß½;gæôJ+ð¸\'G‡ž>ÝÚ/Ÿ¤X |áŠy£T" X½¶qÓ–uê5œ0iJfF†Úõ/ü†q =ÒoûŽŠ–í;ÇŒ¡èÏõ¼ù‹Nœø]1Ëñã¿Í›¿H¯Gàsƒ ÚXµFaš°QÓ"¡HÑ(L6iÖJ$ áà¡Ã­Ûu¨U·¾OϾ¯_¿–·çæäL>«®×M›·ܱKÑŸõ}9DÎŽŽÆÃ‡ÀP3NF Ťuë7ÆÇ'\»|þê¥s±±±ë7üÂ0LDØ"Š{öFÞí§‘c~>ôñý;îÞª^­ÚÏËW*-§ ÆÍš»àñã'999êÞW¾ðˆ°7+–-íØ¡½¼qëö/_½>}òG÷nó-ø+Ö0%¦aˆ¨[×Î))©?f&øî=¡PÔµK'EÖ¨Ο{â÷?N9Ë0Ìß§ÏüöÇŸ‹ÌÕçøì °6ÚÙ ºuírèÈQEãá#G{÷ê!Ø*f!¢{÷ü~ìȳG÷ºvé4gÞByûÚõÓÓÓo]¿rîÌÉ©{ Åëä””­Ûñ¡0ØcœŸsòÔ™…óç8;9¹8;/\0ïä©Ó¬Ý.;ݪe >Ÿokk;sú”[·îhXfàÖÍ*xÌš· a£f­½;.]¶R$³ö¼uûΡÃG6mX+ÿõ؉ß-˜çææjcc3sÆÔ‹/—ú0q¹#ü|·ï"¢À»FŽø‰ËåjŽÚÂÂ|˦ «×¬X»~ÍÚ [6m0777ÜÐà§aC>"‘HˆH"‘>zÜÏw¸RŸ¥‹ºº–·²²5â§W¯ßÈÿ>}fþÜYNŽŽNŽŽóçÎR·üjµ<å?Mš·Þð>´çß:N 6”OJIIñps•¿öp+Ÿ’’ª˜¥à¼Ož> X»áõ›·ÙÙÙDÄápX»ÉY[ñ§M?mÒx†aÂ#"÷ìÛï?aÒ¾Ý;”ú¿{¾`ÑÒ}»wð-Ìå ‰ºú(–Sð]JHÝr$ùy}{ùlÜ´ù¯“'_¿}»móyOù¿ê¢v°ôéÝc˶³gLs°ÄhÖÆ*•+Ö¬QýÌÙ³=ºw;}öÜW_6,ïâTp|ˆ¨œ•üµ+‘H䯓“S\]œå¯ÝÊ»¨{‹°×Ïä/DbñƒG®^½ŠÏ-€Afœnˆ#Ÿääèø1:ºJåÊDõ1ÚÑÁ¡àIXEç “§Ïž9­]ÛÖåll23³5oÍÚMUõjUçϙ٤E[¥þ))©þ§¬Z¾ÄÃÝM1ÉÅÙéø‘®åË+­dÉ©[Ã0æææCÿ0cöüÉÆ™››+NøjˆúmHèo¿ÿµõ—õK—¯úº£·|ôô|4‚ºÆáC~Ü´u»O·®ûöZ²pžêFWšW±SÅÄÄVªT‘ˆ¢cb4¿ lmGú GÆ `p {åPî]—¯\“’œ’’œ²lE@OŸnòv­mxx„¢nn®¥…ßÜ<::zÁâ¥ÿ_2Û[ü8Ìïì¹ ÉIÉR‰$..~ͺ_4l ÔÌøI£GüÔèË/ Î8èûþó.ŠŠ’äKBCæLŸ¥›‹fFð}ýôÁ(?_¥vÖ¨³³²¦Ïš»nõŠÎ_wX²pÞ¤©3ssrôzŠ~墱M«™µ±±®W·Žò,Jóþ÷kOŸn+׬KKMKKM[°Vó[ä§§ïÞû+>´‡ýîHŸa"†ˆ¦Lò_º|U'Ÿ^DÔ½kçÉÇÉÛý|‡~ûýYYÙ!/Ñò¥ W¬^;ezùò.~¾CÏœ» X2ËݑƎ:xøØ¢¥Ë323]œÚ´n¹q]€RÿgÏ_<{þbÖ¼…òFù»ŒôNœ_‡úNJLªZµÊ¸Ñ#´u㞢ÞHÞÎõ¢ŸW <°Iã¯b:´oû!*jñ²+~^¬ç# !ØÚõ¿*ø«|M‡ýaá’å»¶o.8»º­/ÿuÒ„± /kש[¹r6Ã~üáæ­;¬o­x_++«&¾Â‡ÀàpŽmèï791:ÜÄ""ôÕ—-;ŠR0e2ïÃ#F›tåüߟíùÝ÷ƒoÜ&Ç˽tòh¿Éø$”¡»7vî3Pþ:!:r¤ÿ”·ƒ vPÔqb¬0e0+W¯ó327/oÕÚ :¶Çø%Ý=WÝ@’-ŒƒNÁÃýk¯orss;z{O7ã`Ì'¾é1e0C:x ÆÀ$2N[Â8` t3N0b0Pº'rŒJÕê¤ÄÇ`0Pj'êç T3Nä€RÌ8ÿÜ¿¥˜q~3Ô†bÃŽƒÃÂÅ2N@Æ €ŒÊ„™±võ©+çOièÀ㙵ïìÓ±kOãÞÀ@ÆYZþ¹tnáªM|¾¥º¹99ËçO5úL ãeŽå¬úÕ«WûõëW­Z5//¯±cÇÆÇÇ«ö‰D£G®Y³fƒ Ö­[÷Ùy¯]»6`À€êÕ«{yyM˜0!99Yu™*TèСSà^ô ôoß¾B… Š žžž~~~QQQê“J%Ò,"â[ZJ¥Í£cCQòq(ä T·n]̓ ®aZcÈ8·oß>bĈgϞݻwÏÓÓsÔ¨Qª}fÏžmeeõðáÛ7o~øðáØ±cšçݹsç˜1c^¼xqýúu[[ÛqãÆ±®••ÕåË—¿^¸pÁÚÚº`‡˜˜˜˜˜˜èèè›7oÖ®]›uÝ´CQÈŽ)`ñâŃÖ<êúuÀ0ÚÀ¨—]­Z5ÕöZµj …Bùë´´´¾}û~Þ¬¬¬ªU«ª¶{xxœ:uªOŸ>Š–ž={ž>}ÚÃÃCÑ¡`ÿœœÖåÈÍ<’ùœÂô1ô¡Ðî8¨[a…¼¼¼-ZÄÅÅr4ôW7m[µ`&-)Nþ£y8´AñÕüöI°ü˺ MתgeeµiÓFuóésØß¾}[øyoܸѸqcÖwôññINN~øð!ݹs'--­{÷î¬=SRR6mÚ¤n9Z‡¡øì Ë8q¢eË–nnn…uý‹: ÏÔ^9¸ÙÕ IDAT$/tvv>yò¤êÔ:,]ºtáÂ…D´téÒ¬¬¬BÎûêÕ«Å‹:tˆõM¹\î˜1c¶nݺwïÞ­[·Ž;–Ëåª.YÎÎÎîÏ?ÿÔÁa( ³ÂD$“ɶoß¾gÏžB ºþ…0j¿¿cbbÞ¾}ëëë;uêTÕ©«V­‰D5òöö®T©’££caæ½s环¯ï¶mÛªW¯®î} ðôéÓ¿þúëõë×ýû÷W]+¹×¯_9rÁ‚:# E!WøôéÓ5jÔ¨U«V!P]ÿÂvÆID¶¶¶cÆŒyòä‰ê$GGÇ   ÷ïß?}úÔÝݽuëÖŸ÷ï¿ÿ?~ü®]»¾úê+ ojaaáçç7iÒ¤#FXXX¨ëfggçïï/?ߪ&>…\á-[¶øûû~5ô/ê €eœ'N “H$‰‰‰ëögr§OŸ—““sþüùõë×O™2Eó¼;wî\¶lÙ±cǾøâ‹Ï®Óøñã?|ø 9‹Å5jÔ(ÕÑÁPh^á‚gö¯^½jeeÕ´iÓB kÿbè3–:Î.]ºŒ;6,,ÌÞÞ¾C‡ª}š4iÒ£G±XÜ´iÓ={ö(Òuó.Y²„ˆ ÞL144ÔÆÆ¦¨««Hq¬­­›5kƺnZ„¡(ü oÞ¼YõÆIµ?˜JÆÙ³gÏž=ÙŸ@#1pàÀ~^ÅŒ¨ë£h/ÌBx<³Üœ¾¥¦g혙}æ‘KF0% ïUpë¥Kð³—:is€eœÆ¡}gŸ ¦J$jŸ¦cffÖ¾s£ßÀ@ÆYZ:ví‰g…c@àŒq 〲aFD’üÜ QÆJŽq2N@Æ €Œq2Ndœ€Œqh3ãć t3Ndœ€Œ' ãdœÈ8' ã@Æ È8'2N@Æ €Œq2Ndœ Oxý{w«Q·¾†iiB++K‘HŸÏ0„×x]¶¯ÿüó/_¿9Yòý3<ä¥W£ø$”¡×Oî*òÉL±ðÔÙ ¾~# v0Ó<¿H$fxöÎndf)å˜ÙÙÛÛ;:šÎk†ˆÌ,íœL1v;{{âr^ŽÀÁE¯Ö ŸjƒÃ9´¡sŸzØ;»a˜@´kÝòÆí`ar¼ü×K'ö÷›Œa(C'voTä“ Ñ‘#ý§Ü¸\°Ãgê8ÓÓÓÅb±ÉŸX,Føø@ æ¬:_ ˜æè…B"Bøøœ@)fœ¶¶¶¦œp˜x²…\t‘qÚÙ ìííMvtL9v„Ú‚:NMPlj:N(9Ôqj‚:N¹u(íŒuœ¦¼s ×]dœ¨ã4åuœ ¨ãÔuœ¨ã€’C§&¨ã$œ[€ÒÎ8QÇiÊ;rMÐEƉ:NSÞ9PÇ Z:NMPlj:N(9Ôqj‚:N¹u(íŒuœ¦¼s ×]dœ¨ã4åuœ ¨ãÔuœ¨ã€’C§&¨ã$œ[€ÒÎ8QÇiÊ;rMÐEƉ:NSÞ9PÇ Z:NMPlj:N(9Ôqj‚:N¹u(íŒuœ¦¼s ×]dœ¨ã4åuœ ¨ãÔuœ¨ã€’C§&¨ã$œ[€ÒÎ8QÇiÊ;rMÐEƉ:NSÞ9PÇ Z:NMPlj:N(9Ôqj‚:N¹u(íŒuœ¦¼s ×]dœ¨ã4åuœ ¨ãÔuœ¨ã€’C§&¨ã$œ[€ãõïÝ­FÝúê&3 %¥¤zxxDFF>|øP&“9::šÎk©Têîîo‚±Ëd2‡¸¸¸—/_êÕºýùÇï¾~#r²2ä»hxÈK¯F-ðI(C¯ŸÜUä“™bᩳ|ýFìÀ9´¡sŸaïì†qýÑ®uË·ƒ…Éñò_/<Úßo2†  ؽQ‘O&DGŽôŸrãvpÁ¨ãÔuœ¨ã€’C§&¨ã$Ôq@igœ¸§)ïÈ5@'îÇiÊ;îÇ Z:NMPlj:N(9Ôqj‚:N¹u(íŒuœ¦¼s ×]dœ¨ã4åuœ ¨ãÔuœ¨ã€’C§&¨ã4ˆðOìÞˆO2€gœ¨ã4åà Â×üŒV0€Œuœ¦¼s Ž´uœš ŽuœPr¨ãÔuœú~Vfæ×âb£ña(!7gœÚ‚OÄ' ?Û‡Ã!7÷Š­Úu°¶±)~Ɖ:NSÞÏ "ü»·oT¬\µ{ßþV6å4÷ܺæçñ3âÏ«-k–ÖkØãŸdœW¯øÏX ¹Oº(íõ³Ç÷îÜìй[ñ3NÔqšò~fáÇÇ~ìñí@3O&‘|¶3ÃÈ™ AØs (“12™TÃtÛ/›µÚ»mýgö®Ïä­éé\ k“=Ô'¯bDøú¼’R©ŒÇ3“J%…éÌ0Ÿùؘ2‡A•„“‘}î` Ë“Je%Ê8QÇI¨ãÔûðF¦”G2 óæé=÷J.n>i—ÉdRã(ΗìÙ³ç®^»¶:`—Ë-êrPÇ© ê8 åÓPð\9Ã0ož=HOÖkÜŠùôT;ŽqB™[¶`úüŸ×²¾Ðó/Ù–-šoÜ´iúô™kV9éD§&¨ã4ˆõ”12ņaÞ¾x(LMnÓ¹,?Ÿa•žÈ8¡¬÷ØÿvBÕúü%+Ž<гÏ7ÓgÎZ½je‘’NÔqj‚:NßaæßC\ô‡Ø¨ðž e’<Õºi~^^N6þ|@ÙR섪/ôùK–ˆìì]:}½3hw³fMû÷ûVk'ê8 uœz¾D’Ÿ—ûï¶£³K…ª5ã£#Ë»Wâq9ªŸ®U‡2?`ðßN¨ú@Ÿ¿d‰H(]¸x±ÿwßöòéZ°½¤'ê8My'3Ð:Î*ÕjÑ«'w=¿hbÆå)}Óãô%èAƉ³ê`8 |É E¢a?jÖ´Éò% 9DEºá ê85A§|Ë”UªR#:ò]~^>ׂ£ü©‘â«ÊÒÄ©³å;¡ê =ÿ’½{÷¾W=Ï¥‹æSÑOΠŽSÔq’¡Ôqªì÷«Ô0ç[æçæ|ÒQ%7€B~ÉvþºCç¯;Pn*ãD'¡ŽS¿Ãçñ¸b!‡ÃQ”›Åö©ÁÁ$€"%œ²Ïöáñ¸%Ê8QÇiÊ;™A„ï^¡ò»°Š-­­ óÁ¡Oï—š³IÍG4³³3cbb=*V)QƉ:NSÞÉô6ü¼œÿ¼lÞªí›×ž=~P˜LòÀî@üíPçɽ[P²?h›æ¹yTjÝ®}‰2NÔqê8õ,ü·ƒ»|í}ú̹¬ 1YÛØtêÖôAJBÌ„i³nÜ.ZƉ:NB§^†/ÉÏǧ@¯(]°[ÐgÊà»oÓ…)Ù™éøx胔„±0eÒÔ™¯\WŠ:NMPÇ©·ëvú•._{Ѫ%óÌÌ-ø|K|ÔÊЄi³ˆˆ5Ý$Ôqj†:N}_¾O·kÝr€2§Z»Y„Œuœ„:Ný_óþ]òðæ8·L&!ss®”1Íð‹±õE)‰vvFõÙ¿tòhç>寢#GúO)½ŸôtM•l¶¶¶šgçõïÝ­FÝúê&3 %¥¤zxxDFF>|øP&“9::šÎk©Têîîo‚±Ëd2‡¸¸¸—/_êÕºé,²´´´´4ž“õé☼mù³™føÅØú$3¶«ÓÂC^*þÚgŠ…§Î^ðõ/Q(¤¼¼< Sù|¾æÙ9ǃ6(þ×ËÊÞÙ £ `èÞ½ü‹ ªù"CQHÂäxÖöܼ¼ /­^³þÖõ+ŠFw[[[©TÚ¦u«µ++Uª¨Ú¹÷׋Îk×¶í?ׯ/[±êƵËg5ÂÏ»]ŸîÝ=öî}ø†›Ò’âä“Ò’âd2Ù›·¦ÏœóðÞíbG„cœP†PÇ© ê8¾Ñ„Ï02â`ë!üôôtÕ“D.îDdoowâÈ¡‚íòì0)9yËÖí~£Ç^<{JµóÆõkú $‹ÁïÇ(-yÌè#GëÞ­ëöÀ]Çذq“Ò›š››ïß„/-0PŸ¹;’H$–—s™èA¡á#|㓞”[Î[¿ðá‹DbÕö´¤¸¸ë×®=n‚êTgç9³f<}úŒµó˜qvïÜóaWàÖ±þʳW«ZÕÍÍuÆì¹µjÖððpWzÓÔÄØ?;6wþ"0ÊŒ÷ãDøß802©ŒÇÁÖ/|øª8çÌ[˜œ’BD\.7##ƒõ¿èë6üÒ ¾kç”Ô"⇈RRSUg÷;f÷ž}£G©­­”/Àá~œšà~œßhäg ÉÆ[¿áK”ŸœáååÙ¶}§ÔÔ¯zõvï ¤ÿŠ,é¿ß|>¿Eóf;·²vÞ°nÍ´³cbc+V¨°qýZÕ7mÙ¢¹|iJä wuu]½r9¾´À83NÔq ¾QIòÈŒ‹­_øðUë8üaÐ? *Ø¢HU3EÕÎ}{÷êÛ»ë۩ήaɆuœš ” áM8’,±ÔÊ[¿ðá³Öq@ñ|æ'ê8Myç@øÆ“ŸÇX˜aë>|&?ß:Ê8QÇiÊ;Â7¦pd9Yd‰:΢„/AÆ  5Ÿ9«žžž./ç2Mb±á#|#É8s³e|slý‡¯ùyn ÍŒuœá&/—±Àý8‹>ê8´uœš ” áOÆ™EV–Øú…uœºË8QÇiÊ;Â7ªxòóÉÌ [¿ᣎ@g'îÇI¸!%Â7YYdgWÚáOJÇ“››r{X‰D¶õYŸ«¥’qŠDb†Ç7ÙœC^džð¾àHeÄ3+íð< ñã©sgåö&M(/,, ië‹Ebdœ:Ê8QÇiÊ;Â7¦p8™T­zi‡/QÔ r»egRƉ:Nfœ¨ã4åáUÆ)c§´Ã'WW–vKKÊÎ.ÒY}=Øú¨ãÐYƉ:NB!#Â/k.®Ìxr³„ ñÞñúΡ¥~~>‰DäâÂ2‰Ï§¼<Ûú¨ãÐ]Ɖ:NB!#Â/kÒ­›<ï'¾Ö¬$ ¹>«…[½¶¥~B•/O¬Rml(3ÓÀ¶>ê8t—q¢ŽÓ”w„¯'kÂp9Ûfx³JÏË#ww5hÌH"1°­:NÝeœ¨ã4åáëÉšðE9Œ‹þ‡Çr_¤ÿþïJ†õÈLÔqhž«® -ðõ"ãçZ Êëø j3Nd2Ûúx®:€¡ŽS2"|}ßJœOWý ÿý{ªY“”ÛÓÒhÑ"ö¥ vŒuœ:Í8QÇiÊ;Âד5±K›þ„ÿñ#5iB/²%ÇVì³ðx¨ã@Æ©ê8Myç@øz²&åÄ2²«¨?áÇűãÔB9=½V=$„êÖe€´$dœZƒ:NMPȈðË|5òò2Ì$deå¨?áÇÆ’‡GÑ–fa¡§÷ã #bå‘uœÚ„:NMPȈðË<ü q, 8Žú~L UªT´¥YYQvvÑfa Õ.ÍÒR;a††R­Zìᣎ@w'ê8Myç@øú°™â8ðõ)üØXjVÄ»ÑËŸrY$oÞ—ûõI Ò’%Ú 3,Œå)ð„:Ngœ¨ã4åáëÃjd‰ã9s½ ?.®ÈgÕ‹ñ”ËÐPêÙ“NRn߸‘"#µfh(}û­šðq?Neœx®:áÁâ¿LåˆÉÎB¯ÂUûl!uŠñ”˪S‡5T{¶]ƒ¨(JJbiÿçÚ³‡=|—|9ÇÃÃ}á¼¹ú÷Ã÷aƉ:NSÞ9¾†©RqGPÎXc ¥š5eZÜ4<å2*Š*W.¢4㌎¦¯¾¢*U”Û=¢Y³Š¼õUë8Ož<µw׎êÕ«;ñÛˆQcß…¼RLºxéòïǺ¸8Ÿ»pÑoÔ˜÷!¯‰¦‚ÿ„É[6mðönwýú…‹—nÝ\pêŽA}{÷âp8ùùùÇŽÿVpRZRœL&»qóÖPßÈ8À@ñú÷îV£®ÚrzKK~rªÐÑÑ122òáÇ2™Ì¤^[XXxxx˜fì2™ÌÃÃ#>>Þ4cwttŒùò¥º>¹/O›YYRõŽcxx¤££ý’%¤ôD*{ôHÑÖ{¥§;^¼˜]¹òu¥vÏqÝ:Y»vW ¿Ì¨¨È;m{ôˆtssPêsøpÄ“'·ñ7Ž­YóM²Áƒí7ŽmÛöM‡y+:é³ïh¯|J½oŸ^..ÎfffŽŽ'~ÿcìèQŠI={øØÙ ¤2YxDÄóç/ò°fݶÀk×o¼ÿàa‹fÍìì¿lÞÚç{µªU#?|ز5pâøqŠÙÖ¬ëѽ{~~~­Z5øÍÁÁáîÝ{³gN—Oš=s:Ã0¢¢nß 5Ò¯ØîÃC^*þÚgŠ…§Î^ðõoAÐ Îñ  û T79==ÝÎÉ•|á+¹>£•/ï=ã´Aǘ’BµkSJJ©oý[·hκyS¹ýùs<˜^¼(ÚÒ*W¦[·XŽŒnÙB¯_Ó¶mÚÙú¢”Ö:ÎÄÄÄï2súÔîݺl—Ÿþ¶··;qäP“&åIÉÉ[¶n¾wÿâÙS§NŸ»`arrÊð¡C‚öìMŠûXpÞÇ‚GŽwéü™v:;|Àë‹FϪ‘¹¹ùþ½Aݺv)vP—NUüµOˆŽé?åÆí`| €np5O‰ÄÂb܉ÄX…B„ðÙ?9â ®Àà¯åOM%GG]l}uO¹ŒŠb9 þYvv쥜ên_¼­/±\ëôèñ“ÎÝzŽ=J)Ý$¢´¤¸¸ë×®=n‚¢ÑÅÙyάOŸ>#¢^=}^ž« »Œuœ¦¼s | SmDF` §ºcœØúx®:€î2NÔqšòÎð5eœb)#p7ôÓÒÔ^¸ƒ­çªhÑgžž.V÷8d ‹>Âge+flŒ ãTwå¶~zz:¾!t”qâ~œá«ÊÌHȶæðx†£ÎîÇiˆ[Ÿõ~œP<¨ãÔ¥l…ìÉ0²·YøYYYD”™d­:)=æmC c1j¸V;?ê8t—q¢ŽÓ”wŽÂ‡Ÿ.Žñl2äMckc _C0Ι’ˆú6žÎÔ©ôûïäâòIã£Gj¯UÇÎ:NÝeœ¸'ᆔ…?C“QÙÌóa&¶¾Þúçš6Z·Vn¯Q;?{øª÷ã€ÒÊ8q?N ) ~¦(–#0ÃÖ×®˜êÔ‰*VTnÿø‘æÏ§,ÚÒ"#ið`µG4±ó«†ûqè.ãD§)ï…?GœHsl}í ¥¤$Ú¼Y¹ý—_èÁƒ¢eœ‰‰Äå!ÝÄÎ:Nfœ¨ã4å£ðá犓HÀÇÖ× 9™¦M#KKåv‰„  ®]Yfy÷Žúô¡N”ÛÓÒèøñ¢½{HH‘8ŽuœºË8QÇI¨ã,DøùâXaëkIû÷ÓŽÊí»w“Džq¾Ï^déêJ‰‰ìï’M§O³´ïÚUäŒ;?ê8t—q¢Ž“PÇYˆð%âT²³ÁÖ× 1‘||hÔ(åö–-©öYÂÃéÛoYÚÝÜ(>ž}–ׯiÀ–J¥äヿhᣎ@w'ê8Myç(|ø2Q Êaëk@®®,íõêQ\‰Ddg§<éÝ;ªY³hgh(}ÿ==Š_ ᣎ@w'ê8Myç(|øŒXD[l} ©|y–v*T Þ½©eKåIOž°ŸU(?Ÿ²³ÉJ¥!$„=IÅÎ_œðQÇ  ³Œuœ„:ÎB„ϧSÕªØúÄÇS•*ì“Ö¯§gÏXÚ×®UûÐswwŠ‹£êÕ•ÛCC‹|ö;¿ºðQÇ  »Œuœ„:ÎB„Ïg’À[_ƒ„jÖŒ}R·nÔ­[Ñ–V¾<%&²gœ“'cç×Nø¨ãÐ]Ɖ:NSÞ9 ¾™8‹ìœL'üÈHªV%á §õëiÊ–YÔU/æçÖŒf¹qÒ£GT»6v~í„:NÝeœ¨ã4å£ðá[ˆ²Iàl:ᇅQýútò¤rûµk´k{Æ©îÊ¡âY¶ŒBBXÚwï&mí³ØùQÇ  »Œuœ„:ÎB„Ïç’ÀÅtÂŒ¤æÍYŽqV®LÓ§Ó«WäáÁ2‹3NooòöÆÎ_ºá£Ž@w'ê8 uœ…ßJœOWÓ _~VåãdF:Pýú,Wüdd³3v~C uœºË8QÇi¸+<°JËcQ%YBåB÷¬N”`ça:[?<œzõbŸôÇØù$|Ôqè.ãD§A¯ÿ#Z ܤ›÷r5¥­i|7ƒ2¶_ ᣎ@g'ê8É`ö˜‹³“Ɇ¯•­Ê Yž¥t÷®ñgœØú¨ãÐ]Ɖ:NÃýÒå‹s™’]Í£Ýðß½£ZµX ÓÒhÕ*š5«hK[²„NŸV¾.;!.\ ww–þ›7Óĉì÷3ŠŒd¿7»P(1Âíý{jÑByRÆ,×aç7²ðQÇ  »Œuœ†»ò–â<²sÓŸð_¿¦öíYÊù…bbм´?ÿ¤>}¨mÛO¦W¯Ø3Î{÷hÁ>\¹}Àzù’=ã™™f÷îQ½zØùM1|Ôqè.ãD§á®¼HB%»šG»á¿~MÍš±ã¬U‹Îœ)òÒ¢¢hÂå«¿¿ûŽBBXî‹ND¡¡äïÏrŒ³}{zõŠzô`@ûµö˜rìü†>ê8´‡«yrzzº¼œË4‰Åbà ¿œHj#pןð_¿&OO–vJN.Ú¢‰Çc¹ÙPݺôú5û,!!T·.K{½zjgyö,£B™…v~ ?==ß:Ê8E"±¼œË4 …Bà ßVÌØ *èOøoÞ°gœŽŽ”šZt÷¡= IDAT´E½}Ëž>Ö©Ãþ$žØXâóY¯~.ãÌ®Z5;¿É†/™n  u¨ãÔÄpcÏHãØpl¸fºÑ":}š•Û>T›qª;Æ™™I‡±´R“&,ížžtå ]¾¬Ü~ý:U¬Èþõêу4`ˤ'\üýs±ó›løªuœ.ÿž4HKŠûì$E 9::¼y}éò•ÙsDÇD7oÖ,hçöò..gß´ã›>½å¿nÙ¸`Ñù¢äËáp8î çÍп¾·À3N;;Aff¦½½}|||LLŒ››[… ðZÿ_ˆxádËÆÄ”|™=*RÿÓ§m¾ü’3hP¹ÔÔÔ””ggçÔÔÔþý“ÓÓmÕyã’’¾$â¨.3>¾òèÑ.?þ˜•••eeeecc“•••••Uµªõ7ßX«öwuukÖ¬ÂÏ?çåääðù|>ŸŸ———“““—gÙ·¯…ºuÞ»W˜jooïèè( SSÿ}ݹ³ÐÙ9&&ÆÞ”÷%SþìÛÙ)çÜSÀÏNR¤ž<¼pé2ùO˜¼eÓoïvׯßX¸xiàÖÍ—°cgPßÞ½8N~~þ±ã¿)-\&“ݸyk¨ïdœ` 8ǃ6tî3PÝäôôt;'WÜÓàÖ<üÍêׯúë݇ߢmÜÈrG! ,-I($KKåöèÜ9:|[á—Aø¢”Ö»#9¸¸«ãÔ0éû†lÚ°ÖÕÕµf¯m[~iïíýÏõëþ&‡½}YpÆQ#ü¼ÛµñéÞíðÑcïÞ‡oظI‘Å*2Îé3ç<¼w»ØA]:yTñ×>!:r¤ÿ”·ƒñ-º:NM ·”-K—-0/“ðSRXN©k¦®”3$„êÔÁÖGøe¾Vê8ïÝàà`ïêêJDÖ­™6sv•µ¯ýsC()õ3zÄú›†Ù¸k„ïp¥DÖɵ€A?.[º_Z`œ'ê8 4ü\qR®€_&᧦’SuäìL‰‰,í¡¡T»6¶>Â/›ðµrû÷•kÆ-Ý«§Ï‹'ã>Ftìàí¡rÛØjU«º¹¹Î˜=·VÍŸLMKŠKMŒýó·csç#ãC…ûqjb¸±ç‹SH`©ûð%‰Š|ŒÓÙYq↔¦~‰ïÇy'ø®D"iØ ¾¢…a˜Ðа‹—ú¢ÚßìŸ^}ÏŸù[Ý“SRð¥Æ™qâ¹êd˜¥lq*ÙÙè>üÔTrt$§ho$“‘ò„ˆèùó²<ƉBFÂsÕ?=Ì©¸0Hþ"-)NQ¸©:‰ˆV¬;z”Òì®®®¾Ã†Lœà¯ú¦-[4g­U̸zår|i€qfœFð\õÌÌDruªk]Œy†!"NQ(=ÐæQÖ±^%\H1ž¬’RäSêD´u+ű]‰1o•+Wfcˆ‹ž«þiÆ©š*ZX3ÅSý®yöb/ÀØ2N#¨ãÌǺfíØQŒy³³²ˆÈÚÚÚà¢~CTÛͳ„ ÑÑÜGX&YXPƒ,íIIÅÉ8½¼ÈËKïÆ7¤4ñðñ\uÝeœFPÇ™)ЍcáÙøGl좲··ïÕ‹îÝ£† •'=zDqqäæ¦Üž’Bnkmðá›øÖ7õðñ\ueœFPÇ™-Nà÷>A(e‹/÷ìWõYAƒÓ_ј1,gQ/Òçð uœ¨ãdœFPÇ™+Nâ÷>A&^Ê/Љ±­U‹eR¿~Ô¯EF*·oÚDãÇIø(d$Ôq"ãÐMÆiuœyâdNqïdO §5ÈÁA¹='‡jצæÍYf±¶¦µk‰ÇSnOH°¯VMffÆS¥[7ZµŠeQ‹‘··‘|6PÈhâᣎ@w§ÔqJÄ©dWÌK 1ö7o¨];úë/•qPp0ÅdzÌ2o 4l˜rûµk¶_|Áþ.ÖÖ4k–‘6PÈhêᣎ@g§ÔqJE©$(æ) ±”íí[jÔˆå'õîÍ>KÛ¶Ô¸1<¨ÜN«WçYšæg…Œ„:NœUÐMÆiuœŒXD‚b~mb)[H5jT´Y<=)+‹¥=**Šˆˆ*›æg…Œ„:NdœºÉ8 Ž“#N§òå‹7¯!Æþö- ¬E¡’á›rø¨ãÐ]Æiuœ\qÕ,æ£õ9öS§èõk–ö›7µö,rTò!|“uœ:Ë8 Ž“'Î$»bÞ"²ÌKÙ‚ƒ©U+–¢Ì´4òð ~`¹À|Ö,–³høe áê8qV@7§ÔqZˆ²SñæÕY)ÛÊ•ôä Kû‰tàõèÁ2I `I7µ •|uœø’ÐEÆiuœ|q.#(惵{r2Iæ*Ï? £èhZ¹’ìì”' N>>e6t¨äCø¦>ê8t—qA§¥8ìŠyšY»±oÚD>М9,“5¢5ônèPɇðM:|Ôqè,ãÔqçý>î2sÃåhq™-_äÄ܈èÜ9:vŒø*¼ÌÍ¥µkÉÙ™eÞ╲ N§O³° §°0ªYÓ`vTò!|ÔqâK@§Žë8›ýçðxŽ™¹—ÜŸ»7$¢3gèÑ#š0A¹ÃèÑ4bµiÃ2o1JÙââè÷ßéúuR=BdnN•*ÒÎJ>„:N|Iè"ãÔegfFÙP«A›Kiùáá´jËU87nPx8{Æ©!ö'OØí“–F&ùìú •|ß”ÃG'€î2N]ÖqfˆcIÀµ)µåGDPÕª,í5kÒ»w쳤¤Ø?~Ì>iútZµŠFb™dcc$;*ù¾I‡:Neœº¬ãÌÇqf¥´p†¡ˆª^eRtáû\?ÿœÿÛof>>,u¥MšÐäÉ,U¡Æ•|uœø’ÐEÆ©Ë:ÎlqÙ™—ÒÂcbÈɉ¬¬X&U¯Nááìs?Ï={6®];ÓÜ9PɇðQlj/ ]dœº¬ãÌ%’@ Ç ££)/O¹ñæMòP“7V¯NÁÁtâ„rû‹$‘p6´6Ù•|ß”ÃG'€î2N]Öq打I`YÂ…DFRµj,gÏ?~¤AƒØgqw'–Œ3/,à˜r5*ù¾I‡:Neœº¬ã”ˆSIPØŠïÞ±?2 €æÍ£eËŠöÖgΰ·‹Åb±•|á›bø¨ãÐ]Æ©Ë:N©8ìʲó¼ytáué¢Ü^©Mž¬µUB)ÂGø&>ê8t—q겎“ I ü÷==$åž©©tö,EG³<×G»Pʆð¾É†:NÝeœº¬ãäˆÓóí+¦¥ý¿åÖ-êÝ›ý.ë½{—zºI(eCøß”ÃG'€Î2N]Öqr„YÇ×ù XÿIfyå uìXf£ƒR6„ðM6|Ôqè.ãÔe'Iüª¼Ô=”²!|„o²á£Ž@w§.ë8¹Ñ\—/xz5:(eCøßdÃ×\Çéàâ.‘–Ç:‰Ãáxx¸/œ7w@ÿ~ø¦àõïÝ­FÝúê&[Zòeĵ²² …±±± ÔÞkÑÊ=é=[6éø•Þ«¯ù|¾ƒƒƒþ¬Ž_;88äää˜fìVVV999©©©¦»P(LMMåóù¦»ü³oÅ×ôòÙ3§Ïž9=`ͺÙ3§+M X³.-)nÆ´)^õê?iʤ zòç><ä¥â¯}¦Xxêì_¿ø½8ÆID¢”D®,O$‹…ii^é½6;¿§c9;ar¼Þ ¯ñ¯ñZók-\;UÞÅ_3DÄ9´¡sŸ€¢rpqWwVˆÌÍÍ÷ï êÖµ‹ž¬í¥“Gí¢#GúO¹q;ôå'ÆÚM%iIq ÃÜ ¾;aÒTýÉ8ÊWÝVż%..¾[Þ®*wëÑ;..Þ†fÕ굦þlÖ²MyÊmÛwúçú S ÿ¯¿Oµhãm²á+}ðM-|ÍÁ¦%ÅÉ ¿Àä”|ͨÍ8Uÿ¶Î_´¤eËQáa-[¶X°x©ÑË“§Ïöí?¨øÕ¤Â¿xéòïÇF…‡N2ÑoÔS ÿäÉS{wíø6r„ïˆQcM-|ՌʤÂ/|°Š¼\)AWLu,ïá7jìê•Ëñ5@ΪW®^[*•¶iÝjmÀÊJ•*^¿~ãέø|þØÑ#[µio܃’››;~â”][{ó¼Å¤Âܺ™ˆróòx<ž»›»©…¿w÷Nù‹ÞÞk×o4µðU™Tø…VÑÎ"0éŒSþ3)9yËÖí~£Ç^<{*M(tvr""'GG¡Hd܃²xéòÁ? lÛ¦õÿĔ§ÿêÕìííN9d‚áQbbâP_¿€ËL3üOþ˜Rø&¾­JWÃ4gç9³f<}úLž|È ’RRSíuðDó2µcWм‹§ÌL-|ù9â>F¬_»zô¸ &þ£ÇO:wë9vô¨îݺš`øJL*|ßÖe“qŠDâu~iPß‹ˆÚ·k·}Ç®ÜÜÜí;vy·kk܃’š«¨f“ÿkRáÏ™·Pþ¥Ëår322L-ü_4xè†ukŠ1©ðU™Tø&¾­JûYuù=>Ÿß¢y³[‰héâ…¾#GWªVë«/¿Ü´ÃԆɤÂ÷òòlÛ¾SjjŠW½z»wšZø“§N'¢~þ½matä;“ _qŒüEZRœI…oâèJî`px(C\  ãdœÈ8' ã@Æ È8'€3Îrv#–)b Œ3Ndœ€Œ' ãdœÈ8' ãÐ3 þJòórsdR©~®‡C\.ÏœoÉ33×ó‘ddR©TÊÈd% ˜8.ÇãpyØ9qEº)•¤$%^»z1æc”TçI§››Çgûðx\—òîm:v*gi%•Hô8Ý”¥‹D·o_Oˆ‹-Ér¸\®³Kù–­ÚÙ;:q¸8€ŒÓðååæÜ¸~µZ:=¿Äáè:¿ùýОñ3i—û(øÆ½[7º÷íŸ!ÖçÜýÞÝÛ•+Uí7p8Ï̬$[äÑÝ[îßiß±³…¥5vQdœ‘J¢"ûõé_¡RÕ2Z†a4†633kÔ¢Íî-ky<½>àÇ0²¸ØèÞßýÀáp¤’üb/‡Çã5jÞêÉÖ»yyyÈ8qEÆÉT*år¸e· #c ¶H$³OšñÌ¥RG¿‡’d2Ï̬ä§þy<3©LF2)öO€’@u|šrþ÷óìÙÓ–­[?{ö´`£æƒ úŒ>]ñbþƒ}'h'E#FáÙ³çß ñ݀Ϟ=g 0¨ Z )'v €’ÃYuø‚&O°ž¿x1pà3¦Mûá‡A‡ù~àÀ£G7lÐÀÃù$?ÎÎÉ MIMãñxõëy:99œžÎ³´¬àáÁçó±? ã,‚jµ<‰("ìÎf4蜓ˆ–¯X9ÞÜAƒÑO?ùZYY-_±òèáC )_õáCäǘØ6mÚZZZÞ¿ܬI>ßâ¿I>ž ¬džô†jñºüP¹R%üiÐ"íŸU‰Ä+ÖtìܽŽWÃ:^ [µë0ü§‘ÅÈö?µ<´ëÐyͺ¹yy¦¶y*üG)1\¾|¹§§g½zõV®\©8’§®½°)šŒad2F&;°oïÀïÈ_32ÙÀïØ·Wñ«AåÏŸpsuåsúÔß666Í[´zü䉼ýctô»£«»º_«Ç}üeâ™Ôädì"0™Œ3%5µÏ·ý>:i‚ÿ“wß^¹li±—ö&"ìͽ;7Z4o¶-pÇ’¥ËнÝ<111111J¼{÷î?ÿüsíÚµ;wî9rDs{Q“4§”«l1¨„óßZ̼¼Ü¨¨¨ˆˆˆ6­[æäd§¤¤888Ä'$0ŒìcôÇC+zW¸Lõl)5#<…£TŠ¿z—q®ß¸éCTÔœ™ÓûôîimmmccãÝ®í¾=» ö9þÛï=zS×ë‹m¼;ñÙe::8Ì›3‹ˆN9§H&‚öìkÿu×Úõ¶j×aûŽ]ŠLH~XtÿC­Úu¨^»ž¢E>U&“mÜÙ¦ý×µ<´öî¸-p‡¬ÀA»Ý{mÓþëÚõvîÞó?Oêí6;qâÄìÙ³]]]]]]gÏž}üøqÍí…NÑ´y%|Ø;Ñ®Cç:^ »õèsíŸë«×mhÞÚ»v½†=zóäÉSyÏ{÷|Ó gƒ¯êÖÿrØO#®ß¼¥µ”ó¿µ–JdïÞ‡[ÛÚ_¼t­œ­]BBBXX¨ããÇOÂŽ®ïSá*5¯Lgã.~txçùcÕªÕ”®UýÊ8/_¹FD]»tR×á×gÍ™ïæævóú•³§þ -Æ»ì Ú³|e@“&ž?¾?à»~«×®Ú³¯`‡Ð°°ËçÏ„‡¾Vš1pç®Õë6ôôéþòéCŸn]׬۸cg|Ò¾ý–­XÕ ¾×ÝÛ×>pñòe½Ýf¡¡¡ 6”¿nРAHHˆæöÂfh,'¢Yi™¯^½:æä¶Í¿„„†þ4rŒH(¼véÜö-¿¼~óvÚÌ9ò>§LúôÙ¦ kŸ=ºç?v̯ûj'á,Ž……¹[ùò¯_¿ªß°aÓ¦M_¾|yäÄoÃ#ßlžÒËõ5¯Dgã.FX…xùuéÑËÆÆgÕ´KËW¥¥¥‘£££¢Eq|Q~j{÷ž_‰háü9.ÎÎD´xá¼B,S¸jõZ"êÕ£»¼åà¡#D4~ÜKKËŸ†ûeóÖôóUÌ2uÊ$kk–‡Ä:rŒˆü|‡ñùü‘~¾A{ö:zlì˜QD´wß"š;{¦£ƒƒüÅ…‹zštfffÚØØÈ_—+W.33Ss{¡s4æì‰_5wéþÝÐ"-rÊä‰ÖÖÖíÚ¶‘ÿ:yÒkkëí½‰(òÃÅjó-,ÜÜ܈ÃiÖ´I³¦M´“q~ú¥*U+ÇÆÅ8~Ì«~ƒÈ‘é9²rWÆõJç´¬Egãΰ}WoXÏÞ}ìWP€žfœÎÎNqqñIIÉnn®ŠDS‘tQ\|<UüôRuä3òxJ2©D’ÿÿKÍxjÖ´Q~^îÍ;w}Ñ M(еªšóæv¹¬˜S·“î×í3¢o_낳€¶hù¬z·.]ˆè·?þT×ÁÝ͈¢U®†a%¿èçÝÛ—7ÿ¹„ˆÖ¬‹Ó333¯ß¸9ì§…™ñÛ¾}‰h÷Þ_ssswíÞKDƒ¾ Ÿ4lèD´bÕê´4aZšpeÀ½Ýfýû÷HHHHHH0`€æö¢$i2†‘Éd¥«… ¶h=œ1þÞ¼ ©çéÙ²Es"²øï™ÚÈ9•/{rp°¯U³úƒGGñ_¿vM‚Àíè‡*D4سö›Ùsƒ‘HòñÌ!­ÓòYuÀöÏߎíÙwú̹Í[·K$’rål<ëÖ­ïUïßÄnÈ–––¿î?ÔÆ»£ƒƒÃä‰ã‹“qÊç[8x¸iËÖüƾòóõ-\BìÏ0²?þ:´g_ùò.S'O;zäË"‘Höí?мu»Ê•*Ž=êü…Ke¾yw┿ß)éÇüðáCûöí‰hÈ!ƒ ’÷Q×^øM~Hïõó‡®Uœœÿ=ú›’œXï‹&¥t3Îú¬Y÷øÉS‡Ó諯æÍ™¡¥|“T¯4 E÷>â;búµ5ªVòéòõݺuŸí©œšÚ¥q“óËWeÆÆµ7šoi‰? ZÄ9´á›¡c3Di‹²•)nÛ¼ÞÚ|Š•uÿî›=!'3ƒˆr²³_=»W¥z]'çÄøè˜¨ˆí}H&•×8=¸wìÔ9ú¼ÃäçæÚ¿û§Ñ³2ÄŠF™Löðñ“Þß ¢õk׸º8¶kÓÚÜÜ<;;ûæõIÛv6—É®X[ñ""[n\ëU ôè¡}ýú´µwÂ. †þæÎµóû ”ÿš9ÒÊÛÁÐ ØÌ,âþÃÚm[U©^   ã„RÊÑ>¹PÆÜÂâ‹&-e’\CL7)gÁ†f¿ÊÊÎîÖ¥Sw¥I6ÖÖ­½Û5iÑœÏçóù|dœÈ8¡t24•-?Ï€oNÉÐ' 4ŸoáY·v`•Ï›[ZZXZZü;'2N£ÄáǓɤe—q~þ1â 1<—È2á©èÈ8áÓŒ“gV¥Z'÷ï¸W¨Äã•Éva4_1Ã…‡¿¯P©ªTªßÖpˆËåŠE©œ’Ëå`ï@Æi,ø–Ýz}söäïKfMJu}¤ÓÍÍãÀî@Í}xò‘•íéíûV¯¾¿«×4™ssëXæ…ÔÔ… Ú·k§££cÞªÕXç1»wn¯v(Eµpõßo<ªâV­é÷ŽíïÿðvÀÜù%%%µ­âɇbbb233ƒƒƒ}|žçç;U•ʯw*S“%6¶Âvа,éf§<¯8-êwXE£xÍœ±1éõÝ›?k¾”å ëIDATñöòTß­±|¡‘ûöP·ÙûùþЈHJ©¬»v/((ì;`paáO«TPPØàÂÂGObgÊî!vÝÞìéâ:ñÊÕkê÷øü…ÁÝ{ô0hè¦Í[jü CM"‘X˜›øÏº~ý†ⓦ>rTýèÝ»÷ öôö¡¶rŸ9{ÎÑy\·7{±sؽwc^ÝĹ:~íÏ÷ïõʼn/O¿{÷ÞšÄoŸÓ=yt†×,éS/}÷ÍÅoÏÛtŽeöíÓ'84"--]•_ë8 rëúÕØè¥ö#ìT7lÚ|ùò•#‡|ŸúµL&[¶bUó&'';88dgg !.\¸’’bggçïïÿ|¯\G(óï(÷-Pf^”÷•ÚÏUf^TŠŠ*¡ÓüFÞ'Ǽ¼üKiiBˆoS¿+,(íøßï®ÕX¾Åa¡ŸïÿË‘cÇ…‡Ûà`dx(¥ÔL-[š혲{zÊ®Ý{\ǹ˜™ýÏ9DS¿»¸Ï®¾Ourµ(,Bý/**>æôñ£‡þñý¥g®+7/oýƤ·ßî%„ðóõY›¸A¡P¨JHÜà>ÍíéíCmå\4oÎì¥ÿcoÊŽôô2àÕMœ‡ ±07omazèð‘›:~dð 2™ÌÄÄdá‚yçÏSÇ27­_geeÞ³ÏÛáöK£—=ylæIç¿þfgÊ®„ø_÷O{ö}¾8<ôõ×Û-ü(ðäÉ/j[ENNÎû￟••µdÉ™Lû"/þÑ}QQª%#O*õœá¾1i‹bSÒ'3==¤RiÝåÓ××KLˆ_±rMܪ5+WÅ'&ÄëééQJå1mꎔ]•••BˆÊÊÊ”Ý{g¸O¯ÖfidDÛ¶m ½<=._ù5þõÈѰEAæ­Z™·j¶(¨¶å«R÷{ÇvûŽQ‘BˆáC‡9zLq+3ó̹sîÓÜžž·¶rË d~yŸ—oiùÆòØ(Æ4”æ÷[õÜÜÜíÛ«nwhß.77¯Æf—ÒÒ–Å­º|åjYY™Bý •™šš- Z¨T*32nmùt›ÿœyÉÛ¶VkvãÆÍˆÈ¨äm[ŒŒTSîßÿe¤“³ºAmkqssB„„„ 4H1}úôŽ;>÷+¯Bª#q]"éÔ_qr…Bê¸P¸.{Šªf9øÞ{wÂÇ ‰‡½ríǤMëëS¾Ö'¸&$nX¼°µ…¥Ôd66»vérüo'ǹ8?ñ·>}z[Z¾Q­MË–fªªl*„xø0×ÊÒRu»•UmËW°,,|ôçä‘Q1;·&„ð›å·rµ‹ó˜øµ‰>^ž5|-²¶roLLX·~ãÇëMŒM"ÂBìG0àMœæææÙ99:vBdeç´jÕªÆf¾³ç††Ù jll\RRÒ£wÿú,\"‘ØØt^¾¨WßÕz˜›ëã7{e\¬••¥zbëÖÙ·§mÛ6Ï\²j/,„ðö~¡SvëèJ¼%#•ÿ<,ö !”¯w—Œ ”d‰ý[›ãà“éë»OøQpàÜ™¾~}ÊwõÚµ½Ÿïß´~Ýâ¥Q£FÚwª}OO)5Çôi¯Kçâü韓£—,®ÿ{üÎÝ»ª,sîÜyf{33So/Ïõ“TwG:دŽOX¹:>--}Uܲg©­Ü½zöØ’´A©Tž9{î£àЋÎ1 A4¿OÕǹŒY½ìanîÃÜÜ%Q1®c=Pajjr3ã–º™\.7Éôe²ìœœEaÏØÕ}0yê‘cÇ<|XUUuïÞÏËW¬~»W¯jmfúøÍòöêÛ§÷“§|øAphøí¬¬ÊÊÊú)`îüº“ÊòåËØ¡C‡xá y¹<#µ|ó{å)>r!×å)>å›ß“g¤*žu5ËÇëúÕÍòžYmzå+++›7?híšUNŽ#c–FúÌ{úËš”R£ j[\\¼=y§±‘Ñ[ov¯ç\®cc–ÅååççåçGÇÆ=³}QQÑ–­ŸÙtî¬þgÃÏ×;é“­þ~>úúz5nj+÷ì¹óoܸùøq¥R©TTU1 ¡4¿cœÍŸeçà$„p3zAà\Õt/Ï®ß/--U}ÖwÇNÛ¶m¼<==VÇ2ü}·ïØY\\ÒºµÅ°!C⫵IOÿ!=ý‡A!ª»ªµøxÍ”ˆ-“§ºÿòËkëNþ¾5üXUGGW^^&30Tí¥œœœþ'Z•—éêÖ« †ÞŸ–mð’HÓ…®ºB‘Ÿ'~<¦TCßOË´k\ÖX¾°ÅK¦M2 ?!„ƒýˆÌÛYá‹—®XC)›Vµß’W;™Çô©¡á‘ŸmÙ\ÿΟ7'$,bðÐ&ÆÆîÓÝΞ;_÷z ôë»níš'*¥cÝ©Ó{'¨§TÛ>ÔVnÇ‘ö>~³oge[[wZ³zcŠdï–x™¡áèwÝJ‹køE cÓ’çºêÃÇk_ÿ–¤¥§{îïêï¨Uüººƒ‡å<¾øQ#]OUÓÆ¹®º6ÕTsKÙ(×UoªRÞ¼™áîé}ö«SÏ5×L?×±ÎãÆºhý¨§³'~×íÐÎͣƠšr?'s¦ß¼³__`/ qp•Ë—ËÈì5'— ϸêRYQ!§¯(%Ô¢b–øûUTÈ£—Å9Žr¨ÿŒ …bϾý™·o»8a ‰óU¡T(5íh(¥æk×ÎÊ~Ôèr¹|¤ƒ}àÜ€úÏhó»·ÚYY­[»æÉ“m1 y$Ί²zJËÈË©©¶”²L Ïéè>mªû´©/0ã˸ .à¥'NÕ—;OH¦§´5¥”hVâBhåz^qÔ”RИ¤tHœ q$N8@âHœ q€Ä 8@âHœ q€Ä 8@≠q€Ä '@≠q€Ä '@â‰$N€Ä 'Hœ‰$N€Ä 'Hœ‰$N8'HœxåèJ¥R!ĉÉôh1ÕÖš&qš·yÃĬe~¶ôh1ó¶–t€&KœÝ{ö»œ–zx×…BAw€ö‘J¥¯Y´y³÷;t€¦òâm¶Yè?àIEND®B`‚ocamlviz/doc/hash1.png0000644000175000017500000006747111251431715014556 0ustar tonkartonkar‰PNG  IHDR8úxš~sBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìw|E€Ÿ½»äÒI„ЉéMz)‚"¢R¤÷Ò ŠH¯J –O¥÷Þ{/éÒïn¿?B.¹äZ’KrIæÉoÙ›òÎû¾;³773;+a„*ËÈÆÂ@ ä .¾'¥S¥üP£¥Ÿ¬‰“i9Ï …"û´@åèt:¢u0©Œ¬RKœßwWß9ПTi\Fn6Ó'w%ñ±âãˆÕäŒÆ@ ²¥JR¥ÀQí@x@ç–)ô£$vÞXèA|lbG@t@¹òkD–ȭܱ@ž,ÇÙ͑Ї1\ÝØ1PhâtÈ:ˆ}!:@ È\ÝÁÛ]:Q¦ª¯MåÞ»ôŒŸvÿB¥ò\9Qáñ(hât¨ÊT,&·YäEÜóâžkI1£@é_úDwg¿ÛIþU±©b@ Ø D© EÙw{«MŶ¨ðè$ä)O–#k Æ qþÅd€¬…¡ñè 3–Žóå£gmˆ×…à}·º6ÕK ؈mß ÇƲY’^ È ÈZÐŃ6&Í¢úL¡‹);!o–£$4šÄ‡Uq1tZ‰„™Ô£½žµ!:*ЧO‰-V &1ÞO.Aß¹«zÂzçݔѥï‹ÎL÷\iS傜¦[1ºÕAMñp*Hdl(çäûÓ_õ4§Õ3àØ‚Xêqβô=#ë@› ¡±ñ—¨6ABÖ¡ÿ4Wέ}Ï­’Y®¥{¦Ê ½GèÝx£²’t(èçHA?µÅr ñ<.F“øH¢¬!Í(@‚$qó΂KÈT £D¤7œCx]×Íóç‹u y¡Züë|–5#6î½âÞ`cÁ½V9E °w »gnç]èt:&ÌÌ‘}§¨Z¾6Ë—®¤z»æŒÛþ6‘ò³œVÓ€û¿I”lc~«‘nß”ãÔ—1V§r:-È ¶ÿe-'$ÊNúž4WŽœ'7™•W·wa“y­-'äF¼¾œº½ óJ3îˆ4/àëd±H>×Oèç0Rp"ü2§«ßÂÅɉןW¦_TªoRü©Š˜ ÇÔ)H}ZO02PBåEi×bÜSØ×/( #¼÷Ú 8{3nÚöýzÏŽÜ‹¼ÀWë0s¬?í‹gÃÙÉ8Ll?-+¿Kû½(^°,ÏcÂøþÄWì½´C/¯CÍù¸ÙdYGDL§îìcÓ¡ùÄÄ¿à‡á7X¹o*]ë ¢ kž„ßá»Ãþ¼Zì5ZTêJç‚< ¹Éêÿ>ãÆÓ³úzðdÿŽÓ8880p}S¢o]}XÙ÷mÖ7aã€Sð)4èR€ŸÞ2jÿ»_–·­C‚¬D+¡‹—ÐFÛz¸]mй~3åèâ-—m6oÊ9¹)ˆ×zøpz[A«Ê!¹ ïèŒàZ4µú»ÐuIyή‰ îkõÙ¸z J¥ŠÓß$Æ ¹YÚø,˜>ˆOn·\Žöå—uÍwŠ•uîdzy­-§d­Ô|§ç~ àô¶@ƒøšï¡Lýhb,ÛÉçªÄ:##)¹ЧV‹K\’d&­,÷ô)ͼÊó—ÛÓé‚\€»sA""Â)XÐ÷Òn+%>;ì]ЛøçZ"ïBÇÁ}˜H\˜'Y,GNHþ_ê5Ã=œŽÐÇ™Êkm9%« F§"œÿ%À ¼F§"”z­Z#cå@òú$˜iÞ‰[]NRóVqÊ»¹QÒÃ¥B,Ëhe P(H€N–9zçK>'A'n$‚ÜMdT^î…(PÀIƒB%‘ ®®^„†…¢ÕÊÄ…A!÷¢3z­ÂQ¥fÄØ!ìûo/žÅÕ añþ ØÚX‰„h‰¸0ÛÖׄh)QöËv`®œ„—ÃõÆâÍÅ¥·œÔ2S‡YÊ“²Háxù“AÉüB£çîѬuéYEŠ+ûh*5“?ǯü‚g15j7%î%%‹÷À.0SO]²ngÀU R|Ofe{HG9.EpeoÚ…ÎWö>£ò¾¦mI]NвT’"ñ°†—¨Ý øàO9Wò&•ø=u$26VKiOOމw) ò[ÿ]FíWš1yÜT&|þŒ`Åe*—©Iß7ÇÂÒ¯üQ»*Q¨à§£Ø~Ó'Íbþš©xziéÞ|0kÿœ ÁXð“|J»3¤ßhƒ²Œ­ëQ: s´¬÷É;ûxøˆÎouAR*xüì!ÿüû7EppMû â³VáèàÄì3ؾsEqrWâVJBmæ¾"ØRªÿ©0öš’ÊoøšÌ‹”â{ÒB9I˜íˆd²œG ;•ßHÜõ0)Lß1¨fª““ê{ÿå¹Êh¤ÚÅ•ço‡“DxÄR'¼$7œÕ<àÁ œ EQÂJQ ªZ³Z÷·uB;%0ò1guåýæCY0ík z$2&”“—2gæBž=Á»ŒŽ°çÄž]â½v½ømãA"¢Cùnß—\ˆÇ·¦#‹Cï&Sضi'A!ìøo•ÅòµK«Úª¤ã×cß2 ÓDæù¤µ›gŸ´É‡3¦N˜ÁÔ 3ôágT°¢0À>¤äÃXœµùMÊUX_޹ˆ-˨ÒÚ—’Õ èÏ/ÿý,]å@òyºG "bcQyH\,òŒ–±å)úÂ…c^¡¬åù®è~ʼhÈ«ÚBHJëd öL”ËmžÀÔ¹ ÄEéÐiA厮 ¼K;¡t’p-*!)àðý]ìºƒè š8Nž¥xñÎ+ŽðÁoö mœ¥³Ä·ßm!øFœ¾¬N³*pq[”þ³¤°.ÌXš_Ï­gÅòUD¯‰…†‚\€™_Ö%kd|L’0üž´ƒr ø:ݘÈÒ”†Ó©{ 渦 Â9ÔÉN¸K·ˆ†4ÖÄ#K^ñôDRÀ>ÇË4(cµLÀÞQ©ÁÃϺ/FgïÄÃX]íê*Æâ’?ªž6Þš0ci\|ÀÅǸÞÖär «°­«ñË/PýwZ^+‡Ô#é˜>¸ïAóx?<;²³ä%n„>¢º{94‘‘Ü C*~r‘D[D§@ Ù„$ÁÃ;Oiß »Må>¼ó4Ͱ~^*R¯)HÇHAðí(ö?¿‡îUŠÇ{áæÄ‘ hâ½ñV©J‚.&Ž®ˆN@ ²rͼØóÇÏY"»â›^y¶HÑ)ZÚG8·_É& ¯£‰ÓqzÍóÄ‘Í ‰xï% ·ø¸  àò®ÈUE AΣ*Wüì>JxpòF ²,¶4 /“òå†îÑÈ(kw'@×Q#@ ämÒ®%4Þ)}@ ò6Fž/0Ú)}@ ò6Æž9Ó@ 1}`—”­X•Û×.å´vÍñ“§3n"OŸ=¾abú@ô ŒQ®b5n]»˜-e%]ƒ¬*3;mÉ æ/ôgÆô)´jÙBÔW@ °ÆI”­;ÊU¬Æ›ouFÖÉá²N¦mûN”«XÍjY9y4hÒ‚¸Ø8£q‘‘Ïy«SW"""¹uõböè”âdU™ÙfËËz’tÔªÛá#Çš)™×®ß Y“&9^wÄ!qˆ#×F0±Oõù÷¿ýá{÷íÃÅÅ%²rî¨ûZm~Üý“Ѹ­ÛvP³Fu x¸g£N¹Ãoé±çÖÕ Üºz½ìÁÁÁ©ŸÍÊ”Ìøøx”v`›8Ä!qäÖ#-™Þ¼¨¿>¬Z³Î lÕšõ ø¤¯A˜V«eÑ’/¨×¸UjÖeä˜ñDEEéãËUªÎÖíßÓ¼U[*U¯MÇ.ïqõÚ5ƒøÔ ˃|º›Ñétáñ |»u;Ÿôí¦¼ýÑ®c*U¯MóVmÙ±óG«u}øð£úk ¨\£}ûJHH¨QÝRæ+W©zš# Kþµ$לïm‰·wA¦M™ÀÁÃG Ê_¿i MZ´¦|åíIÒ=¥¬©_é)ÿ$$h˜;õ5§v½Æ¬Û°IgI¶¹ú#9…ÑN,ËVm[·"$4Œ3gÏ!Ë2ÇŽŸ$<<‚6o´4õͪµ\¾|•ŸÜÎñCÿá¨V³À©¬ã'N±cëfN;D›7Z2eú,ƒxcå[««¹£r¥Š”*Q‚?ÿ÷·Aø¯{~§Fõª”)]:Myc'LaÄÐÁœ;y”­[6rîü«uíÿéP>îù'ÿDZƒÿâçW†9óM›òüæ•óúcöÌé¼Þ¢™Õþ5§%ßgöHíÔõ àüù‹üüãvn\>gÑž›WÎè}amýJOÖøeÙòܼu›Ÿwíàß½ðôY€Õ×Ã\ý‡8Ä!Žì8¬î¤…BA¿>½Xµf=«Ö®ç“¾½Q( EïüqÓ¦LÄ·H\]]7jíýÇ ÍŒé“)âン³3ŸôíÍ•«YókÕû÷cmŠ_zë6n¦¿>FÓ;©ÕF±¢¾Ìý|†Õeýñën6¨‡Z­ÆÝݱ£†sèÈ1«ó>zŒ­Û¿gé¢ú0kükŽìò}hh(sç/¢qÃá“'Ž¥`Á‚úÏéµÇšô)Ü_~úùW¦M™€o‘"x¸»3eâ8«eg¦þAVabŸ‚ôÑõíN|ùõ7ìùý®]¿ÎÊå_¤IDÛ·:„¥|€gús'''4-Ô³Šúõê PH;~’õërðÐa¼< P£z5£é—/[Ì×߬æ«åßàæîÆÔIãiÙ¢¹Ue=wžþK¹rõ111@Z_˜âÖí;̘5—ëVáêꢷƿæÈjß' Ù»¹¹Ò¸QC>Ÿ1Í Þ§paƒÏéµÇšô)Ü_‚‚ƒ)Y¢D†ôÉLý‚¬Âø#‰&†L¥upp ×‡0nâTFŒƒƒƒ^FÒÿÂ…¼ù~ÛŠøø˜,ËX¹Ia*•Š˜˜œœœO·®–Ø¿«×­§~½:¬Ý°™þ}û¤‘Ÿô¹ZÕ*¬üz²,sàÐa&MýŒ#ûÿ±J×a#Ç2qüš5mŒ›«+QQÑÔ®ßØ¤/’ÎCBB2|óç̤XQ_ƒ4Öø75ÖúÞܸ|.]å§·¾d¤~e¶N.TˆáW¦tš4–d›«?@SØì-‰û÷åÊùSi&Ñ£û{L>‹¢Ñh¸qó&£ÆN°Z~ÅW+°vÃ&bcc  dúÌ9¶R]OËÍyÈÏ¿ì!44”fM›L;jìnݾC‚Fƒ,ËhµÉ‹-釓ZÚÑ‘G3mÆ,«ô4tû÷£v­šiâ2ë_{#½ödÄþÌú¬KçŽ|>w>ψ|þœ¹ Y-Û\ý‚œÂÛ[J›?à“Y³zõ@P`eüJ3x`ÿTùÉJ ›=s“§ÍdÅÊÕøøø0ð“>üù×ßéÔÕ<’ûõaâÔéÌŸ“ôÈœq}ZµlÁУyðð!eÊ”Áþl«uûùgÌ]èÏ“‘O)âS˜~}zóÛÿô/^.”»p‘ó.2aròÐûËgkýkÜ–´çæÂ2Šuõ$‰ôÖ—ŒÔ¯ÌÖÉ¡C²Ð)º¼‡,Ë þ49¯%Ùæê@ äRÓF ä‡üL˜›ƒ* @ ÈjÔNúó€G÷è?d”ØæX A"6[S  w#Þ’(oI@ð1R °É#‰@ òF;ïÞÌn=@ d#å*§ÝÏh§àÉ£ûY®ŒÀ>hÖ¦3þú9§ÕA6Ò¬Mg£á&_ˆôfמY¦ŒÀ>øs×\Ü<q½ ¿tï~™&Îì[eä]Äõ$!ë´h_¾—ÁæH I ”J%’Bi{ù ÃØäÕÉ ï ët<ˆàðáý<}bsù …‚B…}hبž½‘b5À^@`€V«áø±C”*Y†®ïŒJeÛÛD\\,gŽâä‰#´hÙG'›ÊGtѲ¬ãé“ÇÔiÔ…¤@«ÑØôP)UԮߘ€§OˆÏisA D§@ "ƒN§C©R!ë´ Ë6?TJZtÚœ¶V È1dYfÁ¢ÅÔx­5ëÔgÿ³ëx,¥O¯½òŒ! ã$ ÷ ‚,áæÍ[T¯VUÿ¹ZÕ*ܼu+ÃéÓ+Ï¢S L"~Ñ YGtt4..ÉO߸ººáôé•g 1} Œ’•S¢³!€‹‹ ÑÑÉ_ÚQQQ¸ºš~D×RúôÊ3†èÈY|ù›òåËqáâ%ýç‹—.S¾\¹ §O¯zDëvø°Çûtïön†Ó§Wž1ì¢SðÛ2gÞž= @–eîÞ¼š¥å%õ¼²ºœŒ`KÝìÙN{ ·ú'»ôNz$15aaaÄÆÅYÌï¤Vãå啪 yI’˜8~,Ç5™&e;·”Þy–ÈP§ åp†$I(àA£ ˜>u2EŠø¤[ÞŒYsæ¯ß¥|ùôÍd')íP©Tõõ¥c‡·>l0jGÇÒ,g°u=°Gò÷57þHbLL ÓfÍ4û|úgFü<=³TC@`[25Rp÷æUââãY¿~# /åù‹lÞ°6Ýr‚ƒƒìºC’¤ž[hXóø³bå*ÂÂB™;{–Ídç&lU왬¼æv‹‰éY—öÕ²å 1TöÅÒeÈ2Œ=Y'¦‚ÜF¦ªéóq/ŽŸ8i'Ë2k×o¤E«¶T¨\FÍ^ç›Uk n)‰ù•¯¤ÿœt¾yËw4jö:¯T¨lµÌã'NÒ¥ÛûTªV‹ŠUkÒ»ï'ì?x(î?ìÚMËÖí(_©­ÛuàØñé²½ —S&Mà×ßþH·ÝÆìKéH܃þ›•«iÒ¢å+U£qó–¬X¹ Ng Ëº ›hÒ¢*W§u»ìÚýsºlÉ,™­ßÿð#ouêBÅ*5hФ9ÛvìÔÇYãS>ÛùÇÔ5X¿q3~å+QöÕ*ÔmØ”ÉS§óâÅ‹4ú™«wÖú*;H|F íŸîå“J¥’«×®èÃnܸŽR©Ð‡YÚæX Ø6yú é†åââl¾zízæÌ[@:µ¹pæï½û ý—°výF}š”¿ŒïÞ¼šæ—ò›7ÙûçoܹqÅj™ÃGåܹó|¹ÔŸó§3äÓAlÚüm½Ož<ÍžŸä«/–pëÖm&Nž–YWX­£)ûR³rõ.^J‡öí¸tîíßlË¢Å_°juò/ñ›·0{î|ªU­Â±ÃûÙ±u íÝk[ÒCfêÁ¦-ß2aÒT|}}9¸ÿ~ÿõ'®_¿¡·ÆI¤öivù'66†¿ÿØÃ• g7f$ÛvìdæçsÓ¤3WïÒSw²ã/3R*$ %nnîú077w”JUr˜¹# »#Ó‚øø6nÚÀ[íÛÄ}ûÝ6†„““}?î À–o·Z-ô¨;4Y#3** µ£#¾¾¾ IÔ«[‡õkV¦•=r8...´jÙ€Z­@XX8sç/ ã[ɶ§ÇîÔö¥æ»m;è×§7jµšþýú$†oß¡O³ac¢ÿ'OOA// zy1yâøtÙ’Y2[Ö­ßÀô©“(\¨½¼˜1}Š>Þ?$‘Ú§¶ô©k0xÐ@Ê•+‹Z­æ.o°ïßÿÒêg¦ÞÙ¢ÍØ Sï>P(”(UJÜÝÝôaîîn¨TJ}˜x$Q È]djMAÊaîÅ‹3%ÕöY@¯¿ñ¦Aøã'O¬.£`ªÕËÖÈ3j8 -¡S—wQ*•T©\‰qcFѤq#ƒÍ“§O(V´¨>,åyVc‹zðôÙ3}~cXã‡$RûÔþ±tÍOž:Í¢ÅK¹rõÑÑÑúºžF–¹zg‹6c+tZ š„ø4áú‘IÂÑQmæè¨F!)ôaÆò û%Ó ÃÃ#X还m;vòÓ/{èѽ›>¾¨¯/=âÄу.T(ÓÊZ+³Oï^|ð~w®^»ÎÑcÇYè¿„QcÆsòXÚuÁÒb@[Ú]¨7ÏžBáÂ… 0XÝ_¬hQ<|È“§O)Y¢üE˜Ø¢$¥yôø1¥K•JoLa ÿXºæC†"((ˆu«¿¡i“Æèt:*V­™î_ÄYÑf2Š©_ôŽjµ>>uXÊpGµZŒ¹ŒLOxzà³iS(äíÍBÿŽ|’ ÏÇ=X°h1‘‘Ï‰ŠŠbÿƒôîûI†Ë³Fæ !øzí:•+U¢aƒú8ª³ïÑ1[ÚÝõíÄaèu6ÇšuèÑý=}šÞ½>`îü…„……μ‹2kFºÈl=è×7q˜|ÖìyÁœy ôñÖøÁÙáùå‚GwwwâããYè¿$Cr²¢Íd #kœRt zЇyzzé—:©ÕbM@Ë°ÉæEjµš¾÷báâ¥|6ãsV,_$þbW«ØòíVê6lŒ££š×j×¢_Ÿ>.Ë™ï¿×‹sæì9$I¢v­ZL™4.ÓvÚRGk9|²¬c×O?³výF|| 3zäp>Ø?Ey=Ñh4lܼ…ú›Qªd >8€?ÿ÷·-ͲHfêAïžáääĦÍßѤyK¼¼¼9|¨>Þ?˜";ü³tñBf|>‡õ¦H!9YÑf2Žñ§_N{ô˜ÜQIš 8¨¿AXœ6!‹ur'Ï##ùcÏ.îß½“ee(•JJ”*MûŽïàæînU©i£òÃG ~¦<ð×ϼٵ'Ñ/"³JWtÿܵE\ož„¸X¾Û¼Ž¾ƒF•¶N88ªõ Í¡ÓiIˆ7½óá¶-x§Ûû¸{zgJ_ 7²ëû­ø½R–F¯·Õwª®_¹H¹W+›Éiš[ׯðjåjúÏM‡ÿû›ûwnñFÛ·ps÷ŒÇ<ºGÿ!£ìc›c@`æOˆ‹Í]‚¼Å£wø°Ï@TJ¥~ú§"uM†dÊ:,¥BI£f­8¸ïVË@`;}t0*2íAnCÖÉ(”ª4Ñéd©°” IDAT­Ö°SpòÀÿhв=ZÖäyRÞÔò ¥¾,k@`{^8â»÷sZ SÔP41øU¯G'£M5RPÿõvÈrb¸©ó¤¼Æd*N.n€‘òR!:À öÙ+¥š9XN(Ø)Š?èä´_Ò:tiF ´Ñ‹çIyÉT(¬ÐPt Qdìsú@R‚R-å´A†QH’É‘]ªNÁ…S‡¨ß¢1/ž›} Yhlñ<)¯˜>Yƒ®4ôð*Ä–GrZ S,›;ÙÄHAÚ…†7¯œ£^³6„š@+:øúKWz¥RAaŸ¢4iùnNÎi;ìI¡Díä‚ÚÉ%§UÙˆÙNA|\,öïïì«tèÚI;ˆ¥äÇïÖ3tügV§OˆãôÑ?t€vow#æEÚwÕ @S˜íÈZ îÝáÍÎÝ(^²L6©”Ëed#;HC¥RQ»AÖ-÷G©,@ Øæ;2hµZb„À$‰;H¥qÕh4¨TiÝ«R:¼|üD<Œ%û"ÝOü|u\Vè¡§s¥EY*ßæ)¸p០ÈÚÕ«¨^½z)–{e™…þKغ}’$ÑãýîŒ3ÊìfW¯]cþBNž:ƒ»»;cF ç½wßàÎÝ{̘5›“§NP·Îk̘>•WüÊÈ £Cç®<}úŒ»7¯f•yÀŽ÷CÄ@&IziLÒqþüÞ}ï=î޽˻ï½Çùó âíqÛØœfëöï9vâ$ÿ±‡¿~ÿ•cÇO°cç&Óß¹{O¦G÷îœ9q„Ý;·sêÔ}ü°£¨]«&ÇàøáÔ¨^á#G§‘³tÙWôü G–Ø$râþcˆèdùåH,ë8á<ÝߟqcÆpïÎ-ÆC÷÷ßçü…óú4Ö®?ÈOü¸û'Ɖ>>>Œ=’~Üm2ý_.gİ!¼Ù¶5NNN+V”…óçèãoݾçƒàáᎇ‡;CâÖí;2nß¾ÃÁƒ‡éÛ§·Eýö8H›ö©P¹:MZ´bû÷;õqZ­–þK¨S¿1«ÖdøÈ1DEEéã˜=w>¯ÕkD×ê±f݆ô¸F d1âþcˆèdšä€9sç1uÊdúö탓“}ûöaê”ÉÌ™;OŒ˜áæÍ[T¯VUÿ¹ZÕ*ܼuËdúcÇŽL½FͨT­C‡"""ùIŽ7Z¾ÎªÕkyþü9‘‘ÏùfÕZ½ÞÂ@Æìy =rjµåçäGÀ¨øxîßoý–sç.èãV¬\ÍåËWØóó.N?ŒZ­fÞB}ü_~ÍÍ[·øí—Ýü÷ž={fKA6!î?†dxGÃÁolMVlïq² ?­=Ç¡=7‘$‰¦ËÓ©o ’¦h,Åç&d]ò«*·lÜ€J¥2xKÕûÝßãÝwº}¥ ‘èèh\\’Ÿ‡wuu%**Údúа0nÇÎØ´~-¾¾E?n4ouìÂ왉ªîúé'¾Û¼Q?mÊ$«ÊÙƒ¸ÿ’á‘‚{?HÓHâÐo7¹u!€éë;0mÝ[Ü8÷Œ#ܶ:>·‘4 T*Ó¬0.0ÄÅÅ…èèäF…««éMsœ™4ažžðô,ÀÔIùçßÿôñc'L¢ëÛ9úçOŸ KçNŒŸÜæÌ[È”I¬~kØ7Ë¿äÀ¡Ã´ïô6Í[¶áŸ}ÿêãy£m{üÊW¯|%ê5lJpHˆ>>((˜R%KXUŽ@ È~ÄýÇ,y÷Á±¿îÒ©_M x'îkÞ©_Möl¼@ãöe­ŠÏMdÅ:¿ò•˜;{߬\M@`~eü˜0n4'OŸáÇ]?Fùre™=ó3jÕª Àñ'™¿h1×®]G–eê׫Cß>Ó¼i›êgkÊ—/Ç…‹—hÔ°/]¦|¹r&ÓW|µBš°” ìäÉS¬]ý jGG†DÚõôñ×oÜ Ûûä÷+_Éä àÕ«±vÕ dYfÿƒŒ›8…“GP¸p!vïÜA‘">Fó.\ˆ¥Yy,ìqÿ1$KÖ<»A©òõŸK•óâÉÝp«ãs20wXËåË—ùó·ŸYñÕ2®ß¸Aßþƒˆçß¿ÿà›å˸rõšAtø¨±œ;wž/—úsþôq†|:ˆM›¿Í«mË;owÆé2 Äé2Þ}§‹Aš¤Ž@·w»2wþB"""‰ˆˆdö¼ù´L1gW®\Y¾Y¹šÈÈÄ9½¯¿YE… åõñwo^58’ÂL1länݺMB‚Y– ÞòÑï3qÊ4î?x€F£áú 9&Ù¶.o3óóÙ<{@däs>Ÿ3/Ã~¶GÜ É’‘‚Ø NÎÉ¢\ˆ‹ÕXŸ«e~ß¹ÉêäíÞíeuÚQ#‡ãââB³¿ôGކ‹‹ ¯·hÀ½û÷õqQQQ¨ñõõI¢^Ý:Ô«[ÇêòrŠztçá£G´n×€{¼O÷nïšLÿÞ»ïðøñZ¶~“è˜Z¶hÎÜÙ³ôñË–ø3mÆ,V®^ Àkµk±tqÆ÷¿hóFK Æýñó+Ã’Å õqƒôGb-öêC``~~e:x>~İ!Ì[àO»Ž‘e™aCgX@`{ÄýÇ,é89«ˆÑàìšø&ÀØèÔN*«ãsZMo½÷±ÕéãbL/`IwÁÄчä7*.T…"q'åÈØQÃY°h º¼‹R©¤JåJŒ3Š&Y]fN IÇeâø±&Ó¤îI1ŒQ#†M[¶ì+lݲÑêò-mÒ±Ã[&) >4€O 0ïààÀô©“˜>U,0ìqÿI%Óê”éÀ·tÜ Õ~p+Œb~žVÇç&db££¬>²r¡aŸÞ½8ú8»ØÁ˜Q#¸pñ£ÆŒÏ²ò@·È’NAƒ6¯ðËúóD„ÄÃ/ëÏÓ Í+VÇç.’7/Òé4›™ Ï* ÆÕkש\© ÔÀQí˜eå  oa“} ’ΓQlòV9‚Ÿ"$8Ê5êdù^ï¿×‹sæì9$I¢v­ZL™”µïªAÞ!ÃS{HtP‹.je(>7‘ò-‰~e«pùüqt-^Þ…|öˆÇîÒ E{ÐiÑè´¤%blŽÉš°͛Ѣy³ X!A-4ÌW¤xK¢ÚIM•u¹|î7¯ÆáààHƒ×ßBÖ& IˆÏaE@ 0x÷A&I½O£Ú‰*5ëáê^@ß!Hˆ; Àî#™ÅÈâAGGjÔiˆNGB|\)&AúHw§ s¥Œo‘eŒþúOˆÓ@ È]˜íH(•JtV.ˤ\hhUzd”J‰@ Øf×HJ¥ýÊröÄ´Ú\º q–#Ý›Àè~²ŽÛ·oQ¼d´Zñ*e@ ØfG ÕN¼Ù± ¿ÿü#3' C«#)ñõ-Æ–u+­N¯T*ð)Z‚Öí:kývÇ@ df;J¥ŠÎôî?…R X÷þg)ßp‹F“ÓÊ@`€Å…†Mšâ L ‚¼ŽØ§@ `f¤àÏ][²SA#®·@ Œv šµéŒ‹›Gvë"È!Äõ˜)ˆ~™zrq½³Žˆ`–m›ËÕ;—sZA:Q*•T(]‘‘=¦P°€wN«#d9F;q11\:{ŒÐ €ìÖÇnQ(ðòF–eÂCƒsZ\C~÷›B¡à¯ÛûP‹¡U“*H*ñOnBÖÊ<¼Ê’ogÒ¼D£œVÇ.ÈOm:/ÚªP(ðô.LÕZ P;;§‰7Ú)¸rþ$EK¾B“6Q(”Y®dn@§ÓrëʞܿM§¿XI~÷›N§eõ° ¼ÚXÍÓ¸ˆ;Yæ6”eàú™Oؘïê¯1òS›Î‹¶&ÙtõÂ)jÖoš&Þh§ 4ðÕë6&úyD–+˜›ð-^’kçN¿¤“üî7I'á|©::±+h®EÒË·õ×ù©MçE[“l2†ÑNNÖ!I’xÍo*$IB'ë„_ÒI~÷›R¡dþ˜•‰oÏäJ: joë¯1òS›Î‹¶&Ùd “ ó’lðMÆÈ¯~S*” Ó‰W`åb” e¾­¿æÈO>É/¶šÞÑ0Ÿ8 CßdŒ|ê7¥B‰9ßÜTò"J…2ßÖ_³ä'Ÿä[ÅHA¾ÉùÕo*…™|sOÉ“¨ÄHQò“Oò‹­¦;b°Ó$Â7#¿ú-qú ñۂ܉R¡Ì·õ×ùÉ'ùÅV1}„o2F>õ›þ Et r-búÀùÉ'ùÄV1}„o2F~õ›RJüB‘uùÓþ¼€RÓÆÈO>É/¶ŠNA¾ÉùÕoª—#²”?íÏ)d9!…Ú%ӲĚãä'Ÿä[óÅô¬Ó‚&É1ó7‡DyÇ7æÈï~³•ýJ…JŒäA»g{ï4%Gý–iYI×0·“ŸÚt^´Õæ6!_,4|þ·? ÎS°ßw6‘gKßTª^‡«NÙLž-±g¿e¶²_ùòéƒì¾©+Yš'ïçhÙ¡ƒ1âŸ^%쟯Ñiˆºø?\«¶É”¼¼²Ð0?µé¼h«­m2FžŸ>ÐÞ$úðzt ±×ÿE]¡E¦eÚÚ7öèëÜ෬Ėö«Js榒eZ*#»í–µ Ü[ü&:M¿îFyÿ»(\½2,3/Lä§6mÍ ›ŒaõôÁó/XþÍjöý»Ÿ€À@\\\©S»õxõëP¹f=®˜ØOÙÉc-²NCȚȚÄ=çÃ6õ§Èä“H.2)8Ñ7ÍZµãïßB­V§IòüùszöÀæu«ððð°Jž½Õ~«\³žÉ$YUÒƒ­íW*”€Îàéƒâ¥^áñƒ;FÓ›‹K7éxâ!ÃåZ*#›ŸºJÊ/2bG&ôHùô½×_cdu›†¬½—§‡ì° (8˜•«×sàÐaƒpvq¡zÕ*|ôAwš5±í5³Ì&#X=R0füdJ”(ÎúÕ+(ê[„ˆÈHNœ<Í7«×Q¿^“ù¬!Ëz`’ŸIi+ifËKÊ_»V vÿ¼‡îݺ¦I³íû©^µ*îîîËËéh²Øo—ÏׇU©Ußà³]øÂÆö'~¡HÈ:Ã×&§þlm\zH¯œŒ”k)­l1_†I¡dÕºõfÓ ì×Y›€¤tH—ü”ÛÛ}ý5F·i[ɳ Ù`k``õéÏÛ:°aÍ7ñ)Ì‹Qœ¿x‘o·n§i㆙*+ Yd“1¬^Spüäi–øÏÃååû—½¼ õÓæžFxwÿÁfÌüœÃGŽ¢ÕjiØ >_,ñ§P¡Büûß~>Ÿ3—»wïQÄLJáÆòAîz1›¿û–+VH…òåY²x!U*WNS\‰Ò¯$þ/ãÀ£ûw¬*`ÅÊ•¬^»Ž¨/èÔ©#sgÏ2={i‹V«eá¢Ålÿ~'QQ/hÓº5‹ÌÃÕÕÕ*[L¡ åé†þ”ú#£G6šnÉ’% É„îýuÑWq«ÑÑ¢ì$TfÖ¤l¿ãÇŒ`Ó–mqñÌQ‹m6¯µiS>Š‹‹cî‚%üﯽ¼Ù¶5“ÆÒ×KmÛ¢ÙlëW߬âÝ®oÓ¿_o}XOš5mL³¦õi5 K–}ͯ{þ@£Õ2ð“>|Üë»±É “1²lpÔªY3çrþüEâbcÓÄ_:s€KgŽ&ž¿ 2b =?ìÎÁ}p`ïoø•)ÍBÿefóLš:“¡ƒúsâÐ?lZ·’ .¥)ÏØ¡‹ #bËý0ÏèÑ£IöEXMÜ•¿¬’­?Rø¦rÅ ”,Qœ¿÷î3HóûQ­jeÊ”*iÖþÔòŒù=eØšu›¸zõ;·mäÀ?¿£V;²déò\ç7Sá–|õÕ׫xñâý¶›]ßËÙ³ç òÛ«ýÊ—ï`—eY¤þl*î㾟ЯoΟ=ÅÙSÇ)ûÊ+Ìü|Ž>~Ĩ1Œ5’«—ÎóÃÎíœ9{Ö@αcÇÙ½k'—/œåͶm˜0q²Ñ2Þ» ÀÃ{·yxï¶Õå;q‚¿ÿü#‡„ÿ’/ŒÚòÕò\¼t‰?~û…s§O¢V«™=w¾U¶˜:âžÞàîôD_ýW_žF£álOÉàмv•e™ø'×x²º7aû×X”Ÿtè§ÌÕkàâ¥Ëìܶ‘‹§XÕfóT›6ÕÆ_¶ÝÀÀ@~ûù{öüô=OŸ=cùŠÕV·m{³õÀ¡#tîÐÎb¾¯¿YÃíÛwøaû&þÚ³‹€Àû²ÉVO|±hë6naú¬¹<|ôï‚^´z½9Ÿ臇‡»É|?íܪ?wttdÄA´íÐÕ ]ê>L?–7ÛwdάVÙbŒçEePŽF£á•åáéôe_BvM§@“¾få'aî-‰)ÃÇŽ—§§Õm6¯µiSºýöç_lXý5½ëÉı#é7p£G ,·m{³5<,¯‚^aÕ^K^Gpñô~Ùó;kW~¥¿¾ãG°+›Œa²S Iˆ7øììäÈÐAý:¨²,sïþ¶lÛÉè “Yùåb“ùÎ_¼ÌËWrýúMbbcÄw9§L—:ÿ¼Y¬^¿™«ÖâææÆ¸QC-.܈½ò?t±ÑòÌÝ4 ñHn‰C Q.¡æ»fåÈH¡o­êU‘8zì8u_«Å‘c'(àáN¥WË¡IˆO·ý©}‘2, 0ˆNïô0ˆK)+7ùÍX¸%_…„†PØÛ[ÿ¹Haoƒüöj¿RzùHbª©õwoM_ʯ¼>íé3g™;o—._!&&HôIRüªo–³ì«¯Y²ì+ÜÝݘ1}*o´Jî zzyêÏœí07ÅŸ*ÎRù%K•Ð.YªAÁÁ†r^žðúm ‹K‡-Æðj3¥«7ÛGëåhµZâââ Ò©T*½.Ú¨PNnøÍ½bÞ)PJJ‹õÀËÓÃà³¥6›×Ú´)…††âëSX_´HaBBC­nÛ¦È)[ (@`@>…“§ÑÎû€Z ZèÓ‡„P´Ha‹vä”MÆÈÐ$„$Iø•)ÍøÑÃhöF³iÇOþŒÑÃÓ¸a}\]]ˆŽŽ¡I«öfóT©\‘eþs‘e™ÃGO0cööþ¾Ël§FýP8{õÛ,}˜Ù› ‹CR»R`Ô?fe[¢ßDzqË6ê¾V‹Í[wðqÏäFžû•J%±qq8½œg ˆ4ˆ/TÈ›ÍkWTÄ”ä6¿¥Æ’¯ zyñôÙ3J/À“§Ï òÛ«ýÉÓ†áæ~0$Å}:xS§L¢Eóf¸¹¹E•êµôñÕ«WgÝšUȲÌû0nüDN8j¶ kÊMÂRù<¢L™Ò<|ø˜BÞÞñIç… æ§];ñ-RÄh™–l1…{£ž8–¬¡—“€£££Aš„„¤_UP é'îñ(”f}‘’¤k˜^,µÙ¼Þ¦“(èåÅ“§O)Y¢8?¡`Š«¥¶mŠœ²µQƒºüúûŸôëý‘ÙtÞÞÞùtÿû{Á!!h4Zž°lùJªU©¤OãîæÆÝ{÷ òÅÅÅãè舃ƒŠGŸðù<ùÆòLœ:“Ûwï‘€,ëÐê´iô1v8Ôì‚[¿­ú!—¤›CÊ#ùæ £®ÓÑ@©¶J¾©¹à¦Äž?þ",,œF êYmÊó å˲éÛíÄÄÆÄœ‹ â»uéĬ¹‹xøð1†›·n3qê¬\ë·Ôá–|Õ¶u+–,[AXX8aaáøñµA¼½Ú¯R¨ ó±&âbãâP«Õ8:8òðÁC&Nžj?tøHnÞ¼IB|<².Ñf³e˜)×ÃÃ۷o„Y*àó9s !$8„Y³çðvçŽFËëùa&NšÂý{÷Ñ$$píÚu†i-u‰júòÖ¯_oôHÒE]²:’¤H×ü«J¡²XÕqKm6/µiSm\–eڼђ…K¾"$$”P.ù’¶­[éã-µm{³uPÿ>ìØ¹›•k7òèñ4 ÑÑÑ>zÜ mÇömY°øK‰|þÿ¥ËíÊ&cX½OÁ€¾½ØñÃnæ.\JTtÞ½iX¿ fO×§íõaw>ì3ˆ˜˜ÎÙÀôÉcYòå׌›@áB…èõawþ—´0ÏDžæM3vât>zLéR%™=}²ùŸ7) *RÑàæ`Î>¥oE£¶Z$Uz èÓ³ŸÍ^À¬i â-ÙŸRÞ´‰c˜5ן5ë7ãS¸}zö`ï¾ýúø?z 8l4AÁ!”.U’O>þHŸÛü–:Ü’¯èÃìù‹i÷ö{¸º¸òA÷®9vÂîíWšØ¼(õgcq çÏáó9sôø EŠø0 ?~Ýó›>¾õ­øéPî?x€Ÿ_–.^d ×X¦Êп:w%::š{·¯[U>@×jÓ¦Ý[¼ˆŠâ­öí9r¸Q ìôèÙ‹ÀÀ üüÊ0lÈ`«m±†~”øÎƒØçá’Ú I©ÊðFJfß’h¤-'a©Íæµ6]»áëi’œ9²¡û1ñ2:uKüeݺes† èkuÛ¶DvÛZ´ˆ›Ö|ͪu›è;p¡aḻ¹R­jeV|±PŸv`ß^|±|Ý{~‚,ËôïÓÓ¾l2‚Ô´QùÀᣄ'×üýóv^kÔ<ÓÂsY§ƒøa’£+dp(àô‘ýyÂ7æÈ-~»{ï#ÆNâ—l»å§­íßµç[žAB\Œ-ÔX@Öj¸?µ ºèä9X?ÿ{HΖ¹fݺv0?TlÏä–6DfÚvn³Õ²Ê¦Öß×xtþCFåí"I²ŽÈc“çæ=ÆF’œ2'8øÆöì·Å_® ŸžÄÇ'°ô«´hÚØæ×ÃÖö+J¤¤éA–#)”þ æ7 ØÈßTN™ò¿Ù‘‚\€=·é$lÕ¶sƒ­é%Ël2‚é5yáO¡ÀµçZ½M®½6€J)™yÆ7æþìØoE}‹Ðåý޼ݽînn êßÛîíW½ÜÑP}8úVÀ«õp<êvéÌk™–§ýuný³ã6ôg³¶ lµ›ŒÖu“1¹·Sl€ÂûÔú G¢,VÍ6våߘÃ^ýÖ£[Wz¤ÞV: ®÷Qÿ IDAT‡-íW*” ™k†‚¬Àó­É€mªGҺ܌½¶é$lÙ¶íÝÖŒ%6!Ï¿%À±é`Àv6å%ߘ#¿ûÍVö'>Î&™ÝÕX`ߘۼ(7‘ŸÚt^´ÕÖ6ÃÌ>9ïûEø&cäO¿©¤—ûˆ^A®%ñŠë—–üä“üa«™‘‚ìT#w!|“1ò«ßšÿ‘À¾Q¦c££üD~òI~±UŒdᛌ‘?ý¦T(‘%)ŸZŸ7HœW0-ùÉ'ùÃÖ|±¦ÀÖßdŒüê7•B…”OmÏ+$íh(0$?ù$¿ØšçŸ>È„o2F>õ[âÓâ‘ÄÜL^xú KÈO>É'¶š)È/ÈÂ7#¿úM‚\$Iù¶þš#?ù$¿Øš§w4Ì2„o2†ð› 7#êoZò“Oò‰­fF ¦¾ÉÂo‚ÜŒ¨¿iÉO>É/¶Š‘‚Œ |“1„ß¹QÓ’Ÿ|’Ol5Ù)¸xæDvê‘«¾ÉùÙo±Ñ/,'Ø5ù¹þš"?ù$¯ØªP(ðô.L³6ƛ٧@ ØŠ¿ÞžÓ*:ŽÐ ®^8EÍúMÓÄ›ítë72Ë@ýì\÷!OÆY)ˆyas…@ ä:Îh¸ÅNAþXZ!Àòš‚|²âR ‚üŽå‘Ñ)àÒ©CÔlØMB|N«"0‚¸>‚ô êKÎ üž³Xë+¦’;WïçÚƒ“èty³£ P(¨Xª•ÊÔ7Ÿ_¶¹Ì­ˆë#H¢¾ä Âï9‹%ÿ[1}|zíÁ)Z7x•Ò!³zÙ%mÛI¥ÒÆ;¢.Û9âúÒƒ¨/9ƒð{ÎbÁÿéš>Ðét(*tytJA¡P¡ÓéLN™ˆ©ûF\Azõ%g~ÏY,ùߊ͋R ÈÔ”9c{)¿ò<¸{3GÊÎ]䇺iä:)êKÎ9¿§¬{y£f7™ì¤îUÈyt=AJ2;RðíwÛ8uú4_,ñç˯¾æùóL™'îIz=þœ›¿eø¨1üþëOVç·‡:–õ°\Ãe9ùHùøì³±|÷íܹuÏdº‡3xà8êÔlEͪ-Ðo!Á¡úøÊ±}ë.Ú´|—UšÓ©ý‡œ9užÝ?þF»6Ý©Q¥];÷æÆõ[úGýo‹Y–õGâg²œ8 àæîÂg3Æ0qü,âã â’ÎG¯ÞÝ8ttÿ‚Ÿ_)Ì[föè‘“lúö+Žüƒ·:¶f`ÿ1Ø„õ¿àØÉ?iûæëLŸ:_ŸgõÊÍ\¹|v¯ãà‘_P«ð_ôµ>>3Gj›SÏ]™:7jÈÝ›WùjÙZ4oÆÝ›W™1} ÝÞéÊÝ›W¹{óªÉ¼–d§Œÿú›U\º|…=?ïâôñèÕÌ]°È í¡ÃGØñÝÎÿ¿½û¢ZÜ8þnH € !T¥©R©Š(rUEáŠÒQDPí'¡¤wÄ«z¥ÈUÔ+\)bEéRD RB5„ìÎïLÖ”­I6»¾ŸçÙçÙ3söÌ93»ofg&?nÑ£´U÷Þ}´î›õZºèíØ¶E?ÔFÃ^‰õªÎï¿ßªÞ_¦í?~¯6ܯ¯Œ’aúíÀ^IÊ±Žƒb†jà€µóçôÁ{KôÓÏÛ]®c^0>Þö¹$}¿e«V¯Z¡ß|©S§Nkæ¬9Nû´¿¾š=wž¬V«½ŽÙsç©G÷®*Q¢„Û6ŸNLÔ¼×ßÐm·Õw¹^™§Íœýš8 U+þ«ë¾Ôñãæ˜ï«¯×©G¯g5nL¬ztïêv{ –íÅ0 -Z¼Tݺ>-Ã0ÔåéÎzwÑ’õü¼}‡>]ñ±íßãtZ¯gûªWnÚ¶e³¶ÆoRõjÕ4îÕ‰¹×Û6Ô°ÿ‹Õ¶m?éòåËn·×Œ~þíÀ^M§V÷¶ôx¿÷G¿;+Ï<ÝÓçÎ>³ Ãд³tñâEmZÿ•V¯Z¡­?üè²m™Ë.\¸ 7ßZ ÚµjÙ§¹cgÛ¼?û߯…æ#ãù¨Ñ] 5wîÂe†¤««QãÛU4¼¨"KFjÀ ç´ùÛ­Yæ7DåÊG+<"\]»wRRÒ%ÅŽœeÚžÝûìË|ôá§1òeE—+«â‘Åõòà¾újí{y^yµyówº»E³ôçßÅ«y³&-Wí¦Z9޼¿üCŽ}EåË—Sdd¤†¤5k¾Ì2Ï„qqªP¡¼"""Ô«Gw%%%iÜØÑY¦íÚµÛ«:ãÆŒR¹rÑ*V¬˜ú<ÓK»÷ìu¹>áá:uò”Ξ9«Š+hÒ„qõƒ¯ùj|¼ísI5r„¢Ê”QT™25r„>Yù?§ïO‹æ*©OW}&Iúí÷ßµ~ãFõìÞÕ£6ßqW3-Z²TãÆŒòh}%éãO>ÑèØ‘*_¾œJ•*©ØWFd)_¼ä=9Z ç¿¡Ö÷ßgŸîÉö”] m/GŽÕλôHÛ‡%Ií~H;wîÒÑ„„,óü¿a*Sº´ËikWª¦M+<<\%K–ÔИڴi³$ïÇõysU©RE {%Võ6R³{Z)nüD?Áåúlúv³–¾·LsfN³OËÍ8O>=áê3kå§«ìãT¦tiôàDãŒöÔkØH‹—.ÓÜÙ3ìe®ÆØ™@í·çd¿%bZjJŽçÏ÷ïªî]¨Yó;Ô A,eÛÞ£Y3ÞÒ/¿TròeI’ÅbÉRO‰Èûë°PÇÓÒÒ¬ö×'OžR»ŸÎÒ®ìuæ…³Û@ºº=äMµëgy7~¢$iÍÚ¯4`Ðý{á›jÖÄùo~ölwù~ÏOœ8©ûÛ<”e¾ôuÿ{Þ’%ŠÛ_‡…†8œ–––æU%"‹9]>{[%éµYÓ5ï_oiÖœ×T¢d 1T­ZÞãtýóƒ?ÇÇÛ>—¤ å¢í¯+”‹ÖéÓ‰.û´oŸÞš:}–Ú´¾O3fÎQŸÞ=Óëu²Þ™Û|þÂ-^²L£ãÆiÑÛó¾Gæi§NVÅòÑNëŸÿö;êоn­U3Ë<žlO¾½,^²T‰gÎè–:·å˜>tð@ûëÒ×]›£žìÓ~úy»&O›©={Qrr²¤¬ýá͸/®Á^Ðà/È0 úíw½ýïEêÿâý{á›×íே;:Nÿ^ø¦Â‹ñj¿÷wõgß×2æw¶ý8{îê3ëôéD•+e]>º¬Û¶Ø“~ôêèш£;vÚ—s7ÆŽêÔþ÷þ’D?M„…Ѹ Ã3p¬–¼7/KÙÁqóœš5o¤ÈÈâºt)YÍ›<â°gï“}Z™¨ÒZ´d®¢££Ü.“ί¸:ì²÷Ï:sæ¬Ú<Ü^[6¯×ƒÕÿ¥ÁZ»z¥GË»;¤“Q^6ªŒ>X¶X墣.ï¨.WÓò£Îìåuëܪ7æÍ–aÚ°é[9Z›×åtýòC Œ7ÓŽ&$¨Ê 7H’ŽS™Ò¥]öi«–÷hæìyš6sŽ~Ú¾]“&ÄyÜæR%KêÙÞ=ô¯·ا‡……)99Y’¤sçÎeY®lT”ŽMPµªUÖ¿ôÝ…êÚãY•*URÏôêaŸž›í)¶—””}üÉJ­[ó™*UªhŸžpLOtú?¯ððp§udŸöâË1>t°înÑL%"#•”tI ïjfŸÏÛqͬzµª9b¨îhÜÂaÿ&&žQÿ—jÒ«cU±Bù,óx2N¾›})ûtoŸgŸV¦ti;ö‡ýJœ„cÇܶ-£ìúë+kÚäWÕ¡ÓSjÚø.EFw;ÆŽêÔþ÷úDCÃf“aþæŒç†Í¦jU¯×ÛjÒ„9YÊRRRT´h UÂÑ?4nÌ —õx2­cǶŠ3CG'(íJªìûUnjϱLn9Ö9{zqñøéçíªW·Ž,’¶ý´] n«çv{ý–wþgG§#GŽ(-5Mû÷ÐÀ˜a®ër3-¯u–*YR‡ý–¥|`Ì0<ø«RSSeØl²Z­žõEn4>O“4qò4I<£3‰g4aÒTµkû Ë>µHz¾Oo-xûßê×ç ó¸M/^ÔÂwÞUõjUíÓn©y³¼ý®.''ëĉ5v|–åkßNã&LÒŸžÐ… 4aÒÔ,õ—ŽÖÒwèÃ?Ñ›óÿ> ÑÝöèÛ˪Ï>WýºuT©b…,Ó+Wª¨:µkë³Õ_x5î)))Š(ZTáEŠ(!!A±câ²Ìç͸véÞ[Ÿ­þB§O–5-MÇÿ©©Óg©~½ºÛÐ÷…zî™^jx[ýu¹Ýï ¸ßö©ƒ}ǫ禵}èš8uºÎž9«³gÎjâäi®Û–­¬|t´îhØ@+?]åÑ;ÚæýÚÿ.x}Ibæ×ÙËþÙù½Ôd–²Qciú´75äxœÊ–R·îOè‹/¾q{I‰«iÝ{v’,Ëõ\Ÿ¡:uꌪT­¬gžíœo—|8«Ç]ý?ýü³êׯ+C†~Þ¾C·™Ï=qs9¦íÛµ-Ç{?Û»‡dyWÝz?§S'O©jÕ*ê÷Ü3yêϼÖÙ»g7uøçSºt)ÙÞæûî½G/¼Oǵÿó}´ä½÷5:îUý•”¤²QeÔ¼YÍš>Ùáþº}ÇNmß±SÃ^ùû\’Œ>÷d¿÷wõ{òùëíóìÓ¼ø¼bÇŒ×Ý÷ÿC%JDª{—§´qÓf—mË^ÖññÇ4cökz²ÓãnÇØÑ6¨ýoiÑ´±±áÛïtîôŸö‰kWüG’Ô±÷Ë:™pÈ>}õ¶ÅjQ¯oZ 6îøB6Ìz’Ïoûwë¶&­t>ñ„ŸZW‚q|jÖ½]ûvþèõrÏ¿8Hmj£‡,Üû¡/âör5Œk ö{†_ý¦>ýè«ÏWºŸ9Heîÿõ_¤¯gëöOÚËO$ü®gûô䜂¬¯mÁ{O"9;ºâæ¨ ü,ØÆÇ›öÚl6}øñ':|äˆþñ@ë [×@}x5Žk ¬ãÄ)ÓÕ¿ï³J¹rE“¦ÍÔý­ZLÛ|ÉÝ:æâDß rs¢!ü/ØÆÇ›öÖ¾íNUªXQ3¦LÅb ºu DЇWã¸Ê:V¬XAmÚ=¦””µºç½Ø¯oÀ´Í—Ü­£Wÿ%Ñb Qš5U¡!,„¬¶4…XB$§¿¹þ &¸ÏøìݾUÞ´7}þ Á³žÍÿýxuŽk`¬g·§ŸT·§ŸÌ650Úæ[y=Ñ0Sª¨][?ìÛ [!=Zb Qõr·r¤ H1>ðÛ‹Ðïþ•÷#™*¨Q®®j”«›çF[ŠdÍçÿ:ZT ÷|~ÃfÑÅ#6Yþ(¥É]þ«k¯+¿ *„@K*~F¶Ôü9gÍzÙPÚeK¾Ô•!,ÂB,²¥z³”¡’•Ctì·óºpá<¡F¾œÇî«@nÉUûBB 6íIú„€äñ{ÓzÙPZJ>‚pC¡á–«ãŽÇx *Uª¤cǸÅÕèë/þ§¯>ÿŸG󆆆©eë‡ÔªM[· ùq.|qL [ú#·|BŠZòÔ.Ãæø A Ž#)€Ç¾Y»Z£&ÍQxx„ÛyS._Ö«#ñe„çÂ' ÇÔÈý_ãÖCi—Còµ9a†BÃCò~„À°HÊVr È÷P°nÝ:ýë_ÿÒ?ü bÅŠ©U«V=z´¢¢¢òû­F¥J•ìϳEÉ\æhÃ04aÂ-Y²D‹E]»vÕðáÃe±XÖáÏ£4VkšG´$…GDÈjMóq‹Üó¤‘U0Žs~r·¿åe÷¤~_Ä15 ÏŽ̾g›ýù€õ eM1d5Ï!°È¢Gk¿¤U:È¡¿¤{_³ß‰×]y†ÐC·–k¦§kŽ•$-Ù7J¿œùÎ^Þ¨\;µ¬ü”¦oë*«áºo CƒE Ž#ùµ$½õÖ[êÛ·¯vîÜ©õë׫dÉ’êׯ_~¿M@9vì˜Ë;£ÜÑ|K–,Q||¼¾ùæ­[·N›7oÖ²e˼ªÎyÒ¿@fžîÏîÊÍÇþl2<{ ø¦¡|ÓPRúOÖL'6¯ÚA7•i¨±ëžPÜºŽº9ê5­ò¨Çå’n(´¨Ej Ѳ}qúÏþñz¼ÆPûû_[´œ©>@‹÷ÆÊjKó¨Í†5xOHÈU(X¼x±îºë.U©RE<ð€vïÞm/[¶l™Zµj¥ÈÈHEEE)66V[·nuQÛÕmùòå>|¸Ê•+§råÊiøðáúàƒüݬBƒþSÆ9ž>$)-Ù’eZãÊíôÉž×tîÒ)»tJŸìyMM*·ó¸<¤ˆ¡"éuF»^{ãµ÷ôwŠ*V9ý=m=UsŒ¾9ºT\<èQ;­)†liÁ{$2W¡`óæÍZ±b…öîÝ«|PC‡u:ï† tûí·çº…Á­·Þª*Uª¨E‹š;w®¬V«½lÿþýªW¯žýuݺuµoß>4³P¢QÐ\íïÈÄÃ#2Ò8Z¦b©:|fýõ‘³{U¡T ÊC‹¦!È(K¼|L5¯m¤›¯½S§“$Cj^©£Š†ÓW‡ßõ¸Ö|>ù± å꜂‰'êÚk¯•$õíÛW³f9¾eâîÝ»5fÌ-]º4÷- r‡ ­V«öï߯Q£F)11QcÆŒ‘$%%%)22Ò>‰%”””ä¦Jô/ ’»ýÙxp”Ýš’é‹6Ûüá¡Å”’–lŸ~9õ’"Â"í¯•g ¦÷MÓÓµÍs vRÙb×ë¡ê}5ckÝRº©ž®=F’¡Å»bõË™x§í ‹ðl½U®ŽdI*V¬˜ÒÒrž±yófõìÙS¯¿þºªW¯žû¡¡¡ªU«–æÍ›§÷ßß>=222Ë—Ô_ý•åK yCÿœíïø›íŠEÖ×+¥+Cd½’ ¬W,Y—Ó’UÄVÜþºˆ-R—S“\—§%I Éñ^;ŽmÒðµ­5|mkí>þ½ºÔ§ÏöÏןgªÃM1Z²}¬–lÓã5‡¹l§--o—4ú[¾Ÿh(I+W®Ô /¼ ùóç«Aƒ¾x‹ "#ÓE¬7ß|³vìØa½sçNÕ¬YÓM+”è_øSöý3 ×´”ô;f¼v´ÌçÕ ×Õ¶¿¾áºZúãü!§åÕ¢oÑñ‹‡Ü¾÷ýÕºéŠ5Eßüö¾ CŠ*^Y{O}¯½§¶¨lñÊ.Ûéìêƒ`ᓫƯ÷ß_õë×ÏïêƒN¿~ýôË/¿(--M‡ÖÀõðÃÛË;vì¨É“'ëĉ:qâ„&Ož¬N:ù±Å… ý‹‚änG&†$›ã‡ý*ƒÌ¿ÙKÊþþw¿­ÒcõúéÚˆ²º6¢¬«×OßZé°¼L©(µ¯Ó_ñGW:}_Ù¤Š%nÔý5ºjñOceØ É&%^:¦š¥©fé;u:)Áu;ƒ8H>¸OÁرé¿É´lÙ2Ëôýû÷Úö™¯;ÎxžñÛâC=¤^xAPTT”Úµk§áÇÛçïÒ¥‹>lﯮ]»ªsçÎ××<é_ 3wû[^öwOê¿Zd>™õŠ!Û•¿OÖ[ðô?*ýù3KÓO^_¿ÿ#EEVRÜÃËÓ_üH›®°Ïo/o»\IÿHßþ¾Âé÷vhH˜z4ˆÓ'{æ*ñÒqûôvNS·c$Iïn-ÃÈÙοW̃•`^‡g×ݺ*/ì\­sÛ¶mÕ¶­ó»RY,9R#GŽÌUý)44L)—/+<³;r……ùÿ†™žô/² ÆqÎOîö·¼ìïžÔï 9¦gâè‹ö™Åί^3dèÃgëÃg;-ÿxç,­Øç¸<;«-M¯~ýTŽé»ŽoÒÐã­]¶3Ó›: 9®½>Õ²õCš;Èብم……©ek›#ƹð Ä1Í~¤Àåm.…5ïC½»k§³# 8ßÛ/ԪM[îq`œ Ÿ€SóËÓW ´Hþþ·CÚéäýv ²! ^Ư²¥æs (b($,/ ô¸WÛ9ä•ͼœÏ'À?xØN«Uéÿ$1Hÿé¡Pà"ÿ*­´°3 +’uZŠ Ëß+í­i†,FˆäA;mVéÒq›J-©R¥®É×vB ÀMí¼ÆßM€.CÁÙ³g ªÀÏ8R(p«–ÍWxxQ7ÃgîïÐÝßMÈB À]IMUÛNÝüÝ ŸX»â?þnB®ùä"àZ_»WH €¤\ü|P§NíÚµËmA€ûn×úö›µÍ¦Æ-Z©ÉÝ÷ù¸UÈoŒsáØú_°ŒçÀcñ×iÔ¤9 ÷ìz¼:r,Aˆq.|Sÿ –1àçƒ<Ú´i“z÷î­† ªY³f>|¸íå7nT=ìå111:yò¤ÇËשS'Ç£qãÆºŽ¬Ö46hI ˆÕêþøZ^ÇÇ0 ͘1CMš4QÓ¦M5kÖ,™n•æ®þ`Œãœ_|½½¸[ÞW 똆¡ÉS§«þítÛwiò´Yú;³õ6ªQ“jÔ¤…ÖoÜ”¥ì£?ÑÃ<¦ÔÔTŸµ5XÆ€PGï¾û®zôè¡M›6iåÊ•*Q¢„†j/çwÔ¥K­_¿^kÖ¬ÑÍ7߬z¼ü®]»²<† ¦'žx¢@×1˜åu|–/_®~øA+W®ÔŠ+´eË}üñÇ×àâëíÅÝòðÎ{ÿù@ñ[¶jíêOµæ³ÿ)þû-zù‡ç?A“'Ž×„ñc7îUûôãÇÿÔ¤)Ó4sÚ)’·W R¹úùàƒ>Ђ tòäIÝxã?~¼n¹å–ün[P˜?¾ýyñâÅ£¦M›Ú§½ýöÛYæïÞ½»Þxã —Ï,55UK—.Õ¢E‹ò«ù…^^ÇgÅŠ0`€Ê–-+I0`€^{í5=þøãÕàâëíÅÝòðÎGÿýDC½¬èèhIÒA/kƬ9z²SÇó>rTÍš6•!CÏ¿0@Rú‘†¡#^Q¯ÝtóÍ7hÛU®ŽlÙ²EK–,Ñwß}§ûî»OcÆŒÉçf¯Í›7«~ýúË’““µxñb—‡ÿ]-¿råJÝyçöÞóv|~ýõWÝzë­ö×µk×ÖÁƒsU?‚/·O>àÚU¯nûëºunÕ'ý}} ƒ±Á§IDATåÊú.>^ññßë†ë+K’–,]¦¤K—ÔçÙÞÒÞ`«#±±±ºæšôöгgO½ùæ›ùÚ¨`õË/¿hÊ”)û£Nô ·L™2Z¼x±×ËÛl6½ýöÛš;wnþ6ú*’›ñ¹té’Š/n©K—.y]?‚/·O>àž£þNJr¼Ž9B1CGH’¦M™¨ßÖ¬9¯éÃÞÓÆMßjȰÿ“ÅbÑô©“Ô¢y³i ÊÕ‘‚Œ@ IJK Ž“R|iË–-zñÅ5uêTU©R%Gù®]»¯Î;+66Öëå׬Y£jÕª©zõê>ia—Ûñ)^¼x–õ¤¤¤,BžÖàâëíÅÝç<㨿##sö·$ÝÛòmߤ­ñ›Ô¢y3 2\/½ØOÕªVUÜø‰š2éUMž8^c3op5âDÃ|ðùçŸkذaš9s¦êÖ­ët¾%J¨gÏžÚ¹s§×Ë/X°@½{sˆ+7ò2>5jÔÐîÝ»í¯÷ìÙ£o¼1Wõ#8øz{qµ<¼sÓM7jÇοs×nÝ䤿3{sþB‹ˆP·.OK’ŽM?ß iÓ&:|ä¨ÏÚ y´hÑ"MŸ>] .´ÌlĈ:tèÒÒÒtúôiÍž=;Ëo”î–—Ò/cŠˆˆPƒ |¶…U^ǧ}ûöš3gŽN:¥S§NiΜ9zôÑG=®ÁÅ×Û‹»åáÇm¯i3gëäÉ“:yò¤¦Íœ­'Ìå2ûöïׂ…ïhÊÄWe±X$9>ßàjÅÍ‹òhÊ”)’¤Gy$Ëô-[¶¨xñâº÷Þ{£C‡éšk®QóæÍ5mÚ4——ÒψîÕ«—/W£ÐÊëøtìØQGµ/ß©S'uèÐÁãú\|½½¸[Þyªó?u4!A­l+Izºó“úgGç—l§¦¦jPÌ0 2H•*U´OÏ~¾ÁÕÌëPàèÇWómÝ­û< x ×ËK ˜KCCÔrù²Â#<»#WX˜ÿ3g^ÇÇb±hðàÁ4Æ£ù‹)¢U+ÿ›czÆù¾,c#€Ð¸E+Mˆäщ¥aaaj܂ۤ#ƹðaLý/XÆ€P5¹û>î‡~`œ ÆÔÿ‚e 8ÑH"üÂâïÀ~>¸¢EŠhíŠÿø»ȆP(pw~ÖßM€.CÁu×]WPí~Æ9@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜@¡˜Â\._8« ÚüÌi(x¬ÛóúëüÙ‚l 𱤠ç´yÝçËøùH"“ÓŸþú뢾\ý©Žÿ‘PíPÈ•ºÖßM …?OŸój~‹E*_¡²nkØÐé[­¯×­Ó”É“âýµ.C #Çφahïö­ºxñœjßÞT†ƒŸ8Rpõ£‘㦹|È'Ù¾§›4¾K³æÌQLÌPMâ}0p l†-ËaÃ0ôËÎtîÌi5oÝ^¶ÔT†ád9BÁÕ*óØ;{È»ìßÓ¥J•Ò²%‹Õ¶ýcŠ:LS&Mô*¸?R`üýfÇë#‡T£V=ÙÒ®8ý]šzEW.'{Ü.™ÇÞÙs@>Èö=-I×\SJÜŸÞZ°PÝ©Žwð¸:—¡ --UWRþþ /UV•ªÞ¨?~Wt…ëbqÒFïN|@á’yì=ä]öïiI:wþ¼¾X³FŸè vµÉQîŠ×çT©v“$i÷OñªUÿ……ä<“Øfã烫?@Éö=}îüyuïÕGî¼C¯Ž%‹äÕ-\ŸS`³9üëîú*5”ðûA¥^IUHÑœG ÃÍÊÀÕè¥AÃícïì9 dÿžŽß¢[k×RÜè‘örox}¤ Cå*5T$ IDATxœìÝw|MçÀñϹ+{ FÄ ‚±©Æ(E¢F[JÚÒV)ꇖªn£K©V«´ZªªUU­Zµwí½Uˆ•!‘uï=ç÷ÇÍvor‰H|ß^çåæŒg“{¾yÎyÎQ°£NXÍÞ|!„BQ¸m>«dgÈøC½¶š%I£íûÝuètº;W:!„B᪪˜ãUWE3¸(ì[{&-°KûP'¬ŠÖj’;®^z’-$'™IN´N‰…B!D&zƒ½A‡ÉÅHôå›ìýT—Ö[§€-˜k7Å›äD['œB!î¤Ã¿ÇHºµ»úË|Ü…[†vå×vBˆB£YAMkBþþ¦ªÉ)i›‹g>:EÁb±}á’,¨Vs‚FÖÞ¹§":ó&×/]"±|yT‹my VqÝ9c¸È7n¿PÅâÏÀ¸î¼áûE¾^‘ßÜÊ ã‡_¦jÆì:_Ê•}„ÇËv¦Îß½øàüÌÓ¸32>?É|XáB …òÕ²~SeaÙÏÜï‚?'‰¨„d´’.Îm'„(4š V³‚%Ÿ «YASI‹_²ËçäÚX§Ò¬ÞÖë¶ò‰<“Dä™d»i¥–¡d ‰’.9æ¶ÏI ÛcK4 ·ôΘ…§Os­‚F­¨(*Ü(Åy·ë´QïÃKùD#­ý°Îmý/´"1)‚§’Ú1¯äj§EQô5éÖ:%˜³à‹ñÉÆ‹(åÛ2â³¹<l"¤Ã4ìÆ† +C%š6Kïà¨ânb¹þŸüù1'-ehÖjý«Ö¡œ«íËGM:Å£3ùfÇï\´h`hÈàþ?ÑÎ .îy•u¾Cy4° ÜXÍ¢ÕãØìú,C[ "ÄSåêù™L_=‹£I*h eŒèšõÝȇ¡¨G1dÙoDi ¸uaüSŸªKâß•-øà|%ž~j  ³ó;Ðï—3¸V|Ÿ9ÏöæÖ¯áS,Xø0¿Fvè*ĽMµ‚fÎÿ-ÍlK;5ÆÉ.Í ;¿½šmzMž.íp[gó¹~<9-Ÿ&O—¦j+oNo¸‘i¾O9×óôÏi—\Ó®ûf°#ú»COâîêJ›ØÚ ºù0]NpÉ@ÂÕpš]/I3$™kh@C *{”ç¬îR¶"„(Fßî´LŒõßœQ|²ñ† ®xxleþ_ÓåÓÁP“îü°ßÂSÿ[ÆËž¨Ñçù/ÉÊþ‰ÿÃB\k/ʆà}„§¯“äH£Õ¨Wï#Æ]<ËÐ#À5ý»¥|ƒiôKýÁ»Ov©E7— ¤Ž +]i/ú®cð©#˜<”L=th1غš¸Ðîx–í…Çš¥\naÀ¯ÊcÔÖñk™9ñÇ[UJ -W¸á­RÁ7œ3—O㯼+WÆOÌ鹉\ja œo5¸"gV5YÁŸß—(°f¸·-›|ÔäœóÎvÛ<ä³óÛ«4ê[€Ý ¯fZÇ©|HßÒ:ÕÎàÖ?+ü›òé&jr2æèhÂ’*‘i·¢ `‰Žf€×C¬w=Àje·Ýõ„…GïV›R$pdÇ9,%Møx*xÕÏÛ9—<˜ø×.‡n_;ú¤sÇ¿|„G§ïä†b D•Ï[1{þÇRê3}a"ÉÞå(ååA`Ÿoùò±ò”kØëÌ}˜Ûeèi»0›Ç{¾ËùKØòNc— $,z‚ß9B‹Ù;ø¤¹ÿ†ÄÍ:„kç[Ë~óÌ"¶Äv§ƒWS­âÍÐ&îïÞûÏ|vÆêПQHTÓ·±œ ;g0aÇ'[oÅ-t ?}û~¨™5šE,(Û ¸ßžnÛöBû4¬ÉpÉ59õeÎùXS­ú½ÊÚMkï’ËÙnël>øP¿WYö.¹ Àî…W2-¯ß«,Ušù`Iȹ>þÙ`ûAAµÓC—ÑÙÈH|­VÜ“’P”lÖÕ4’.]¢U‰ þöü×ñzBˆB¡fòipW0”Wððt †´_o^US€½ÌY°›ø®”)­CQ΢U2a¸éCµÆÓøìå0Êè³dä€ç5 ÇN¥÷´…ÿõ3û¡dò)¢iL ®°rÉv¢Ï Í1Å@Érz ¾ Þ¥5²»ð „(`ÙÄ :÷Æ… !>ö(bœbÛ’‹|.Œáðêˆ[æ^Aívå×%k>ò2(:Ûä ³{.^~\9žKnnì­x‚Znz/™¸‘˜ˆÅj¥²¯/ÛœLOq‡©ÇX²h¡/¥¶¾.ÏO]Ïó™VHæßO†óÍi+:Ý<¾Üý(yRó…ߨØ÷<”$Àûï½Ñ—ˆ¢%\ÛóÆÛÙhlBﳌ.°—e½<‹“ßA (ê)Öï9KŸUpq8Ï/KìmÀÛ®îY7Òá×ä-ž­’1º„ñúw«™`TP¬ÇùuÉ«¬»!¢P)YþÏÂ^ð“Qívå?—HÉðý’C>©² "o3Ÿ 2sµÛÙÞ&‘:/-¨«ë(@Íò}™òÙ`wa6:%±Ê¸“ïDGW丛 ç‰àšÙ›}‘‘è* ¾©c°¡=³ÕUÎ%*„¸ƒ4¯}ƨaûèØéyz´nD%/Xopnï*~þæC¾^w«Ÿ+%ôùgÑ#ÄÍ€®m .U‰b¹°k+;þLæZ›y{±¯tkGµŽpß5™?º1¦O­ôì;ßiv¾äìõÙÛNÑ™‰8ú3g:¼J ÀÙŸXzÊŒ[7ô%Œ†¬Û)è3vÿ•ªJP©ôeÊ.31uøz8ÑtBˆ¡(铽eÎnï0]óùd<æg>uÚ—£b¨OÚçC«"r•¤Îu]Lb"o…e#h›„œ;ÛJüÕ< 2™øÁ=UâšSÓêg÷¯p!ÄÝ@Ãཞ%sÖðõÛfâT¬*€‚ÞM[€Þž ¦ò îçÙ·á%úÍI&6ÚŠÅ’²ž»ŸÑäzžDäe+V ôžF~n%æª ŠžIÿòé{Õ³,‘X J»’|î-ž2žcëÍXQð LâÄŸ­iûN¾˜Rq¿¥oweSZ’ÀñCª¶ÐáìŠ[mWÓÜBˆ4iÁ‹ƒà­N{'Þ‰ê`Û¬Vaçã]Ö%-Ÿ ¡é½pB}Òæ{—uq*ÈÐÙF5ä\W×´õ/yÆQÓZŠmºÿ8ê¸ùƒ®ºß vB"vžâ)„¸K(àS×€©”„h k†«Ž:7p+¯àîkûuw©¢£Œ»+îW4¬–ôÛÛtž ÷Vð uÅ墆9eø¼Îň{™”µ:À Ç¯žñšfûBÒ•2á_׈9ud©\ƒÜñ÷ÒlÛ)€Q‡_¨î¶K»¼PÞˆ¨äÔ .)—[lg¬äFyÅVþ[h ‚Ó߃Bˆ|–MVÅzÙÜO–S² ™cœ» Ÿr®vìLnÉ2_rÍíeç¨þ*n‘F_Øás†GcšfIFS,TõõEÑÁZÓ!ZÆTq:M!DáP\Á£*xätC‰\ʃKyë•…’e³OÃ¥6xeɧdý,Û¸Cé,ykƒ§½ò¹A‰zòÔ§íüüdäƒw%¶@%¿ES‚Ÿ´x¤¸åCÖº\\r=çCëä@¼ÃM,®xã‘õªŽåÆ NGE¡@ VÖV è„B‘EÿN_¢ó}çkºÿ¾tË¥Ðâ”d½‡.=t×NÝd}ìYÔšÞ$—À+Ê•-Ww`I.E)ƒ¥"¨ I¬s=,B!rT½U –ÿù[¤]«c‰b›d"ý+—Ѻ~À•Sq’±B!„(–$•Ý_ÅÚzè,q Éùütf!„BQÐl1úåF¡E!„Bä¡z@U6üº•èkéÒÓì½rG!„B:%ÃóP._8Ës/§. !„Bu»s¥‡N!„âîdç‰Åv: ç„B!îNö†±Úï¡“N!„¢ÈppÉõ—B!„Bä™ÝAšü³ÿÏÎü éðÕYÌw:¯‚ÌûNÖ«ÿYcvòñÓm¨Q+„jõ‡±ñfa—HþÉ?ù'ÿäŸüËÿNthNLj4+úÕ¥z­ºtúê– Ë´˜M¼Ü¸.ÕkµeÒ¾$çÒ+äéç~ ¨3h%×­Y—%²÷­¶Tï0“ãÉnT}àaÚ×ð@¹SeKÝ`Þ™vÇNêT§u?Æýx„85¯éZ ÿm2_œkÇ—«6°{Ãdš»þq%“L2É$“Lù>Ùá`P„ƒµoYKžnœýåN=õ5L¶ùQ;~d“¥$Æ´õœI¯p=Я)Œù‘õפG}ú‚›Xøç5j êB «/AÃÞ¤9àl+å]jú)ñ¸Î—æ•wA¦m—††‚¾Éx~šØפëìÿy2ãߌøï7õ̲¾ŠÙ FcvOÙ1sýÌuôUšÓ°‚/^iùä†3ù!„wŸ¼÷Ði€¦àÝø1šÇüί'Sz⬑l^°‡ÒÝ;QE—%½„ó¬øà9Ú6 %(8”ÆÝFñÕ®h¬|†Ï;7¢ó'?óáóÓ¨n(5›=Îøåá˜5 áo¶lÌSkâÒÓ‹Û‹MZ3vwÂmG»%›÷¥•ñ_¾_{ÙVž”)öߟXS›'ª€Ár‘ï{4¦cj¤šÀ‰Ÿ'Ò«e‚‚C iIÇ—r:É™ò&qâû×x¬Ãý¶më<@1‹8§eŽÀS?gÉ;~Ûÿ¨lkÇŒS×ï/ÚÊŸ][g²Ö+§}‘O“Á³EÅ»O´HdÅ’£$ a½ºïV OÇ 3®«F³éŒÝV…¡³eÝÊŸ˜Ü!ŠÏá·ˆÔëœfN|¿ Ó³óؾo+Ç”æÏ7ÞbeÚuЬeËmyOŠOCú·õäÀ« O½~¬E±}áùdœ&‡ïåœV•þ!^(YÚ)§´õ³;ž„BÇòçÁ®Õèù°}§~ÀŽÈzL +‰.1cZh*š®.“×ΣGi;WzÍgPtó·m«‘D(Ò[šZ–y·Ãµ=©ÀÜ_ãø³ýØ¿pîm>§‰OÖ»ñÂ÷«h·m-k7neíŒ!|6«'ßüò:-\²/¯¹–qCgùÔ‡,ÿº1•K¸’´k<­_ŠG³ÀÙ è¬×ø{ÒæÒŸ&¶¥´>C>Ùµõ-me?XÌv_Ü6}ã±üðz*!m{Kô9.Æ«N—7çÉDÕ‡{tõ/¾ÿûwö¥ããuñÈRžLeÔySýþGx~Ìd,ù€f‘+Y|81Çò&_ÚËQsmžéF` WtX¹~ì1–lòÊôs2§ŽaôÚ*ŒýìEx(ië9ÛÖYÛ9kÛ;ÜùÐÖ¯ Q£ZEüÜtÙ N?äa›¼äã mŒåëQY9Íšƒ7P³¬ãTÚŽŽ§|;Æe’I&™d*ê“ÓoÂË:¥¯k¬ÒŸÅ›×òÏû÷ámgP€¾L[†u÷dÄWùèÏýœ½ΙƒYøÉœJºeýôŸSæ™üiÞØ‹c‹þàx‚Š–p†ß?™ËMÁùòæ<*¶£O­(~™4‹ce:ñxmW‡uN<ú=SçüÉŽá\¹rž}kÖrÒRš¥ 9–×àW º3¬Úq * §—ñÁÇoíÕ³›·Jü/xqò)Z½9‰ÞþIII$%%a¶ªN¶µã}™ã¾È—)§ô2/sþø!Ûä%ûuÑ—iËK]Lü5n³Öáü¥ÿ8¼e?nŒ@Ë!íl§|<Æe’I&™d*êÓ­òþê/-ëgîÞ¾é?kdþ¬øÐbüW._B“G$ !Š:k$[f¾@›Ð`ƒBhöø[,=›˜÷õs›^ è„™hh¨ªšï=sé T5ÿïÏBˆ;ËJøÏ#øÙ´|w«~ŸÅ3n¿3bàtöÅçeýܦ—N:!„ZOBQęϲäëx?ö6c»†R½VKž{w¡óÕ; sZ?·ée Â>‰ç„"[Zì16Ÿ7Ò¦:î)ó ¥вüMì¸Hr.×OÊa¹9›²È !„]¶¸«`"/‰ç„Å56‚hÍ“j>Æô™z| æÒ ,€)ë'å°ÜšMY¤‡N!„¢ˆ“€N!„"ô^åðU∈Ép1ÔCx øø{ßr4§õ]rXžÝS;% B8 V@“\tBŠWMÂ*%s📤Bµ\ÝÃÆ‹ÔmR>ÓåVgÖwÉa¹Ç$ ÷žø¼Ò0˜À `:Ž¥°Ë“ ûyã~[ÙÛÏ>{Ê.#"„Â!czjÊE˜¼ü§Žnâëñ±ßÿQžkè $qøóÁôñáV'ÖÏ1=Ç mP„{€¯ÇŽeúß§‰ðz˜…›¦rŸ{N[Þ†„ý¼ñàãÌ¿ ÕGÿÉŸÏW¹»F…ägùâwðJ‹§ù-‚'¬fÙSùWWË9¾ìÚ‘Nfžm,Yf]1þÕG¨é®äWn…ÇA=ñ(OÃv}9fa¥‹÷k«ì…^QQQ$&%席«‹ %J”ÈÿB !Ä]CO…G?bε×yýµÇø.A‡_ýÇøxî0깨ÄÝËîC HT}Nëg¿ü`6%qþŸ¯'q ç~|÷þ> xÒª ýâwWEWȉÝ)æÈSlšÿÏ(ÕX7!×B-•¤Dpq-€ýró"ÿþö!ýƳâ·a»äw³„ÄD&¼ùf¦yo¿ù¦ÝyÎ !Š=})†~Á?Cí-t£é”íœqz}'–;pÛ—\ÓNâ çS¤J&âh„ícíWøbö >§/Õ³^ll'æìê¢Ôû“39’s‡E6RêèV—7þÙËу{Y1¨òÝÕ{èHÈ$¶=‰­³èYÒ6+b÷!"Sv™–xž?§½HÇûêL`ƒ‡èÿö2ŽÇ§÷ýh‰çùëã—ér=Û:5šÒú©ô§bkñ§øíƒÁthRǶ<´ =_ý†m×S2Ép²í䟙>ä!j…ðÀÔÃ$–+ë™üT‚‚‚©ÖŸ·ÿ ¿åÙ@ÎÖóÌ‘ÌíSÆ6ïÔïüq&¬WøkÂ<д¾­|AÁToÜ…§Þ[ÎéÍng¼ÜР`ë>Äà9ˆÓœo¯;ÆÑÕRÕ¶ø³OgðÙ§3l?¤ÌûäãOùø£OÓçÉUW!„¸#òÐÝÎIÜz‘ïº5¢ï²XÛʇߢE­`{üÄ¥›ÙŸ˜s<Ùi79¼p<½[5H9±Ö¦NXWú¿½†ËYbBíæqŽéE;'Ugên÷ÄîL³ >ðÖõ©RŸÎsΥݕc@C>-·Aïæ…gÊÝšî+६,Þ‹¿\DZÈRÔmÖ€*–ólþn =^þ•‹VÛ:¿ëÅ Ÿ¯æðÕdt%*P¹Œ…óÛwpÑ X/²x裼2g'¢5J”Å=!‚=¿M¥oŸù÷fævæë |¼æ ®¾^¸èóiæ<ÿ_lÀ¸Fo/p IDAT©'øvÌkü›×šÚy2›ÇÉ݇ˆò®Á}-[Ѳae\bN³qîhúOÛOÖ·µœùzŸî×PH<Ïߌæ«ãÉε×e?ÓR¢7½^Ï‘£‡SÖ´Í;~üz½.Ã<‰è„âN¸­º¼Ä”ª^“²iÝO>T ¤Nµ’3\±½åÄìÄÉ.ùØ×¼øÆv_²P©a­›×¥\ò)6o8BL–“á©YÃyã—#Ä@擪ÓìœØsyB¾¥Žö8Ðä{Ð’ ߣóýͩ۠?ß]SÞL×/ éèwL[T`ðϲìûüýÛªñf0ïX‰Gæ1uíu&5^ø=ÛVñϦìûk<Ü!éÈw|¼1p!ìýÕìøgÛ>…?ÀÙù|´.2µsÈÆ·37îäßÛY=º6ù‘¹‡4À@ã7WòïÖ-lñÞ¹®çDî¯L`p+þxÅ6¯jWºšÀP‘§î`Ïßó™õþÞšüŸõ/À¥•+8™µëºú0–ÿý+,›J3=À9Öí‹"Á‰öºètú´ÿ==½2ÍóôôB¯7dš'„¢àåíªÞÁ÷è|ÿǘ£¢¹©ew_ÆØP7̧gÓù¡9¹aóNváµPRkÍËã d$‹~~ =°?=ßNÌü} Ëé±$«X~˜}ºÇº0ìÚ1"üû2uöXšúè3QáѸ!Ó#–ýz3÷÷7 »ñ=tø€Ã)'Õá5ËfåœÈýµ&fž—rbϱîǺðZ`†í²ÔÑ`=tKv™šÌëíO®x¨ïw\:;ŸÖ bv¥ŒAË,è@ôÊQ´º’ÎîÓ1+D:‘®kƒ6Ô3¬cÇ¥ù<Þx>Æ• iÔ‚îÏ ¡_@æôý»õ¥y)=F·‚}àp $F' ’‹nËL'v•+¹ _-qå›ù+Ø|à'NœcÏêsìY½Ö.ài¿ô-)S@—ÿòpBVr:=ëœh*P²RA-N0Òç¥æÌµ•äË‹ùlý`¾jÿ#ø‰ÑÿD²äÙìkRòºHNí;Lxb(Ó¶Ô_X‘ .Qœ»R‹Ï·Ï§SðSŒhùc6&°yl;šÍ(Câ…Û@ƒ*O2²MItº,\ƒûðtð÷L9rƒeƒåjëJDnݔ͹¥Ç·f]ü8̵Äu¼õúÚ»íaÁÒ˜\§äìD{eÿ\Éü¥‘òV‡,åtIèJ–(™iž¯o‰´?Œ\\\@u0’CÆD!D¾º½'cäõ$î‘û¬œ9Ù^ú–>½b­JÍo¬—ö°- "õý þOAœ]hÜM´8CO™_¤g©­üx=‘µ3–r®Ý zM_‚ûÌiÌX²#;7q¥ª6¢K»Çiॽ?=¦/Áíó)|¶x=G®ýÇ9<©x_cÊ}y±—O§0ã—Mœ¼®å¨ß¡?c^{††ŠKÕ«ñÜìD½ú6ßl?ÏÖ]ntñÌšÂÚ›ùSs÷ú#˜5ê £f¬ãÔŠï‰oÞŸQ/Æ3ñóã¹KHïŸs{ÝÁ@ÈÑXTSÊåÒç?›6Ϙ2oðç2ÍKN²¿s$žBg ñ ìÞµkW¯ ªjÎØ¡Óéð+]†ÆMîÃÕÍ-ÇõoóQgy<‰ç)«œOvs#:¶ØÍª}ûÙ|R|Ãè=ü ž©jÌþÄŸ â„ìL@CÁ-™*3øÏ# Î:ߣ1ïo;Âû™Ö­BçWgÐùUÇÉ)®•è4rF:Xî^î㾤û8 ¸…òÖ–#¼å¨¸åäµï䵌3p\ ´ Ô3+‡|Îú!™g?5"ãOvÊèÖ€÷·gi/·œÚ+ûºæ/Ínjµðõç³²¬ªÝ2OµZìnŸ–¶BS{þÝA@ÅÊ´ëØ ½!o¡–ÕbáðÁ½ìùwÍÃZ渾Òòþû´ ›·}-"mæÁ]›iÜê!ããòTQ4¤îç]VÊþinÆßdåËèóä@âcséØî^>ü8ÿêÒ ÷!„E_Ñ;×dU(€Õj•ž¹œhÚ-“í Ñ·Î×ét¨êÝøüý"Â|–%_ïÀû±·Û5”êµZòÜ»£½¸˜¯öÄå¼½–ÀñÅãyäþƒ‚ ¬uí_úÓÉ)ËÏóÇ{hL`P0õ»¼Â—»¢IíKÕÏóÇÏÒ¦¾myûçõ¿.c)¨ú !„¸óîÒsMv¤›(hY¦§Nñìà!œ8uê–eâöh±ÇØ|ÞDH›ê¤þd(Ý€–åor`ÇE’³Ý,~fäë©2â{ÖmZÏÆeŸ1¢myL  Æ°qÒSüok /³œkeÚC‘Ì4Š¥VP£Y?ñ †þ =¦þ̺Vòëä¾Ôq—=+„ÅIQ<×ÈcKn[æPíä©SŒ{m<±±±Œ{íuÞïªW«–e}‘WÖØ¢5OªùÓgê}ð˜K7°Ù=ªÖN”¡÷·¬K•²z([† 5R–]^ç¸0èç±ô®aK¥Â‹“xaEO¾ßtîaëùô·d:ñ!/?àcõP‰:TW!„…ãn=×ÜuÊažÐÝ® ñÜÉS§xmüžì÷:tàï¿ÿæµ×'ðÞ;o§uÏ*—jзæBÆ<ÐŽE¶¡Uëvt¸9UÜ’þÛÍé„óìîRϲlW9<†¸ð=œ£O‡xË#|„B8Tçš<\r5sñ·Ø­%u+Ж/Îfyt‡õ:›?yšAT¦A÷qür&ÑùåEˆ-ž³ý›;oƒ  kׇqq1ѵëà 0€¹ó業#ñÜíÑ{•ÃW‰#"&Ã1g!<|ü½sþ Å­CmdåWCyÐ?Š Ÿ ¢MljlŒQMʴ͇8sâH¦éŸáAÙþ5&„¢ø(Šçš<ÝCgNP(ö$ÿݯ[–Z¸ðã`žüè­¦üÁ?«æ1ÈýW^î7…½ñÎ,/‚Rzé&MœH‡öí2Ý4ס};&Mœ(7ÑåÅ«&a•’9øÏIRËÕ=l¼èAÝ&åûEÐ{S£e/^ÿ1‹ÿæ×ÿdÑ¡D\R…ã,ß…½·—º4 2§Xuð†ìJ!„(ÆŠâ¹&‘ʽ'ðΘçy´eeܲöšO³xÖV|ž˜Æøõ ªÝ†!S_§þ…|±+6çåEŽØ"n½^IûœqʘÞ#~#ÜN½|dzÿ`ûñp._9ÏžU«9n)CÍ2Fôe;0¢‡ÿŒÎÔåû8ÎéýøaÚ{Ì?™Œ¾l{†u3²âÕW™¹æ0ç.žçЦ¥,X!£\…¢8¹KÏ5ÙÉ÷{è´GØtÎDÈ›5ÒG†”iL« qü¶-œ¤:Dz]žÜªVѺ´•òD’ܬï¬Ó_ŽaJêç×ð^ÿ#ÌJ¼HTʬ ë§3lfKÖ¾‚îØ×¼øÆÎa RÃ0]bùïÈ6o8B̘)[lž<£§Â£1çÚë¼þÚc|— Ã¯þc|^Ü×qÚ¦:ŒœE‡‘ö+®Uè6~ÝÆç²ÌB!Š–»ð\sp×I‡IÊsèn“ÙœŒ9)ÑùÉœÓÓkÒtz„zÞ|«U§¥éл!% ÞT¯íg[)>Š+¸VkC=pi>7®C¦éùÂd–]P0ÊL!„¢XË÷:ƒ—?%”\Œ6n¶™)#C||qÉayÑ{ŽJnG;8¿®›¯+z@3˜RÚÅRîz@EK½Î›òŸ! _-qå›ù+Ø|à'NœcÏêsìY½Ö.àéŠE¯e…Báœ|ï¡S¼ƒiQ9™ƒkާ ¹²‹ < m€KË‹ÚåVMÕд\LôÚ/kl8‘å:òÊû³X¼|5{¶FkÀI¶wþ]³B!„(zòÔmc½q–£gopâ*ÉZ<d¬¥ªÖ À£*½‡4ç³×Fón³P3š•o¿ËÞ€'x·‰ݲ_^Ähhi½eš¦¡(·^ßÌ8¿ žDg>ó-}z-ÄZ=”šÞX/ía[2@Eêûµ0Y!„¹‘§€.nã(:<¿-íç9ƒfÞôúyÓ›{P±ï|wu$c^í¼¥öcú‚ÿQßÝ–eöË‹MÕÒ.{ž=q„R¥ýñö-‘¶<êÚbb" ª¦ªÖCgðkDÇ»Yµo?›Oª€‚O`½‡¿Á3U‹Û¨!„Bd”§€Î§ËÂóYAïG‹ß±yD—1©=tå+UåôñC¨Ze¼¼|‰¼~…«—éۤ%šÅ‚ª9ñ@8·¼¿ýïg˜eÏö™‡º„Œ]Ç™±f”ïÄ›s;ñæm×F!„EÜ)›TMM»Œj4™¬Q›3ÇqÞœŒÁ`¤nÓ¨3V‹9m}!„Bˆü$-¹]¶' §L&£-¨su÷ nÓ–¨f3Vsr†u »ÀB!„(n¤‡î6iZ†Gˆ¤0MÔ¨]ÕœŒ%Ësç4é¡B!D>“€î6Ù:ÞnívËÈe\_!„"?eÐi€^¯GU‹ÓÛÝó›óVMÓÐéäÕ B!„È?ÙÞC§Ó)T ¬ÆÁ½»°Z-wªLEJR|¬Ó¶Z­œž=;7yõŠCý2&n^:ÎέgˆLÒÀë¶Ë‘ÿT ±ß @³ÚþŽˆûq(>#×£¸ùäKò-m“–²%²5g<ëÆcÉšHªõoG•"ÌtÛMúv67U€DÍÍ{½™þfkJ)€Î„_å» á ¸ Äp×Ç*f3wÉ‘{騾uM:ý/ œÅ‘ª]2v *z£‹¿ÊÉý[ùsöWÔ¨ÿ&ažù–]1Û*f«-F}@a„¤ŠÞHÐÔ3šG—q{âï2pé(Ú« ZÀÃ¥l ´¨p¾ˆéþ«·—siWÿeýy/:~þ½¸ÙfV­F½0€›lùž²Àô'h:ð~ˆ9KGá½|*o/ÚÂþð› +AðCO3áÕîÔrgÓh{ÛŒÀ{õt&}¹’ƒ×­ ÷&°Å>|«Gîƒ#Ÿ‘r¹‘óJ4éA˜aô¥í>œ©ïô'ÄS±]²íЉ_Û¡Åž9,ÜAùasè¿f ºýŪ1¦¬³´ó$:œÍ·ÏçBß´<Àz} ŸŽËŒuÿ‘T¢.ý^}”‹ïDÉo61ý¾ìû„5ÕŠ¢ÓóÅWßd»Þç¢YÍ(z»ßbNÓ¹¸bô«‚îÁ‘h§6£- V3ÊÃPj<€úÇ›$¹¸ÞV©œ ète(mŒåð¶ãD‡ÖÃ7ÓÑçA‹©ß1ê–K5‰Ué1úQÞªìƒ5bóßÿ˜WfVç—Ñ!v·±†/áÉ)ÛüßtÞ½¯,úØp¾‰ÉÉîjMUQt:~]±&Ûõzt~Ð!ëò~QIñ®Çc­;Œ¯Ÿõ&|ùƽ÷MOæ¡L÷ äí÷Ø=%SßGÕa¯óó8.¬ø˜ÿMƒo寘µ:÷Âq `áôO+i9u&ÿ4)‰5Ủ=ç°Þ]ýâîvQ¯ñ÷¤QL;y?¯þMÝÏóÛÔ·5ÜÈÂoQÓ˜ýï¸3îd]Õ«;øí°ž&ïv¡š½ÀZ§³ëê ¶LÊØMÕ2q6jxpóÜišS ¹“u²ü÷Ã^[GÐ{?1óô1gÙ·/.ñfæè—r`ÔD–ŒôåÜ¢±¼8úuÂÂæÑÝOŬ«ÁïäÓj%±„oâË1xúý`6¼Û8åò»™ãs~áÁo–pxQi,qXtKµÌ›»„‡¿YÌþyž\XüǤäQâ2¿ {–O/?ÊôÏÒP9È7cǰ.NG¯êf½ÉÅož£âËK9r¤Ýõ>úè#"ÿþ“M¼ê߯åP«móhž¥Qš=‰Ö¬É(5@[ó1êÒwÀz{Ac*§öºâ{£G¶æ¥ÉÃi» UCB¨ß¨9»µ£Aö¿S\©Õû j¥þX® #_ÙšÉÿpfXuìäl Z_ž¦Í‚©XZ¥ý(_չЍ 1Ä/‹gßY@Î;*qË\ô¥«b¬ù s܃ÐPrÈלּðƒªQ£w±x‡Jã ÍðÓ¹R&—õ϶~×73{µ ýç¼D·ª¶_þ™W°æY}æózê IDATõ¢ÔvŽdÌÔŠÜÄÂÝ^<úå`ªé øóÒèC¬¸(jÇ€FòÆÑ´lngQíÔÙ·IPvuN¹ÃØó¾aŒ{¬ ^ ÔzæYî_ú>Î&ñPIgz;rø=N‰ M _`LÏz”ÔA¥§ÇðÂ?ý™÷ËIžU*Sj÷ÆqlãùÀ <Û¬4&@ß–m½;5ÛyO´‹õòF¾Ûj ó'#èYß…J ™8 -àÇ£ý_&ûßñœÜéº&_=ÅUJѬ‚[Úy0ñÀÇt{þ7®P‚G¾XÈørøre2í'Oà¹0oÛºåÒ¯î¢:Yc.e¨L‹Öõ¨RNåÊR±fÊ”ï¯&òþ€Vx+2ìUÚ,Åê t÷ó äéIM¬Âã¼1q Œ[Á‰ ©ŸÒäÕyÃ[ûcLîF»1„_×± ¹Ï#Øy­ÞÆê t©ø7_oñæ©_ÆÒ=Ä ¨È˜wÿeùÃ?e[¯äˆœŸÒkâÍ´y‹…2Suç¦ÍH¾t„k¿¿K™>S(Ñê9'[0 =hQáh‹_…²µÐµ~íìN´ßÞÕ ·Ù ˜Êɰ…*Lâ÷—8¸{{`ë_ÓxvÞR=çƒìm£¹kïO_ÂúQé#b\[kµŸ³©JGzU_ʤž}øµesš7oIçö¨è–ýŸ¡Ökg¸9¯jR|Ú¼œv”zõ‰ëgâÖq,.ú8Õ Y¹ÕêJDz¿³ôÿìÝw|MçÀñϹ÷&7{'’ ‰•DìQ«f­š--ªT)¥¤jÔ¨jK[Z¥(miKQ”¶ø)Õ¢fµ”ÖÞj“‘½î8¿?2DdÜDHÂ÷íu^‘3Ÿç{Ͻ÷›ç9ç9/Ògpy¢v¯aŸ¶Ó뺠)@ýs“|õç“®p°wkdYVöZ,šV%+vÙË=f)'¸¦)ËÀrwš§õejPÁú ä?  ­>Œ/_áNj•z=Ö‡qGÊ5&y×Y‡wHi2zG­œ)e›Â•D³…eÌã<Öh)]+§ô?­Õ‚‰:}™xóÝ Ýãqè(UÕ‡ô["òªwüc—”ˆ\£,/Úe|‰ë<ªQÃ5–câHRs禸ÔU_©ó—v"éÖ&„­Æ $_;Â%ÕŸç«:æÐ’½‡U'“É„1íÆ­gzVYÂȆMø®UsžlÖš.âo§€ÑˆIÕQºz¬M†ÔÏÅo»d.Å¥`4j¹µ{Þÿ–MÇoÝù¼°mÍídFëÔí}C|°2¦mo4`VSoP0 (F#&Õ Ï@w4éë¨6¸Ù$q1.…„‹¹¬)ÏðrºŒ2ëÊÔ!P¿ ³É˜1/«˜×f$séëF*|u×zF£1c“77˜ˆcÃ~Å2ûƒG€}îRæTî¬4ºœ“¿Ó £1SÖX{üDk‚ŸhMï>™ûâ}½Ÿç§”MhÑœö‚樼3f1·{LbùŒê”sÖ“tp*ßLÂd4`ÒïÙ]9úÍ]IÓý»Øñ×>vÌÅ—_·gÎÂ×ià”óÛ åÄæŒÞdÁ e2ÀÁ€¤Í3ÐUÏ«¡65™÷€¶ O·óå»õë9Õ«G<Šmã©ngÄp3¯úRǨ4Sëo2¦ŽÕvR`0bRÕÔyª US…I?Íæi÷ìcQ¢b—ZAÌ©ïdÌF†˜–¿ë.×G-Äš0Y»\êlkÄ (˜î×hBEÅl6Üûz˜î}Oæù>VŒiçq¦÷1FÌ©'3fãÝç¹ÉøèŸÇ&SjL4š´ß!Ïz'|„â’vn£¦½æ™ÖM}ƒj4`2*é;Èøì3çõ7æü—pQÔUëê'8~!cçÔó_ëLY?gÌvîØ(iŸéªPSÏ£å)ÝèÓ=l«0lå´Ù½‰MÛw²yæK̜݃%ëߣ©=€‚¢Í|¹†‚©Ÿ+‘›õÊ\"ûÆoKêáïjKÒÞÑ4Ÿ©kYA£³àªAͽq²¬ƒ:{.­ÃÐÚ»q}ÅÈŒy&“‰äää»ÖÓéîœc¦ø[hlðÿh‹ ÐhQ:½‹â_óo yj tz¾Ca+UðÛ®¬ÝñsäØŒª‚FªùN°G9e¬H¯îuñwÑ£QLD9GLFÁïÝ­êµ¥ßð·øjáxêÜÞÆÚÓI¹¥A?lÚN¸k^ú •y2™îDMMŒBÑÛa–û5 ¹³Âÿ©öT¸¹•UÛ7ñÓI'Zv©Š½EõÏBcƒ³-$Æ$¥FŽ)ö2ቩñÑûSŽsl:EŽm+%*v÷Ê+fÖ^ñ6]bÿ¥;oÀä+‡8—’i'%<YYt ÎÙ+ÈûÀĕϓqâFräh4Î}±Ëò ó8œÇÙÉ«ÞK\¬KUÆW½Ä_ÿÝ×xó(o;RÑϽ%ïñœö]uÕxÖáéª&þ^ò ÿåRF½O0e• ì8—¯”äaÕIÉÚn¨s¦RÓg:q?®ŸÉ·6ðý±¼?S Wÿá¸!˜—_jJ€›-ZÅDäñ“Dâ@˜Ö>!øšÿc÷¹;çPÒÅ=œIÎ;²Ž ûPfôæ;å5°¶¶¾k2îüÁæÜdþSO£XåófœÌ´:4m^Ciõê¡uðý›ðý›¨‡Ö¡´zM›×@ky—Ý=¯U&íÅ|}ã?ü‡ -šR·ŠÎDsjûrf×PíõÊ8èðõÔ¾ÿ ÿµ²ÇK¯Çέ¥•Mlýç&-š{`¸ð3ýŠOZ%ïÝÆ:â¾ÞëJ£'ªRÖÉ̵ݻ9kt§‡{ÞýËVÕ» ñ¾sEBú •YæʪVôí&¢(÷7”€Î÷Iž©ô5ü-x<ËÄJ©]º¼êOJQ¯†‹×læl‹r™_¬à”ªPÐx4á•vß2|ê{Ìã:»¢Þ¾È¾ûPÛ ¤£aóKXì²Ê+fZ¯Fô¬õS¦}Eõ·ž!D9ÃÊO~!PH>ýS‰AVyÅä~ê|lÞ“y¾Ó¤ü;Ÿ×º1¤¡—7Îæ‹3¥é9>nßµÞãpg'¯z?[îÑ‹‹)æ2§N:s§óTƒƒ÷¼ðÄ×¼5õ3j¼Ý‹º¶YûÉ"Δ{–w+Û Õåþ/vuÕúÐùÍ—ùmàWôí¯ôlN²Nhã#8²u#çTÁZGc´^ÈëS> p\ÚT´'þÂŽškÒ©g®_Ä¥N™B›tl3wxмEMÊ;¹üû&N½èç™÷¹¦ó¨LYÍj~ý3‚öíK‘ræ'&Ï9JËË’×1|ZÑ¿ÁtÞ;:Ÿô§–æ(‹&þÀU4XrŽèˆfüÿ›or¿ÓU_®úýsrÉÿíA™ÿ ê‘qKó²Á(-BºŠ99ÉòÖµ\ªhÙMޝJë]Õ¢}æ}P/šu æ“Pº}Ò.šÑx6Ë£þYÙRý•7é5écú>õ-ÖîåiÙë9êÿù]Úybä,>v›Ë¼éÃù6°ñ j½¶ rÔ ÄéJ^ì²È3fZOÚOšÌÕÉŸðNÿ5¤8V¤Ë€¾Ô9· k­‚b]òcU^1ɵÎùÊýÞ÷dÞïc½zâ»m Ïθ…Ù¹ ÏNzŸþ­ïíJx ÎãlåQïG/.*¦CsyeÀÝs«¿óó'Nãö'3™3ä%b°Æ§vg>šô•ô¹¿Ç-ñ°ëjЃy‹Ë°ø«ïù~ê/|š:°°è øh,ÏéAÑÓpÔL¦|9‹¹ï á‹d°v¯BÇ×kYtMÝì“FoEĦ øø2±*è}jÓ}Ú\Zåù™¢õîÀ´É{2¡%Áãq-]ŸÞCžbï,K¯Ùµ€Î‡n³¾àòãy£ãRœƒyþ0žþë|\›>à¥>©ÏpMнk¾¢w@ÉG‹Y^l}“6°ð´…ÓþĹ '7¤ ,ü ɹîÅ2J“† ÔüIÔÍðŒ™lù™šõ›’S‡(ªj†ä¸»æ)Öö É׈?ìœøwÏ*×(Œâk%)v†sKx®ÿ.z|7ç} V¾ì”¤ˆìÉk˜½’—ûy—´ºZ¢°ëôçŽÍ<×8I‰ñy¯\LNÏ¡u‡ßxqóú—³<ªÉÈù A˜î\“Xá“ ÷×Åú€ÙØÚóý7³éØ£_ƼˆËç8tÄ#ñtŸl)ªJÜ—]Q“î$¥#w¢ð¤œߨ©Äÿ-QÔ«ì7±rú Â+¿B¯Â-[ñ°”¼†Ù+Þq)Ü÷xñ®kÁ<ˆ:©¨¤ÞÉR¨Äú‰ ‘A4ñ‚ˆ¿YôÖ|.‡Œ¡•&_õP4ZJ‡­ãÒ‡M(=bŠÎ¦XÇ"·CŠÉ³h»Þ_eüj×ç›ÔJä­ÇΜp–5Ó†Ó©sw:½<íÎÏðÑä”.ì?MŠq „…ä5Ì^1K¡¾Ç‹y] äAÔI-ä‡Í>`æø,÷ ë7¤a§qlr}‰ùóž§\ÎkïJ¸¶é^wlük~a [.¯Õ#ÛB ñ(þ‰~¨±×ÑúV+êâ”(Å3v Nµ‡°p͇r´â‘òf¯øÆ¥ðßãÅ·®÷ êT|Û¤²RpzbkþœpÏ’‚ÖÁõéñ÷µ}qñH'tÖM‡uJ,‰ÄàQ ¯aö§¸<Šu}ë$îÏ£Ûå*„Bñ˜xä[è„B‘3U-I7E<ÞÔ\^§\ºÜ6|\IL Nb'1xÈk˜½Ç).Z]¥dÝñ8Ëíµ’.W!„â±öh%¨¶ÇqØ!„BäIÒ¹’#·×*—.Wy‰ï&ñ(8‰ÄàQ ¯aö§¸<ªuÍm¸ZQ¼H B!²¡”°…g¹½Vr—«BñS¹Ëµ¤Pi¡B!D6¤…®äÈíµRš4l îøãO¢n†gÌܸf†””‡Q6!„B¡Ž=úuD>$%&`ck—ñ{Äåó :"û.WCJ Ýû½†ÑhÄ`0 ªæGnÜIQEƒ••:]νÚßü³4¶B!,—”WÔE:´ÿ/ê5nqÏü¿M&7¯qäð¿Üºy³Ùü@ ø(Ñh4¸{xR-´ŽNÎhµÚ{Ö1™LÄDÇH|óÉ’Ø>lf“ ƒÁ€Ùl¦¤w\¨¤ÆØÊÊ M1ˆ­Bˆ4ªJRb7Â/g»8Ç„.%%™cGR¦œ?­ÛuF+­!3;r€cGP³v]lmmïY'%%Eâ[–Äöa2›MD޺ŖMë¹ré"&“©HË“UÚõ0 ¯¯Ñ(¸ºzZ³6ö˜‹Y}„ⱕÖC•SPŽY„ªªÜ¸AË61™Œ˜LÆVÆGQPH ý»/Ç®T‰oÁåÛì\ çÒÕ«\‰¸Adä-ÜÜÜ)]Ê“²¾¾øx{¨,†Û·þJ¹òéÜãE4šâÕªµyÃjº÷îoñúf³™“ÇqüÈ!ê7~R:!„(!rMèÌf3Z“Éò¿ðE*­N‹ÙlÎq¸F‰oAåÛÌ’“Sؾ{7Q± ”«Jõ:U(åê@Äí8®ßŒdçÞpq´ãɆ Ñë­óU³ÙÌ…sÿÑ¡[/¼}J¨>ƒ!%Ùâu+…rìð¿h¹ ^!JмûùTÝÁ±$Kc&ñÍ? ãÁÆ­[ ªO£&¹’À±{/F¡z-Žthÿ4ÿ;ËòÕ?Ѷys¼K•²¸( ©×C·–¹{dÓši2™²½Q£Ñ`6ËI)„%Iž‚§æò/ÿÿ,“5¾÷1xm0ƒ×s0|Û={MHŒÏõ÷Çã_Þ’“Sظu+O¶êÌÚ¿c6ïo¾ÝpWG[Êz8PÚÝ{n8ΰy³öïžlÕ™[·’œüè Ù£f™NŸ=Ë€Aƒ9}öì=Ë„B”<…Ú§b4ù`öZŒF¹¬ –x‹%}®0®õ÷,=ðÖ=ËoGG£éŽÑ1±½Œ%ÁöÝ» ªÏܵ§x»¾ÕŠÙaÍùþ×Ãè­´Xé4¬úíŸkÎÜ-y«cæ®=E@P}¶ïÞ]ÔÅ/dw§lgΞaÜø \½z•qã'pæì™{ÖBQ²XÐ¥=Ä‚)>.Ž˜“gþ„Ñ`°x»ÂšÌ·ÿbúó ð÷«@ÙʃØWÈÇH9Ãìæ•i³ðƼֵøK1ë¶p,|WÆ¢¬ûŽŽFTSêÑÑ·zœÚ·ƒAµû+>_±½NTlµ‚ˆŒ7b«×2jî6FÍÛÎ+]k¡Õ(hèÕ.”7>ÛÆŸmÅJ«!2Þ@­ ¢b¸žë1JõÎtæÌYÆO˜HŸÞ½XóÓôéÝ‹ñ&ræÌY$ŸBˆ’˱2²ÿ„WU• —o²æ—¿ùçôMlœ<(S·„ØD¦ÌZÃ[a-üUb]: ùûÎ,­k Í{áý×[àk•×L\Y=™¹çŸâ›aÔv±ÁÞ¾°¿™ÔL? sßwöõB÷øpÓs¼ZoÎ=lj‰‰EƒÉœ‚VgÅíèËÊ’M|Ó¾¹‰M¯–/ÆöÍ_¼/]½J¹Š¡¹œ€­µ6cl¸þjb4©˜Ìi“IåÙV!¬üí0zíØ‘Ë©7O\ºzµÀw¾’°‡×ëvcUTÖ:š{˜¥­tü=ª>]–GÞµÔ±ó*öÏkˆ}ÁŽš£Ôè¥Æoá¢E¼üÒK<õT+:v|½Þ†…‹1eò{ë !„(Y,úÏîÞl6³kï ¾^µ— ê¡„ÔñÇŒ“ VŠžf&ÏZÇ[aó1¢¿‚¶þ{¬žR;C4ÿmû’±½Êp¿í¬èáMî—¸ñß-´šP§¬+ŽÙ–ÝŒÁVV÷ßÓ\˜)]æýTó~’ye» R:UQ0šLX) ±11ù(‡‚¶îDV¼]‹; Ñ`ç[M6Ç*.òë+7¨^§ Ç"Lôn_s¶Ñçéê$¥˜0«`2›1šUŒ&£ÉÌÓÍ‚x}öVÚ4ªBDŒ‘7î;ZðÛTcÌ韒^j37AŸ/|èQÝH¬j½ËŠ÷륽 Önx`£ê¥åÝI“Ro„ÈЧZ·¢e‹æÅ÷B‘§¼3õÞI5«œ=Îüïÿ¤rõ¨V¶$¥˜IH0l#Z )ÉÄDG’œ”œí>rštŽe ¤RÕÚ´}ù z•5qzÿRT ñ?O~‘ÆA”ó¤ÚS¯ñùÞ(Læ(~~6„ÎK®“üÇ ‚ý©8`'q)g™Ó¢*-?ø†I=šPÙ¿2OÍ=‹!§ý¨€9S+ÆÑ©neÊùR. --ál2_xæØÃ|=¤ Aþ”«Þ™7×^Â]},‘Ø Bl\ ‚Áh@£Qˆ‰‹É_|ËBµŒ)ˆ7kL—¾§gP(=—_ƨj §¿èJ`×Xa‚´X¶˜²€ñÏ>Iõ ªÖéÎÄŸ/§Õ=™S‹FÒ¥i´¸Õ§Ãˆ¥SS¶}«é+˜Ö¯!øg‰9r/sú7§¢ åjveìê $ç£\DFÞ¢”«±I& F3ÝŸ !9ÅL¢ÁD’ÁDŠÁŒÁ`Æ`4“bLýÙºQe’ &®Ç¤PÊÕ!c¬ºÑØá[¥¡¡¡©SWvžÅ¡ešzÜyËé\*œ¾Nh5ª”±/Ü‹Z3¨€0£Õ*ÿÏ<Ý=_2;!„(i,»†.Ëd0¤ðãÏ{ð«‚IcÅ‘£ç8ºk=Úð­ÄF'~¸‹{éÓ¥V¶Ûç{œõ/»°;§ý\3b¼´Š°·¶á?r9;þüƒÝëç2²¥/z%½|NÌŸÁ‘:XõÛO|ÑÃĪ7'òËMSõÉ_|‡ogȺP†¬ åpøö{–GÇÆ¡ÑèÒ:±±ñ‹o–IWæ¦OªÅÁ÷ÞdÅÅ’O~ÍðO.ñÔ‡“hë•~š8³p-ΣVóÏуì˜RßF `Ή$À„A©HÏÉKؾk¿/Ið÷yiê~â¹»S Âzðrœ:ÌÖ ^¬—;SkßÀô³ ™¶öwþXÜÝ’©l‹Ï­.yDVUIH6ft±ªfUU1«wö¢( F“™Ûq)\‹JÄh*üG°.­cÑGÚ¾T—Œgƒ©$þþUK—¦t¹Pž<—Ý7ÐÍD*ùºtQò9!„(y tÙTrr2ûN\'°VâL(Q'ô\=>\¼7ÝU†öm†oi_ôz}>ö¬’¼¹?AåÓ·¡ök ˜×Õ®ÿÈÌu6 \=žî•S-óÚd†®ïÌ’·èÖÃ1ǽ:¶Ëð¦ÞXÚ¸í|šË~:T½L”®š†âï­o/ÊTNÛQÚø¿ŽONäý~MpR øµ‘4[6Š-g’èäa—íñócéÁ·YÒç ÇÂwñÙöÁLóÞv×r“ÁˆV£Á’‚V£I½ùÄbYã àD×;™UߎÒÝ>`òÆöŒ6™Vq­Ý–<åqWW·ýS£yµ¾+ZÀ·ÕFVkδ¥ÇyuJ ‚_DpúŠ¥»3ñíßÙ0þÎL¨Mõ´¸wàúè€òíûÑdJ[Î$ѾÌo,ØiËóËÆÑ-Ô(Ëø){ù¥ûú|ÅÀÝÍQñ8Ûê8}-Ž}ÏѼAEl¬´è­4©÷·˜T F“ƒQe÷þ3Ô¯@9nDÇãîæžïãf/…³«–p³3×J?Gux6~•wêgOü™Í|ùÞ<÷‚Ê–ÿ½F¥üm,„BäЙLFR’“îšÙʃª#9>‰õý¨Pž¤¤$ʹ w§†”-ãË—ËÿRŸùFÿF¹_K§&aT´uƳ|bM¬¢Nñ¿ßeé¶ XÝq6ñûÛ3+˦~¯“lѤ‚9…”ä$R ɘT>U=ѤÍKÈc?¦§:ð\åïݤËZÿUáÞur‹oí±,_ãÎ5tŠnþéûp¥ý¤±üØö-VÙt`þ؆8oH)téñņòUœ‰¹ F))p3ÖÀ¥ ±´ pÁÕÕ…¤¤dFj‹®F³ügœ¼}I8»AÏ%àìì”wœÊR©re¨LЬD¶ùˆ÷7vbni4¡|´} Ý<³ë)Îé KAk¥áNOW^û!˶ÒúÏ-lÙñ[f¿ÂìyϲhÍDÛ¥îO£U²laÙ`·–x>h"nêÀ€3 i¯wèœý JëŽÎÊLìÙ8•.q>Ún™“'“Ñœ©®*&cê³>Í‘¿3aÈ—DöÉúoêâïjCò¾q4œp×î}šTZìT@£Å:shº\TVÆ×—Ýûþ¡}ûŽè­4h5 ZÂŽ¿ÏоIåÎA6ì8ž±\¯ÓèeÃú}iX§fþœ¸óSxEö¨DnmÕv ñW–óß-P¸ ]þ.H__!DIbáM÷^h“wƒÿ®Æ«êÙuð&¨*öv¶øúxãè`ÏÏ;.àQ±2öžN”ñ4“”˜hÁÅ;iLû]ëÓ–ámõüñÅO\ñ¬§Xÿw$æÜ¶ÏZÞ,óô¥-ØÆ‘Šº0xÜÇ|¿ú#ÜÚÈÊc‰Ù#s ²Œ'g‘,å ñlħ­÷ðië=„x6ʘÿÕâÅ|µx1z½%-=UPÐëõËò߬“ùön¦¾¹Çs˜Úü<Óßü޳ə·7qé¯D›Ò~7„óϿѸV-‹uø¿7ñRŸF¸êÑbäÖñÓD™²Ä*‡Øé}‚ðU¯pàjòs,ü’²+kî!õñöÆÉÞž£§Îáj§E«Q˜ÖœYÛóÛ'±×k±×kùu× f O¯Õ*¸Úk9rêNv²ä®×6š½ 7UíE:ûç>îN™ݜWÝ)ï–çø<ù/FÚµƒOòØ/!„(qòl¡ËîaK:ŽÊetlHı”Føðñ7ѵUETTÖn=Ïž¨*ØúÚžD5¯D’G;Ö¥GT¨ÓÿJw[Îâðe„uu ÿ„7˜®¾Á³5ªŒƒë9ÊhÖñÛžÚ´õ"åìZ>üü$Pú®xå;w ^ª?›É3ÖÒyÖ3Tàkf~Ç FbÛ´á|¿f5o<Û•) wŸlƤBïv¡-t/´¯ÎèyÛÑ(`¯×ðÆ3A¬]½œ J•HLLÄÖöþ1ßÚÉ7[©óA{Êd~§%`Ö”ßpkܪ>zbOofþ{‹¹ü&½‚ »u.-æi tNÏoÍ<¿ðÚ›…B<,–u¹fù|·ÑÛвAެx{Ã'u æÛ¸øÖ¥çÀ–ì§Þ›ìb§ñ¢ã´Y\;‰n f`íâKƒg_¤ÁŸK [½ÞšÖO>ÉoVÓ³Q#ªVô'2ÁLBŠB¢!õ)6VÞî[W[…gγvõr¼½½ˆKLà¦2 ß‹T Èß3˜¸¾åvªù¬¥×Ýc(jmÐGüÆŒa³¸žXyQ½ÃV¾û •À júm½ÀûS?¦ÑOвù“Ë·lÝÎþÉÛãÇÞY_!D‰¢4iØ@ÝñÇŸDݼó¨£u+Ѿ{?Öþ°œçûô'>öî!ïS "Â#X¿e?ÿû#–Ïæ8ú¸aã`‡ÆJÑdMÜM3¶~ cí›W§”w)¬­ ¿;©¸²wtaÅ’ohÓ¡öv÷ŽýŸϯëÿwO|ßÞޞϟ?ʱð]ÌÙ6ˆ÷žÜ±,<â:6mâÕÁCqrtÎHæÚ·nw)¯[!Ã9>ïÒƒ_z­euoß<y~°òŠm:³ÙLbRìÝC|B2!¡µñpsÁÁ.µå-.!‘[‘Q>´mZWtøÍëÔ¨QÖš•+¿g@ß¾æ’Ô%%$0gæTÂÆ¾‡W©Bè¦-dË~ÎÓ]zœÀçÎóîSéñLZ6kÆæ­ÛXõÓ&K…òþèíøyÍJºvïMrRBÎ;BñP%'ÆóÛºUtìÑ/c^Äåó :‚ºlZG¬´:ÜÝÜhÕ¸®Ž§Øºgg»®¯„¢ÑãhüŠN7hÞ̋ڡUqwsÃJ«+x VI”¯kèîž•ñ,×,ûñöò¢}«Ö|þÅ\ztž•«VоUk¼½¼|l £%²°Xpüô.Fk++šÔoÀÕðp®]:ñC·‰¼}g''ìíðqwÇÞÞžääd~Û²…èÛ18:;УÇs|õí·y&uÅY5gt£–/ïÇÛãßäÝ÷§òõ¢%8880iÂXÊ—÷ËXǬþX|B!, º\ïýW°±ÑãëS ½µ~©ÃD$&žÀÖÖw· JyyáîÔË–Š:x˜ –Ñ=Wu|Æ]®/‡~|Ï~¼KyÒ¾U«´d®Þ¥<óq¬ÂPB2:H»È?õÿ^¸:»`41Œ©?FLFF£cÚ5dížjÆ_7âWνÿ•‘Ô |©å+<À:=@é7¢¤©àïǤño2cög¼1ü5*øûÝ}“JQ¿¼B!òÍ‚›"î´vd¦( ¶¶¶”)Sš2eJçy ìöñ(ËßM®wÖòhÈ'-þ¸³<›¸•òòä¥^=s\þ@èü¼nƒSZ¤ßù–[Q4 ­V›Ú ¥ª(Š‚FÑ`ÒšÐYé0™Ì Ê•)C—O³fýÏø‘šÔuéÜ•¥ËW0iüøZ¯EUÍ÷œ'åýýøôãihµš{–©ÒB'„%Nº\…î£ËUäÁ‚x¥ßɪÕjÓ; Z­ I‹I§ÃlVïJdTUÅh4”œŒ­­-ÏvéÊkVSÆ\šˆëDÇÄ<¨Ú€#öáéU m1|lVrB¬ÅëšÍfΟ8Œ——Ü!„%H® W)oŽÚO…ò(š<ƒé1e6™8rh?^¥|rL$$¾cIl&++kZ·ëÄ/?¯fÇ–˜LÅ«¥.8´&[ßlñú‚›»'uê5ÂdHy€%BQ˜rL謭õWãð¡œ:y³YþZ·”F£ÁÝËj¡Õ±¶Î~¤Xkkk‰oXÛ‡Z­gWWz¿4ͽª-r&“­6å2«fLFæb–œ !„ÈYŽ V«ÅÁÑ™:õžH½æH®ó²˜‚‚¢(XYYgû˜%ø”%±}ØÌ&S±N~Œ†¢.Bˆ-× ~t:-:Ýý=ÏRäLâ+„BˆÂPüúˆ„B!D¾HB'„BQÂIB'„BQÂIB'„BQÂIB'„BQÂIB'„BQÂIB'„BQÂIB'„BQÂIB'„BQÂIB'„BQÂIB'„BQÂIB'„BQÂIB'„BQÂIB'„BQÂérZ°jÑg³â1бG¿lç¯[¹è¡–C!„xÔä˜ÐtëóêÃ*‡xÄý´äó¢.‚BñÈÊ5¡âa ¬T“ÑTÔÅB!Š•:òìÍÊ#¡S ¯4BäÁd4Q»éS((E]!„¢XØ·ãWlìò\/÷„Nò9ñ)(¸B!„¸#ׄN•ŒN!„¢Ø“aK„¢„RU5Ïÿ !yt¹Zð¡`8Ëì6XÿâfÖ÷+S8wY¯ðm§V,ê¸M¯–—;7„-UU‰%&&†¸¸8bccIHH ::šëׯ‹Á` 11Fƒ z½WWWÜÝÝqvvÆÎΜœœprrÂÆÆE‘kU…x”ÂMj¦Ÿ…ôW¡Æ–€Vi[ÅEº}…£ÑÈéÓ§9yò$çÏŸçäÉ“DFF¢ª*f³›ŒäL«ÕbmmÙl&::£ÑHBB±±±¤¤¤ ( +++|}}  bÅŠT­Zooo4鬢¤Ëãºü)œ”ÎŒÁäL£7>¤QË!„%ÑÅ‹Y·nüñçÏŸÇÛÛ???êׯO¹råprrÂÙÙ[[[lmm±±±ÁÊÊ EQÐét¨ªŠÉdÂd2‘’’Brr2 ÄÇÇKdd$'OžäàÁƒ¬^½š„„‚ƒƒiÛ¶-Íš5ÃÅÅ¥¨C „( ËîrU8µr2£>ù‰7L u!°U f÷! ­ÕÞ{˜¯‡¼Ì¬ g‰s¦ç{Ÿ1¥SY¬HæÔ·ãóÍþ¹ZwªuÆG“{l¯€á,sÚ>ÍšV£i|`!+ö†ãûÚzÿ>„e×óÛàòèÒÖYÛ~­|Å’]牳湌c€)òOfǼm—Iv­FÏ7žáÚÔOqýz³êÛ=Ð !D~¨ªŠ¢($%%qþüy¶mÛÆæÍ›¹téuëÖ¥G´lÙGGÇ|í7sKœM¶ë´k׳ÙÌ¥K—غu+K—.eêÔ©Ó¹sgjÖ¬‰:\ð"DIaQ—«ñÒ*ÂÞÚFÅ)Ë™ýditÑç9x(½’žñ81GFLdÕë.\X5ž×ÞœH£†_ÓÉÄA©HÏÉý˜àŠéÊnæÄKS«°urmìÓ¶?½p5-¿ZÉáåžã.³ò÷ôãß9Æ©…?ÑáëåøÆK? §ã¸´c¸^guØ+̾þ,³Öõ§–æ Çg[¼†®…Ù,„…Àl6óï¿ÿ²~ýzöï߇‡íÛ·§iÓ¦<”ëÛ4 ~~~ôëמ={røðavîÜÉ·ß~Ëwß}GãÆéÚµ+eÊ”yàeBÜ?‹þü2E_&JWŽFMCñ÷Ö‚·e*§-4¤þp|r"ï÷k‚“Á¯¤Ù²Ql9“D';‚_DpúÎJwgâÛ¿³aü/œ™P›êÚ´íÛexSo¬k;]¶C˺wàúè€òíûÑdJ[Î$ѾÌ&¾þÓ‘M§[  £'ÿËúÎ?80Bñ ܾ}› °víZj֬Ɉ#¨^½:®®®Ev£‚^¯§N:ÔªU‹nݺ±wï^V®\ɺuë8p O?ý4¶¶¶ER6!„erMèR’“PÊvà¹Êß1ºI3–µx’&M[Ò¹Cüì0$cRuøVóÁ*%‰³¥ìR¸@J²Ê­¿¾aÒÔ¥l>‰1}ç6-¹•DŠuêö>U=Ñ$§moJƤ‚jL!%9 ³!“j…g”ôu :\ôÉ\ŠN Îx+ê–V2ʬñ©Iý˜ I¤$Ë¿Bˆ¢Íš5kX¸p!|ûí·u±î’ÞjçççG÷îÝùí·ßøôÓOY¾|9£F¢víÚèõú¢.¦"yd:iÝ•¶•²ìw~ùòUZúD±sö+´ìð.»¢Mië(h´ ww‘ª¨¨˜#gì/¹Ö|2ëwïåäñCZò4.Z5Óú Z+MÚ­wï#ólA¶ÙìC¦¢›„x|]¹r…iÓ¦ñÃ?0`ÀfÏž]ì’¹ì´nÝš¯¾úŠ 0iÒ$/^LLLLQK‘ÜïrÍü=¬q"°QWueà+-éÛâ=VM£Úi_ÙjÚ”e)Wÿå¸!ˆ7û4¦‚«˜¸uü4Q¦Òwms×öêcç¸N&ÖÞAø˜þä¯sI´M½8éâßœMVqW±h8=!„xN:Å;#V«eúô锘› EÁ××—°°0BCC™1c.\`„ Ò+D1“{ ]Z•t| -ØÀÞSW¸q›·pÚèI%]¦lIÍ”qÝÉÆtî)£9Ǧ=U3 g×òáç'ïÚÿ½Ûß}ü¼Ž¡õnN¿ú±|÷ÖLֻ•›™õîO\CÉ’ ÊTd“¡ƒ2lØ0jÔ¨Á—_~IåÊ•KL2—™^¯§mÛ¶,\¸K—.1bÄnܸQÔÅBdbQ—«ÆÚŠë[æ0¸K;5ëÈ‹_\ç©)3è_AG¦ì+Ë”:O[ª ¼Ý„ÿ&u fýæ´¹›à-qÑÝ»nvÛ[´Ž¶?žÅRÛóL;šõ]@Lç!uêãǧsçÎôìÙ³D¶: QRìÚø#uš¶aÕ¢Ï2æeþ>¸|žCGXxSD±ŸÌÄYê'¸rëWŽýÆŒ ßp%¸-¼5Å |2 ñ¸0¬X±‚ÄÄDÆ÷È%s•*UbìØ±¬X±‚“'Ouq„äySDIù"V1ÇbåÛ0áF `‡_“>|öî3”Ѫr —⡹yó&›7ofèСÅòQZé¿þúë÷•lÖ¬Y“6mÚðÅ_0sæLi¥¢ˆ="ï@§ú£X¹uTQDñ˜Û¾};Ô­[·È ÎÍþýû™8q" ¸¯„N«ÕÒ»wož{î9Ž;Fhhh!–R‘_y<ËUš¶„ÂR)))|ûí·Œ={{ûûÚ×îÝ»quuÅÅÅ…sçÎáîîNåÊ•IIIáܹsܼy³ÙŒ««+þþþØÛÛ£( ªªrñâE®]»FJJ øùùáææFBBBFéîÝ»qss aÆX[[绌îîî´k׎~øàà`´Z¹^Yˆ¢bù8tB!ruæÌ¢¢¢¨Q£Æ}ï«[·nT©R???~úé'žþy¾øâ -ZÄ‚ 8~ü8F£‘€€ž}öYÆŒƒ­­-»víâƒ>`Ïž=ÄÅÅáããÃÓO?ÍèÑ£IJJbúôé<óÌ3ǺvíÞÞÞ*g½zõ˜7o‘‘‘xzzÞw½…“G—«dtBa©“'OâááQh×Î:tˆJ•*±dÉÙ·oï¿ÿ>ÞÞÞÌœ9–/_άY³ ¢N:L:•cÇŽ1qâDÊ—/Ï–-[X²d NNNŒ5а°0f͚ŲeËpuuÈøY¾¾¾$&&rãÆ Iè„(B¹&t‡öí~XåBˆïúõëxyyÚµs7fÊ”)xyyðæ›o¢ÑhX¸p!AAA4iÒ„þýûóÕW_¡( »víbùòåtèÐH}|—••‹/fäÈ‘„„„мyó·Êe¦×ëÑétÄÅÅÝ÷¾„—kB׺kŸ‡Uñˆ[2ojQAˆ‡¢0GðððÀÃÃ#ã÷ÈÈHôz=óJ•*…——‡&>>žøøøŒdÀÎÎŽ€€nݺ…Éd*´² !Š—<Æ¡Ba UUqss#**ªÐ’:FƒF£ÉØ¿»»;ÉÉÉœ>}UUQU•k×®··7888päÈ‘Œåñññœ9sOOÏ»nZ0™L…RNƒÁ€Édz$ž„!DIöˆ ["„EKQBCCùä“O¸}ûvƤ…¹ÿÎ;³lÙ2 ÄàÁƒ±··géÒ¥ìÝ»—Ï?ÿœš5kòÄO0|øp.]ºDùòåÙ´i .ä•W^ÁÁÁ™?>M›6E«Õø.W€K—.¡×ë ¥ûVQpÒB'„…¤B… xyy±ÿþ²ÿzõê1fÌ­VË+¯¼B›6mˆŒŒÄl6ãââBÙ²e3Æ¡kÖ¬+V$<<ƒÁ€½½=eË–ÅÕÕEQ(_¾<3fÌ`äÈ‘$%%¸51::š­[·òþûïËtB1Iè„¢uìØ‘7²cÇZ¶l™q \~Õ¯_?ÛùÖÖÖT¬X1Çí4 eË–¥lÙ²9.÷ññÁÇǧ@åJg0X°`ÕªU£^½z÷µ/!Äý{tº\Xв<-æ_ÀPÔeB<¶\\\hݺ5«V­âÖ­[E]œBUUþþûovìØÁÀ‹å#΄xÜ“„ÎŒÁ`.êB!Ä}ÓéttéÒEQ˜5kf³¹P‡2)JéwÎFDD0sæLÚ·oŸkk¡âáÉ3¡Ûµk®®®O»víÊû¨†3ÌjêOó)ó™øL]K—£åœÓ$Çà«×ž"¤LiJ—à‰žSØxåN{›9Çå±üþRSÞ9‘ÂÉwâ_º4¥ƒ_gOÂý„F! ÆÃÃɓ'süøq>úè#bbb™¤îÊ•+Œ5ŠÐÐPúô郕•UQI ]ãÆY·nîîî¬[·ŽÛ·oß3e^Þ¸qc màÔW? ö?Ž]:ÏÆölö“öVæÍ·óÇosé·—{Íäh`Šà9.w¤Å¼SŚʓvsþÊ®ý”ú2,’¢ˆxyy1iÒ$öìÙçŸ~JTTTQ龘ÍfNŸ>ÍøñãñòòâÕW_ÅÞÞ¾¨‹%„HcQ—kãÆY´hýúõ»§n×®]ôë×E‹å#™KåØa"aÍ|°Öè°ŽÞÌ—¿ëxæ“÷y¡~ þÁm9g UÎ.á›C ¯þ¹,Bˆâ&$$„·ß~›#GŽ0bÄ®_¿žÑmYR¨ªŠÙlfß¾}¼öÚkøøø0nܸ»ž`!„(z_C—]Rw?Éèð­^›´ßR®à’@³ªŽ¤_^kUª.u=¢9~&†Ä<–Ëm„ÅF£¡fÍš,\¸R¥JѳgOV¬XQbZëÌf3—/_fúôé„……Ñ»wo&OžŒ§§gQM‘E¾†-ÉœÔ 0€¯¾úª€É€‚V§AÉ2/çµ-Y.„Ńƒ“&MbÅŠ|÷ÝwüñǼð ԬYó¾Æª{âââØ°a?þø#:Ž©S§Ò¤I“Ã"„x°ò=]zR×±cÇ|^3—;ëÒ5)«nfû‰8º5vÀñ7ßt¦F 6¾¹/×p ­0ËݲBˆâÇÎÎŽ_|‘æÍ›³bÅ ^ýujÕªÅàÁƒ ÎH”Šjônत$¶oßÎüù󉉉¡oß¾´iÓOOOžDˆb¬@ 7nܘ+W®êØu>mÜ↎z‹úsÂhdšc?âDÀ f‡Ú¡³Ê}9:e}t\Ùµ›S]ñ±±ÅÉÅ^FNB:ŽòåË3vìXzõêÅÂ… 4h+V¤C‡T¯^råÊakkûÐ’'UU¹}û6.\`Ïž=¬Y³ƒÁ@Ïž=éÝ»7¶¶¶¥BˆûSà|§0“9´¥è4g7Çáý.MˆBOÙÆ/ñÕ¼ÛäµÜ‰†£FPoà[°„êÖ­[;vŒ#Gްÿ~nܸ··7ýúõ£E‹Ò"'D S4 XV„í8OX–Ù§š ˜»‰s³ß,÷å ö¡CX²gH!V! EQ¨X±"Ç'**Š‹/²g϶oßάY³pvv¦J•*4hЀ   *T¨€³³sƶ™f•Þ…š~—êÍ›79~ü8‡fÿþýœ>}½^OÍš5éСAAAøúúâàà ‰œ%ôH !DÓjµ¸»»ãææFHH¾¾¾œ>}šaÆqíÚ56mÚÄ‚ ˆÇÑÑœqvvÆÆÆN‡^¯Çl6c0HJJ"))‰˜˜"##¹}û6F£WWWªV­J«V­¨W¯6làÕW_¥R¥J’Ä QÂIB'„Å„ªªìÛ·¹sçF·nÝ2dñññ„‡‡såÊ"##‰ŽŽ&::šÄÄDŒF#ÉÉÉh4pwwÇÎÎ'''ÜÜÜðððÀÇÇŸŒ';DEEqêÔ)æÎË|€ƒƒCQV]qŸ$¡BˆbâÆ|ðÁ4oÞœŽ;fÌW ,”c9;;ưaÃX²d ƒ–V:!J0PH!ŠÈÈHÆŒCHHC‡}àãÓ)ŠB`` S§NeéÒ¥üïÿÃh4>Ðc !Iè„¢ˆEEE1cÆ ŒF##FŒÀÑÑñ¡»zõê :”yóæqôèÑõX2!Ä’Ð !D2 ¬ZµŠ={öðæ›oâååõÐËбcGêÖ­ËŒ3ˆ}èÇBÜ¿\¯¡»}ûöÃ*‡B|8aaa̘1ƒ±cÇbcc“÷†BˆbCZè„¢ˆœ8q‚iÓ¦1dÈ4hP¤7%xyy1qâDvîÜÉ?ü ×Ó QÂHB'„™ªªÜ¸qƒ?þ˜ÐÐPºté‚NWôƒT­Z•ádz`Á8 ×Ó Q‚HB'„YRR³gÏ&!!±cÇ›ç¥*ŠBÛ¶myöÙg™]ñi·ê›£Ùý~?&îñgðÿã×?ð~ëHæ¿:šŸ#¤ûAa™0mÚ4FMõêÕÑhJN爳³3S§N%""‚iÓ¦‘˜˜XÔEBdã¡~ª4hЀÏ>ûŒ¾}û²k×®»–íÚµ‹¾}ûòÙgŸå#™KåÖn$/ÕqG§Øà÷Ô 4ÔcûI˜Â·°h§Ž§ß›@÷Úå)W¥%C?FÅó+ùîX"¦ð-,þÆnï¦cpJµgäÛñ 5¡3Ýüy¿ØÐwêºÔ®@é2UhþÊ;¼ìýßï¾…¹Ð"#„xT]¼x‘?üN:Ñ¢E‹¢.N8991aÂþüóO¹žNˆbê¡ÿ™˜]Rw?ÉXáè…uú¯Z{\m’‰J4“~„+øÓ¸²齟:¯šÔt‹æÔ¹XÃpUSFí3öfЈ@ëÔµS.ÿÃù¤‹|ѵ!!©]®!5žfÖÉD]FnwBä&99™Å‹cmmMß¾}KTË\V5jÔàùçŸgΜ9\¾|Y¢˜)’[¬2'udÁ‚LæRÝ{׿ŠJú‡Mβ)* Ña•ù3V±B—¾‰jFÕ„òþ–¥tö,¹ÄBˆ‡/ýº¹mÛ¶1cÆ |||ŠºH÷ÅÊÊŠ^½zqþüyFŽÉüùóqss+êb !ÒY–’žÔM›6í¾’¹ÜXûT£4çÙ}êÎÀ˜Æëÿòo¤3•Ê;bãŒz™C×îÜ‘q„‹É©É uéšøqŠûoK÷ª"_Ž;ÆŒ36l!!!E]œBammÍðáñ±±aÞ¼yÄÅÅu‘„iŠ´Ù©Aƒ=zô$sÚR-è×ÄÀÿ&}ÀÿžçòÉß™;n§ý{Ð;È­w+^¬w›3×ð_’ŠštžŸg-åbúö^­ÚÙ‘G0ë—ƒœ¿z…óGv°òÓYq6%Ûcšb/râØ1Nüw‹5‘k§qìØi®%HJ(Äã@UUn޼Ɍ3¨[·.íÚµC«Õu± ››#GŽä÷ßgË–-r=ÝÿÙ»ïð(ʵÿ™mÙÝô„ $$BÁ‚€ Ѝ*(•ƒ¨x,ŸX)*å€ETÄ.J; 4齡…$NÚöùþX‚4…„„佯k®egwfžÙ ³Ï¾UªˆJÕ²Bç0Ô„Ðkâ§ä¾õSêK>Â:<Àô÷FãBŸ‰3H}ù5uþ½_(í£Ýæ/<ÛË~t~mÓƒßeú›Cø¬ð ¡Yç<í{ñtñæÿcà˜í¥Ï¿=˜¯ñ¡ïÜ•Llkª¸s¡Jp8Ìš5‹‚‚&Mš„Á`¨ìÊ]\\£Fâ½÷Þ#**Š-ZTvH‚PãUzBwMt‘<±xO”]çÕ’WWŸK¨dŸ–<8ù'œ|ñ]hÚ1ò¿ËYvåSeö¨ã–ÑrËè¿’ïmsÙ·ïï½W„êgëÖ­¬^½š×_½Ú¶1“e™^½z‘˜˜È„ ˜9sfµ=WA¸Qˆ–þ‚ å@UUrssyÿý÷¹óÎ;IHH¸¡{µ^‰Ùlæé§Ÿ¦¸¸˜/¿ü‡ãâÍPA¸>ªïÝFá:ÊÏÏçõ×_§nݺŒ9²ZVµþU`` “'OfñâÅüú믢= T"‘Ð ‚ üªªâr¹Î‡Íår±páB’““ù׿þ…V{c·fù'¢¢¢¸ÿþû™3gÎy󽪪ŠÛíFQD‡0A¸DB'‚ð-X°€Y³fát:QU•S§Nñå—_2dÈ¢££+;¼ëJ§Ó•Î÷úÁ”~&™™™Lž<™ÄÄD1± \"¡Aø¬V+?üðO?ý4÷Ýw6l`ܸqôèуÖ¨Ò¹þþþL˜0ÔÔT¦L™ÂÒ¥K¹å–[xùå—Ù´i“(¥„ë æÝyA®Á‰'8~ü8.—‹Å‹³ÿ~¼½½ùàƒjD»¹Kñ÷÷çé§Ÿæ™gž!??ŸÌÌL$IbÆ 2³Ù|å‚pÕ.›Ðý–òêõŠC¨öêWv‚pÍTU%))‰C‡ž¶s‡&88˜Ÿþ™aÆa2™.œ°Z+éá;þ|Ž?ŽÝn/}í÷ß§¨¨H$t‚PÁ.›ÐúÖ¾^qÕÜéÊ@ÊÕjeÕªUœ·>;;›1cưjÕ*¦L™BDDD%Exý¹Ýnþøãž{î9öíÛwAO×Ó§O³fÍî¿ÿþJŠPjцNáo*..fåÊ•-Óh4X­V¬Vk%DVyTU½ Áý«E‹]§h¡æºBB§ŠE,å´Â/99™œ×kS–e|}}yíµ×øøãiܸq%FxýiµZúôéÃ×_ͽ÷Þ‹V«=/áUU•íÛ·“™™Y‰Q BõwÙ„®²S±TŸEªƒï¾ûî¼›ÞÞÞôêÕ‹+VðòË/^­g‡¸½^Oll,sçÎeΜ9´oßæÜ|×YYY¬^½º#„ê¯æÝy®K*3nÿ‚Y»•‰ ×HUUŠŠŠX½z5Š¢ IuëÖåßÿþ7Ÿ|ò mÛ¶­ì«ƒÁÀàÁƒùä“O:thiGˆüü|¶nÝz^g AÊ×å‡-ƒA^½’ÏNU¯âstqü‹•|¾ð'³œ€–€Ø(îx¶#77ÕS³úÏ ÂÕùë`¶WÜö¯íâþú|çΜ:u FCBBo¼ñ]ºtÁd2•OÀÕ„,Ë´lÙ’I“&ѺukÞ{ï=Nž<ÉŸþIzz:‘‘‘ç½ÿÂër¥ûå¹ëRÓz Âåˆqèª(É7„®#šR?Ô Mñvµ‘yÏ9 úîVZùVvt‚P5¸ÝnŠŠŠ(**¢¸¸¸t±ÙlØívŠŠŠ((((]¯ª*‡£t"y£ÑˆF£A£Ñ`4ñõõÅÏϓɄÁ`Àh4b6›1LŸ>UUyóÍ79r$•|öU—ªª3jÔ(úõëÇ˯¼ÌO?ýÄÊ Ké[çVj1v¥§bÅ¥8p¨ÅX\g°)E¸TªªàR¸U'ZÙ  ²¤Á {cÍ5þèe#I‡A6cÐx£—Mdo¼4>è$£Hø„å² ])Ÿsžañ#?±¥{gZú“Õ;ò±ƒé6æV†ÜêƒP‹²X1e‹VæP¤j nÛŒAãh]ÛSk­œbÉ;°hS!NßZÜôxcœ€³Ÿ£½€mŸ®ãÇ…édÙÀÉc»p{K¯‹Ô{k ¿;žðÒç!4Ìgëðd’2ÝÄùj.ØBª+UU‘$ UUÉÏÏ'%%…ãÇsòäIN:Ezz:ùùù€§§©,Ë¥‹——&“ £Ñˆ——’$¡ÕjKKÕl6N§›ÍF^^IIIãp8Λ‹Ôáp°cǼ¼¼°Z­üøã„……IDDF£Hà\i›Õ}†,ÇQrÇ9ã•JÍœ Ò²þÌ'äû 9»r°º p©vT®n& -:ÙˆY€·¶&M&?ÞÚ`|t!ê Ð×'HA°¾Z¹æü,TW(¡«)) (¤ýx˜¶û2}²Žìÿ­â­ÉëˆiÝ‹öþV¶¾½„o’#xxFšóY7e53ÇjÿYÂu¶¼µœ© >+ŽÆr&ËÞ]Ç^‹†Ž¨ ØHœ¶˜ÏEðàûhì&uùf>}a¾ózѹÖå¿”âöýï8g‚ÃhQW¦æ\¡&RUµtq:ìØ±ƒíÛ·³gÏ<ˆËå¢víÚ„……JÏž=©W¯Þy‰›Á`@§Ó•.Z­Fƒ$IH’TÚ`ßår ( n·—Ë…ÓéÄétâp8°ÛíØl6¬V+………¤¤¤œœÌ¦M›HKK#;;š6mJBBíÚµ£Q£FhµÚÒÎÕ5Ñó$o***¥˜4ë>Ž­ç˜e+yŽ“Ø”|¬îB¬î|Š…FƒT\ö½$[$Ëç¦à®bw’ë8§:Ö³o ^Œ ²³6˜º^1D˜ÚÒØ»;A†$dÏRM¯‘P³ˆ*×2|oiG¯VF4@íî±ÄÎ\ÅžmÇY¶Y¦ãû¸©¥ îzµ {ïaå¡89ÎòmZºNoO§àýcO³cT2JN ¿®ÔÐó“ötŽô|‘?Ô…>«°z«•Nw˜.Ú.κy9£_<‰ À·Ìè@1غP ©ªŠÍf#==””6mÚÄÁƒ9qâ>>>ÄÄÄУGžþy¢¢¢ðòò*—ã^˼«ªªR\\ÌسgÛ¶mcþüùDEEÑ¢E âââhذ!!!!ètºr‰¹2”-%uª6ò'Ȱ'qÒ²‹Ã…k8fÙ‚]± !]²´M£÷,ûƒôܾÜXÜg°¸Ï”®K*ú™Ù¨(øéˆöîLcïîÔ3¶$PŽŸ®.²$j@„ÓeïfnÅ}¹—«EAQe|# ÈŠÏYk0Üd[ÜØOg’·EjPJ>“€Z4ô·“’bŪd’#ûÑ;B.ýÌ´á¡„ê’QU7¶ôSœ¶pdèþ:¼fÈi ÅpÑ ¡kÞ×>‹Ç~æ {¿ßÆ·c7Pë³Î´ð¿&…êAUU²²²Ø°aüñ©©©h4š4iBŸ>}hܸ1Mš4ÁÛÛ»²C½€$Ix{{“@BBÇ'//Ç“˜˜Hbb"ëÖ­C’$5jD×®]éܹs•<—K)Iä$I"ßyŠC…«9V¼…“Ö]œ°ì®Ÿ-ó$Rê P{ œ½ÃŸq¦²#ïväý€¿.Œú¦VD˜hìÝ•szÙ„$º  7QBW†$_øŸ÷ïÜ $$´eÃÉš’窊*×â‘î SÐß¿AH&oBzA4h¤#åÞÕ,ßÙ–æ=¼ÄmF¸a•T§¦¥¥1gÎV®\‰N§£wïÞ 8úõëS§Nn¢{I’ ¤C‡´oß‹ÅBFFGŽaíÚµ¼ûî»øøøÐ¯_?î¹çK“¥ª¦¤-œ‚›lÛ1¶æ~;‚ÿ‘ëH¡Ð•uö¾X’ÄݸJJóœ'ÉË?Éþ‚ߨ¤ ¥–¡!ƒ†Ñ¯FÙ¨š×IÊmè€sç©þåßžG]í`‚Ô“$sÐ>ÀSmâÎÉàÈ=‘á:ôµ‚$ƒ£.â¼Ï¶ÍÉÊ&ÓÞ¨èê„Âq¶í±ÒñfãÕ%cŠ·¢–¶[„Qvv67ndéÒ¥ìÛ·Î;3yòdâããÑëõ•^¹‘$ ³ÙLTTQQQôìÙ»ÝΊ+øå—_˜7o]»våöÛo'>>_ßÊïº~nø•W&)ÅÛØ˜;—?óãVÔ„ûŽKµ“í8F¶ã W㯥]ÀÄûßC˜±9zY Q#T]—ïåZýÿÿzüeÈ8µÌ:)8œžv0{òf½Gã6LÝIZýæ<ÚH‹¤‹àÖV;ùvÖÚoB)ŸM³ö“ D© Epçí»˜>y ?«mékDÍ;áui¨=ÛÒ=â/m6lÙ,†o«êiqçå²û»$Ê¡<ÚÂjM¸µ Õ‰ÕjeãÆ|óÍ7äääСCFŒAË–-kÌÌ ƒ;Ûn»mÛ¶±hÑ"&NœHLL Æ #66öšÚô]+I’p)ö,cKî<®Àê>sCT£V7yŽT–gLf÷™_‰÷@»ÀÁ„z5C’jÆß¬pc%tÀ•Jè$¼|…Ó6ñÓ3?SŒ† Ö1Œ|­%õ *`¤Ý+7“=aïöߎÖ×›˜¾±4Ù¹ÿìözbÇôá©À-,˜º„eE€ÁDD»FÜé]öXgɼΤ²tÂ.²-€¤'¤U$ÍhMûà‹¼_ª(UUÉËËãõ×_gûöíÜyç¼òÊ+„††ÞpUªåE¯×Ó©S'ZµjűcÇøâ‹/1b÷ÜsO>ù$ÞÞÞ×½zOUUr),˘ľü%ä:S÷(ù 2ì‡X™9=ù¿rKÈ¿èøZÉ ªa…*EêÚ©ƒºvÃ&ÎdŸ.]¹èû¹ÞZPIa ÕMî _úÝ7좯•ü½EF5¢m·Ûñ2Ý8Æ…‹+™*kÉ’%Ìš5‹:ðÔSO&¾ÿBQöîÝË”)SÈÉÉaܸq$$$”[OÞËQU›RÈö¼ïXzúr)~ÌVÒÓÔ§'=k?O´wÑ+V¨pë—ýDÛn·óÃÜ™¥ëÊ~Ÿf¤çñQc®Tå*~¡ ‚ðÏY­V¦OŸÎæÍ›6l÷ß-‘»Y–‰‹‹cÊ”)|óÍ7¼ýöÛ<ðÀ 2¤B‡:QU•"W«²f°*ó?ؔ ;VuâRì-XL¶ã(ýCß!ίŸHê„*Aôr¡Ü¨ªJaa!¯¿þ:'NœàwÞ©ô¶a7Š   ž|òI6lÈÔ©S±Z­<öØc–Ôº2ù%ýßlÍý§j­cTg§lûù>õ_¹²ÏVÁêEé³P©D:AÊM~~>ï¼óÙÙÙÌž=»ÊÎwš––Æ®]»èÑ£fóÕÖ]2sDzz:²,së­·^s\%÷DEEñÌ3Ï Óé2dF£ñš÷]ÂSÍZÀ¯é¯±!gN¹í·"d— êÆ_Ýö¶3Pt lù ºAï~`ð…òȽr),L ¤¡CàÃHˆ’:¡òˆ^®‚ ” ·ÛÍÒ¥KIMMeüøñU6™X·n<ðIIIDGG_Õ>Þ~ûmV¬XÁ âäÉ“å_“&Mx饗˜1cÑÑÑÜtÓMåVú£àfCζäÍ+—ýU¤Ýs 0\e¨›§Bæ>(< ª LÁšíF©VùÄXàÊ`É©·ˆ2w¤ŽWLùìT®Âú^«bK9-Bu—‘‘Á·ß~ˈ#hÔ¨Qe‡Sá’““¹çž{èСC…ì¿k×®Ü}÷ÝÌ›7‚‚òé ¦ª*',;ؘó9NÅV.û¬ÊlùÐôèýèó„wc«`ï7åy•lÇq§¿CU×Bå¹l ÅVt½âª½ª[Z#\›’ÎSü1qqqtí򵆮–s:,_¾œØØXTU%)) Y–iܸ1¥Ç/,,$))‰¬¬,dY¦víÚÄÄÄ”vÄ(((àÏ?ÿ¤¨¨ˆÐÐPÜî §5LKKãÈ‘#c2™hذ!aaa—<—ü€Ã‡“””T.ç[–N§ã®»îbÅŠ¬[·Ž¾}û^ÓþTUÅ¡³5w>iÖ½å¥GAäõTæŸ[èÌå©Þô¬9ž×Vϼ®¾aà]·$@(Îò¼Žê©-[K¤ª ¸  ,YžÎV¡ê}.^…ÚkÚùσCn2dì.×ÓT¯&±`­üïS† •â² ]ψ·¯WB5·xã'•‚PA$I"33“uëÖ1}úôr(¸¨¨ˆ~ýú1lØ0²²²X¹r%†ž={2mÚ4ÂÃÃ)((`âĉ,X°€cÇŽ¡Õj‰ŽŽfĈ<ù䓸\.¦L™Â§Ÿ~Jvv6-[¶$>þ\£,UUÙ²e ï¿ÿ>k×®%//___ºwïÎ+¯¼B«V­.yN=€¯¯/·Ýv ,àŽ;jWI’(te±¯àpvÖò’òlúž†Ã =Õ¤^þ{?ÄÞçIîrß_AÚOəε[Bü£P;Γný¤mõì3â&(J?êهà áÐBÈ;n;˜C ¼+´{t£™¡Ûмk—Û©—*tf‘TôÍ|{b¯®]¦ \ 1ܵ ×DUUöîÝ‹,ËÄÆÆVÈ1V¯^M÷îÝY¹r%cÆŒaíÚµ|÷ÝwÌŸ?Ÿÿþ÷¿´mÛ–eË–ñí·ßÊ„ X½z5kÖ¬aöìÙtèÐ%K–0räHV¬XQºï'Nðæ›o’””ÄÔ©SY¿~=S§NåÀ¼÷Þ{äççWÈ9ýªªÒ­[7öïßÏéÓ§¯¼Á䨑e?BE5ƒHÛ íGÃÿ…à¦pðO‰˜£ö| '7BˇàÎÙÐñ9O©Þ®Ï= àþ!}Ăۧ‚1À“ä•8½vÎï:pË;Ð÷hØŽ®€äeWŽÍiÃKàÌ hÜ¿üÏ]E%ͺgFùï\þ1–€ ×,==4šŠéå7dÈF…Ñh$..Žùóç³w¯§Úð›o¾¡uëÖLœ8‘zõêиqczöìÉ¢E‹ðññAUU&OžLÆ q8œ:uŠW_}€ÄÄD6nÜÈèÑ£ñóó#++ ºwïηß~K~~þ%;x\a*êÕ«‡Ãá ==ºuë^yƒKPU•Ç *r*¯„QžR7ðT©þú(XsÁ©› ùýÐüÐè ¤È:Ø0òSàøj¨×ZñTÓúE@ö!pœmùstH2ÔïìIGí…ž¤1u«§]\ÌÝ—ŽËi½_Câ÷{/Ôk_g¯’ï<…Í-ä*‡HèA¸&’$!Ër…V?Ö©S§tæ³ÙŒ$I8²³³‰¥vmO=šªª4hÐNGnn.༷~ýúhµÚÒÄ ¸¸˜¢¢"Þzë­ÒíËž›Ëåºd\]å*IŠ¢”~Æ×º¯ŠžƒÔ»L¾©3ƒêö,ŠË“˜ùÖY[DzÚÓ¹ìžR<ƒŸg;/?ЛÏ%t¶<(: ¼qáqk]¦`Øž‰?À¾ï º—'¡”+htOÛ9Ñ~N¨"¡ᚨªJhh(™™™¸Ýî )¥ó$#ÿ¢¬W¯§OŸæØ±cDGG£ª*ûöíÃápP·n]Ìf3Š¢pðàAš7oŽÕjåСC¥ÛûúúâççÇ«¯¾J—.]JAv»Ý8ÂÂÂÊý|þ.UU9yòäIèÕ ÒGPÞíçʺT¥¬¯ÈI‚ÝAkô$z™‰žŽ :=ly` ‚¢ Ï8r%Ì!àS:õ 9"ÉžÓPÜç’Ä¿²äÀîÏ=U­Mï†VxŽW19—„Ÿ.£Æ·"v.W$ºŠR¼‘go~Ó‡¿3±­©²£„ #I­[·F–e¶mÛVaÃx\ÊСCyúé§3f ƒ¦¸¸˜9sæ Óé¸ûî»q»Ý|öÙgüë_ÿbذa¤§§óõ×_—nG¯^½øÏþCAAM›6E£ÑœœÌ²e˘3gNiÚ²V­Z…Åb!55«ÕÊâÅ‹®i°â‹ùí·ßhÛ¶-µj]ûÀiÁ†(B±¤[÷•CdŸ—?Dtƒƒ?yr©Z±Ppö·жàßÞî©Ý1 ê¶ñtŽÈ=â)ÕˆîÇ×xÚâEÞì) tÙàÌQÈO…['\xÜ “áØ i!-=íðÀSòW;®|Kêdd"Lmð×…–ßNá ]UçÎdé˜;yqUm§ndîmâןPõøùùѧO¾ûî;âãã¯ë¼­wÞy'Gåûï¿gøðáhµZš6mÊk¯½F»víp¹\Œ5Š™3gòä“OÒ¦Mî¼óNfÎôLt]§N^~ùe>úè#¾üòKÒÒÒPU•zõê‘€ÉtñdO<ñÉÉÉ¥ÏûõëpMƒ—¥ª*YYY¬]»–Ç{ìš÷à­ ¢¥o?NY ráÐ-Eg‚惒–Ÿ_{’ªÐ¶žNæhÜ×3dIòïpôwˆ¼õìÐ%ŠgAÎõ¢Ý=×S’§õïPOUêÅœÜàyÌÜ¿?n}Pc¸ósËo|uµiìÓ­,æ,*‡Hèª47§gêÉæÔgKe#—5xð`žzê)Ö­[ÇÍ7ß\.×øøø°k×® ª=.\Xšhy{{óüóÏóàƒRXXˆ,ËøúúŠ,Ëèõzžyæîºë.ìv;þþþ˜L&†^Ú®.66–‰'2fÌ, &“‰   üüü.ÛÂ… KÛñ•U²Ïkåt:ùõ×_ñ÷÷'!!¡\ö©“Œ´ ¸Ä‚圴î,—}D÷ö”ªyùŸ[ç æƒOèÙörQž°-·ÃSMêàÙF’<½W;½àÆ<³:Ø =íïJ4èu[{ÚŹ i<Õ/Wÿ9ç²´ÏR^$4Äúö¡±w·òÛ© üC7\B·yófü·ß?þü+W91ëî,íù2=ÌåÛM)›š1àÕ©¼Ò'  îeþÛoðñÒƒœQ „uÌ‹o>Ë-u=g+g¶3ûåWùdm*vÿXî}v ô·½íËþó&Ó~ØLª|õä±Wÿ¡mü/9ûŸ+m¯M/äÁéÃØüðÄäBUÂðáÙ9s&´iÓæš÷©ÕjiÕªÕë›5kVúoI’0DFF^r?F£‘ÆŸ·.((è¼ç>>>øøøüíØÊÆPžJ:Z,[¶Œ 0~üx¼½½Ëeß’$QÏG÷‘ü”ú"w^¹ì×àYÊÒ ¸IÙc{Ú¯.ñK²§#„W™üÙð— Ysñc]JÐuš°$ÄÍuß@'{]Ÿ ÂEÜpãÐuèÐùóçÈ¢E‹ÈËË»`Y´h/™+åäÈ׿©¸+ï IDAT¢þ%ëvmgÑ µXþú¬ÈQÀɲ—câÎhž»ˆ¥?N¦e>£Ÿø˜ƒ6<Õ¢ÿ~ŠÇ;0þ»e,Ÿ5Í7ï³¾ølÃc%Ÿï ãµ- ññB–/û‘wnËeÖÈXœq‰jç ~xõ#ì¼ÅàH}y|t‚P¡dY¦[·n´mÛ–É“'säÈ‘Ê醤ª*6l`ÆŒ<òÈ#ÄÇÇ—ëð(í†Ð)èQdtå¶ßš*ÄЈ»Ã&à««SÙ¡5Ü —Ð'©›9s&C‡eýúõç½¶~ýz†ÊÌ™3ÿqãìÀÞcy¤mZÉ‹ˆžÒI»Ÿ?ŽÚpŸ^ÉÜuZú¾ù ÷¶‰$<æFMx†FÇ¿çëýVܧWòå/¼ùýbëÖ¬cÿ¯Ág{’¹³WñÑÿ¼:ñEîjEX½z<1žáuvòÝÆ.¬ppü›—ùDy”·5·\á†áããóÏ>KË–-5j›7o¾ì°Âùìv; ,à•W^aøðáôïß®üïzÙH¯:ãè^ë)ôrù”þÕDAúÜ:‘¾w Wð0‚p%7\•k‰²IÝ_|A—.]®)™ÁÑ!”–…iÌxÙIµ*8Nï#<ÜÄ»´·»6$žøÀ|bU÷‘.GñX£s=ÛŒ ;­÷ _îHÝÉqÛ vßÝšÿrÔðô|\”9.à<6ÏÖòļû‰Ðöx*‚P‰|}}7nµk׿¥—^bРAÜwß}^¢¡“€¢(¤¥¥1oÞ‚;Cߢ™oOŒ²_ýûª¦>¡OR—˜˜ˆÑXŽƒ •¡©}3úNåÅ×ߥÍÄ'ho:ÊOoÎ ©Á0&43¢ÑÝÊÃí¦óîÔ_è7õ^"IañôyœZšÛÕÿCž|m ÓÕ±Ü ¹Él]±¥ßX5<¿ÓƒÆ;ŒFe;äe୑Є5¢Q}1pãe™zõêñúë¯3hÐ >úè#xàºuëVšìy{{Wë/FUUKÏOQrssÙ³g?üð‰‰‰ôèу·ß~»\¾Z²¤!Ä+ša“Hx€™S9R´ŽG êEZùÖ$ZÉ@=cKÚÜK§ G0kƒÎNñ%UKµHè€ KæÐ„Ðkâ§ä¾õSêK>Â:<Àô÷FãBŸ‰3H}ù5uþ½_(í£Ýæ/<ÛË~t~mÓƒßeú›Cø¬ð ¡Yç<í+ŠÛ„êO’$bbbxÿý÷Ù¼y3+W®d„ ÔªU‹›nº‰Ûn»­R§ØªH’$¡ª*III,Y²„M›6a³Ù¸ùæ›9r$±±±¥ÓUõM­\ÿ#R,ÛÙ›¿˜]ù ȶ«Q‰„ŒFÒÒÐÜ™–þýhîÛ‡C#ÑñA¨Ò¤®:¨k7lâLöéÒ•‹¾Ÿ @ßž¬¤°„êfñ7ŸÐï¾a}­äï-2ªm»ÝŽ—Iôº«ÎTUÅjµ’žžÎÊ•+Y¾|9¥‰]I©V«E–å®ôNUUEÁápPTTÄÚµkùí·ßøóÏ?‰‰‰¡OŸ>$$$Š^_µ‡$²»‹ÈqœàpÑ6æÌá´í.Õ†[uVvhB'1Èfšøô cÐPê[á« A–´¢TN¨4ë—ýDÛn·óÃÜ™¥ëÊ~Ÿf¤çñQcªO 7I’0™LDGGÍã?ÎÞ½{ùé§Ÿ˜4i.—‹æÍ›KLL áááÔªU £ÑXe“;UU)(( 33“ôôtöíÛÇž={8|ø0AAAtéÒ…qãÆUÙ¡þ#7¡Æf„›Ñ5øqNZv±;ÿWŽm&ÇqŒ3Î4\ªO§1õJ»«b<15~餠¹ï4÷½}x•ý[„K •J–eâââhÙ²%ùùù,Y²„_|‘Õ«WÓ¨Q#\.~~~DFFKtt4QQQ—œ’ëzP…œœŽ9BRR‡âèÑ£X,|||ˆˆˆ [·n<õÔS4iÒ¤b›„\'IGs;˜ÛQìÊ!ͺÓöC¤Zöpºƒtë>ìJ1r­ž•PQð×…njC˜±a^-36§–!­d‰œpà •®¤×ç† øüóÏ:t(?ü0f³™¬¬,>Lbb"ß|ó éééH’DHH 4 ::šððpêÖ­K½zõ0›Í¥Uµ%%K‰’—L³UöQQ”ÒGEQ8sæ iii¤§§“’’‘#G8~ü8yyyhµZ4h@“&MúˆÍ›73bÄ TúZýúõiݺués«ÕJrr2III;vŒÄÄD~ûí7Š‹‹±X,èt:Ìf3&“ £ÑˆÁ`ÀËË FƒV«E’$ôz=ªªât:KÝn76› «ÕZº`2™ðõõ%<<œ-Zp×]wMDDDWO’dŒ_Œ_‚ô„›âéô0vw1™ö#d;Ž’a;D†ý0…Î,ìJ!Å‚KµãPm8ÝœŠ çÙ¶yŠê¦d ÐüT/?0øhIÒ K´èÑÉ^èd:É€N6¢“½ÐË&Œ?tõ©íÕ˜Ú†&ÔòjH€. Ts¯“P3ˆ„N„Jãr¹X¿~=3fÌ víÚLŸ>ØØØËnc4iÞ¼9Í›7?o?EEEœ9s†üü|ŠŠŠÎKÌìvûyIÛ?þHíÚµ¹õÖ[‘$ ­V‹V«Åh4–.&“ oooüýýñóó+-ùþƒÆL}SõMq¥ëÕÕv)8›ÜYq(J1.ÕŽ[u¡ª * ÿ3‹îw´£c³x@B–´h$:Ù€AöF'›ÐË^eŒ_¼4~d³(qj$‘Ð ‚p]•ToóùçŸóý÷ßsï½÷òðÃãïïU_ÆZ­üýý¯ø^‹ÅÂáÇiÒ¤ O<ñÄ?>–põdIƒYˆYû÷¦›Q´’&ºÞt«uWG&7¾Ë&t×+Aj—ËŘ1cYYY¼ÿþû$$$\—©®Aª+QB'Âuãt:ùꫯøöÛoi×®o¼ñ¡¡¡•–  O$t‚ T8EQÈÎÎfúôélÙ²…‘#GÒ³gO|||*;4A„jA$t‚ Tˆ’9Lm6Ë—/göìÙòå—_ŠR9A„r&:A*„$I¤§§óé§Ÿ²iÓ&î¹ç(Úæ ‚ TÑÿzqaz·ÜöùI\•GÑ o˳›Š+3 ¡šs:lÚ´‰#FpðàA¦L™ÂСCE2'‚PAD åFUUÒÒÒøî»ïøé§ŸxðÁ:t(f³¹²CA¨ÖDBwÃRp:A§…¬BÕàv»Y·n3gÎÄl63mÚ4Z·nV+n3‚ ­Æfëׯ' ào/ëׯ¿òNU ‡¾Ëñ„……K÷Çæì8÷¥p³ŸìN“°0šõâÅ_NàÀΡϟåÎN1žmÃãè=ú öûðl•m·gñÚ= D‡…sËŒ$œ¶ã,?…F³›Ÿà£-y¸KŽ—·™éw"*,Œ°æ}· {ù~”B §( ………|üñǼüòËtíÚ•‰'Ò®];‘Ì ‚ \'56¡ëÒ¥ ‹-"((ˆE‹‘——wÁRöõ.]º\qŸ®ßðìK«ˆ|ñg6ìØÉæå³yþ¶zèK¾wrð¿“Ù›0žŸV/eÖ 7ß}‰¥Y  à”3øÝïY¿e k¾‰Ø¯3ôíœkíæäðì1<³ý'³ìñ@6¼rÏmhÈ¿æ­aóÆß˜vG.ÿyè)~>åw¿<û0ï%waòÒlúæ 4sßbuÑõ™ [¨¾Jf{(™ºë‰'žà·ß~ãÃ?dôèÑÔ­[·’#A¨YjôÏç.]º0wî\† ÆÜ¹sÏKÚÖ¯_Ñõ—ãÎ?Iž6‚.Ý[Ñ ŽêÔ¦~ÌÙ=Åpøôx“ ûã+Aó½D¯ŸeE’•þµÌ4ö4¥³SÖ{€ÿ{ãw–Œ[LÒë ´:;ˆ¾Ï¯1º{]ô€¦xSõâ‰Åã¹/F@ýg'1jQO¾ø#›»:ÿYyàûÿc`œ7Á«7ó¿»~½ÖN¨á$IâÌ™3|ùå—üúë¯ôêÕ‹|P$r‚ •¤F'tpñ¤îj’9C£ûÒô ÆvèÀüž·Ò½GoôïJsI–°Ö‘˜Jžê¨krpÒªn²7|È¿ÇÆoû³Ïõ„5ö¦Àh<ۇƅãuö%û‰-$[³ý–H¦ý%–©y§ï&UjÄ31Þ¥ëM»ÓX¿ðŸ}H‚P†ËåâСCLœ8‘œœÞ~ûmZµj…——ו7A*D­r-«lR7qâÄ«Jæ06cô/»YõÅXn ÍcÍ{йû8þ8£œ}ƒ„¬)û‘KH¨¨¨(9Ëxî‘i¤ß6••áDj‡¼ŠZæý­Li ®ª jâ™¶ë$iiiç-žA¯²†óúMH:D? áj¨ªJzz:Ÿ|ò #GޤyóæÌŸ?ŸŽ;b4‘$éÊ;„¿©¤Z_„¿G|µŸU’ÔMš4éê’¹Z?štÄ3o|Ì/¿D§ì…|³ÏzÅÍœiÛØïhÉõ :ȈFr‘³ÿg.3h¡~‘dáæ”‹¼®‹#L=É®´s½2§vsÌ&n”Â?£( ›7oæ…^à?þà7Þ`ôèÑøûûWvhB5%~ Â?#º2ºtéBZZÚU's¶ÄOyçÃ_Øtð$ÇÙ¹l‡]µ‰ Ñ_q[mH3Âå#üoãiœ¨X’~àÍiûá2÷4M;xþ^V}‚‰¿îähêI’w¯â« ÿLJhC{óxçæ¾ûIVÕ–ÌO?ãøUP)ŠBQQ³gÏfìØ±4oÞœ÷ߟîÝ»‹*VA„*¤Æ·¡û+“ÉtÕÛÊ=Ë&ñÈ„ª`mÇ}Sfód#WšBS§?ïOÜÈ“/v$æ_êuâ¡gú°yÊÅÊÞJèO÷ ù,äU&¾Ô cZvÄ þ2hêp÷Œ9œ=–;bßFPNCž¤ÓúYW}ŽBÍáp8X³f ³gÏFQf̘AëÖ­Eɉp]ˆ*WAøgDBWŽôÑCùÏ¢¡QÍèµÇ]v1žww)}uß4~¿ïüî £Ÿ(ù×E¶Ðק׸/è5îâ‡ÕvbÌW›SvåsìEΓÍܹsY¶l½zõbðàÁ„††VvXB "~8Â?#:AJ9NöìÙäI“p8L˜0æÍ›‹êUA„*N$t‚  ( ©©©ÌŸ?Ÿ¥K—2hÐ ~øa¼½½¯¼± TQå*ÿŒHè¡SUEQXµj³gÏÆ`00yòdÚ´iƒN§«ìð„LT¹ Â?#:A¨¡E¡  €O?ý” pï½÷2hÐ 1Ûƒ  H$t‚PY,–-[ÆW_}…sæÌ¡I“&•– ”U®‚ðψ„Nj˜ÔÔT>ùä¶lÙBÿþý4hAAA•– œGT¹ Â?sÙ„î»Ý£®WBµW¿²¨±JJ:ìv;k×®eÚ´iÔªU‹iӦѰaC C%GXñRRR˜4i²ìK}ýúõìÛ·#GŽàt: dìØ±bæ‹J¶sçN¾üòKTUE’$öìÙƒÝngÍš5ØívêׯÏèÑ£1›Í•ª T9—Mè}k_¯8„jîtePƒ¹Ýn>ÌgŸ}Æž={xôÑG0`@ŠÄ`0°hÑ"RSSÏ[¿fÍ~øaQ"ThµZÖ®]Ë®]»J×9â«S’$î¹ç‘Ì Â%ˆ©¿áw©¶Fªªâp8˜?>/¼ðn·›éÓ§3hР•Ìøùùqÿý÷_4i3 tíÚU ÑR4jÔˆfÍš]2¹>|øuŽHnWHèT±ˆ¥œ¡"¸ÝnV­ZÅáÇKשªŠÛíæÄ‰<ÿüóÌ;—‡zˆñãÇíX“xyyѵk׋V©FGGF£©„È„²ŒF#½{÷¾h3€ÐÐP:tèP Q Âá²U®âkXª.UUÙ¶mÏ=÷¾¾¾üòË/‘““Ã?üÀÏ?ÿL||<ßÿ=ÁÁÁ•n¥’$‰V­ZѾ}{–-[Vº^–eâããiÖ¬Y%F'”Õ·o_üýý9}ú\C I’¸ï¾ûDu« \FÍû©^SYR™qûÌÚí¬ìH„rP2 ðŒ3Ø·o7ndæÌ™lݺ•ÿûßüöÛoŒ1‚ñãÇ×ød®Dhh(­Zµ:oÀd³ÙL=0•™P–ŸŸ·ÜrËyÕ®>>>téÒ­V Ì —rùÿb ê£äZªêU_W[ò!¾Ÿ¶“ {Šp %(®9O½—@TÍjŽUéTUEUU/^ÌÏ?ÿŒ¢(̘1ƒü‘~ýú1~üxêÔ©#ªËÐjµÜrË-|öÙgdeežä¡W¯^•™ðWäÛo¿ÅívGll¬è¸"—!~î‹+m?ÓGn¢à¦†«M°ÎAVŠ/q­»wïæå—_Æf³•®ËÉÉ!00þýûV‰ÑUM’$Ñ¥K4h@VV’$Ñ»woBCC+;4á/âââhÛ¶-[¶lA§Óѹsg¢¢¢*;,A¨ÒDºªÈy†ÅüÄ–îiuèOVïÈÇj ¦Û˜[r«Z@-ÊbÅ”u,Z™C‘ª%¸m3K umO-ºZpŠ%ïüÁ¢M…8}kqÓãqÎ^W{Û>]Ç Óɲ)2’;Æváö–^ÖëvgmãXl7Þýw#ξ!²åÙ—¯Çg"”ÊÉÉáã?&99ù‚×’’’x÷Ýw™7o>>>•]ÕæååEŸ>}ؾ};’$1`À€ÊI¸ˆÚµkÓ­[7¶nÝJ­ZµèÒ¥‹˜[X®@ôr­²‹BÚ‡ÑéËô•Ãxw”‰m“×±#W¥˜­o/᛽ ˜1‰Ÿõ ½u?3Çîä„]¥˜-o-gÁ‰0†ÎºŸÉSš£Y°…½–³×T±‘8m1ŸïôçÎ÷2ùÛ»y¬»Å/¬bS–ra,ö¶nwQ7¶˜_FÍgäÍŸ3zèrl.Â]C{¹ªª‚[uáR8ÛÙÅŠC±àP,8kéz—âÀ­ºPUåš«( ?üðóçÏÇn·_ô=kÖ¬áÃ?,­®ª©JÚº\.6› ›ÍFß¾}Ñét4iÒ„Æc³Ù°Ûí8\.Š¢ˆi§®£’ëät:±ÛíØl6dY¦mÛ¶„„„F»ví.¸Nâ ÂùD•kæ{K;zµ2¢jw%væ*ö¤¸hë8βÍ2ßïÄM-õHøs׫mØ3x+ÅñpÈq–oÓÒuz{:Åèî{š£<%:JN ¿®ÔÐó“ötŽô´± ~¨ }V-`õV+î0Q¶&Uµ“Q¨püËD‚žîƸ紤/ÞÈç/þiÎÝÜÕðÆn§U2*}Ù+ª‚])ÄêÎÇæ.Ä®},Ä¥:q(¬î3ØÏ&o* nÕ‰[q ‘ h$-2zÙˆ^6cÔø¡—Mh%=Ù/ÏÙG_Œ_ ²²tùßXGå­·ÞÂb±œ·^¯×Ó´iS"##éܹ3ýúõ«íÜn7äççS\\Laa!………X­Vl6EEER\\ŒÅbAUU 0›ÍȲ̇~ˆ——£Ñˆ>>>˜Íf¼¼¼0™Løøøàíí··7þþþx{{׈Ïöj]ìÿ“Ûí&??Ÿ‚‚ )**¢¨¨‹Å‚Íf£¸¸˜üü|ŠŠŠp8(ŠBff&’$a±XøàƒÐh4h4Ìf3&“ ???L&ƒ¡ô™Íf|}}K_“eù¼x¡:»lBçVjö/üJ£((ªŒo„Yqã¹ Ì7Ù7öÓ™dãÇm‘”’kP‹†þvRR¬X•Lrd?zGÈ¥×PJ¨.UucK?Åi[G†ÎaÑ_rÚ‚C1œ÷‡¡*n@ס#ÞSo êèBʆ…¬]’ÍíO£¯ð¥âH’„Í]H†ý9örÇÈuœ Ð•ŇÍ]ˆÅG±+«;—jGåêJÛ$d´²&Ù“6“ƣƓ&om0Aúê#24 Ž¡ zÙTúeTXXÈ„ 8uêTéºÈÈHºvíJÛ¶méС7Æ××·Z~©ªÊ™3g8zô(ÉÉɤ¤¤––ÆéÓ§),,D£Ñ ×ëÑëõhµZ´Z-F£ooïÒdM’$>|8.—‹ºuë¢( n·»ÝNNNEEEØív\.N§§Ó‰Ãá@UU¨S§õë×'<<œèèh"##1™LÕò3¿Z¹¹¹>|˜cÇŽ‘ššÊ‰'ÈÈÈ ¸¸­V‹N§+½N:///|}}1¥Évpp0V«•V­Z”–¶“••Eaa!v»·ÛÃá(½VÔ­[—ˆˆêׯOTTÑÑÑ5bš;¡æ%tU˜$_ø¡þêKI$ mÙÂYBSò\UQåZ<òÃt ºò—d0âg€‚(ïs ôf"jÁê4;7JÚ¯ª*nÕC±`S I·%r¸ðNXv’í8ŠC±àRØ•b\ªŠ¨*VQp*ò ù®SyUB'y¡—Mh$=^o‚ ‘„›ÚÐÈ«ßÎø|Oƒ¨pºw»™¾}ûÒ¾}{|}}1›ÍÕ¦G«ªªØív¬V+………l߾ݻwsàÀNœ8^¯'<<œ дiÓÒN ƒ¡4QÐh4hµZ4 ²,—>‚'·Z­¨ªZ:\IIÏa·Û}ÞR’$8N, )))$%%‘’’ÂÚµkIKKC’$"##‰‹‹£M›6ÄÄÄ”&‘:®Ú&zŠ¢àp8°X,äææ²wï^¶mÛÆ¾}ûÈÌÌD¯×Axx8­Zµ¢qãÆÔ®]///t::®ô•,²,Ÿwrss @’¤Òk¤(JirW’Œ—½N………¤¤¤pôèQ:Äo¿ýFFFZ­–¨¨(š5kFçÎiذ!&“ “É$Úç ÕÂ:ÑF¡r¨eÕ Öéj¤ž$ñ˜ƒöž‘;'ƒ#gôD†ëÐ× " Žf¸ˆóö|É»²²É´ƒ7*º:!„pœm{¬t¼ÙÈ¿nŒ~4”8R„] @+ÎbNfƒwS=š*üwâIâœd9’ɲ%sÒº›¤¢µ¤Xv`qç!#£T™”TÅ©Zqº­¸ ӞĂ•üœ=‹–›Ç„1øþ‡ˆ©ÝZ††Ô2ÔF#Ýø_FªªbµZ9qâGŽaË–-=z”ÌÌLˆ‰‰aàÀ´jÕŠˆˆˆkžºìRÔ^鋽Y³fôîÝ»4f‹ÅÂáÇٷo»wïfúôé8ÂÂÂhܸ1­Zµ¢I“&„††¢×ßÈåØçsìØ1<ÈîÝ»9rä¹¹¹øûûÓ¢E }ôQš6mJTTÔ5'JW;†b‹-Î{^XXÈþýûILL$11‘ & ( uêÔ¡eË–ÄÅÅEýúõ‘e¹Ú&áBõvù^®U÷{ºz;û¹— §–Y ‡Ó³ÃfOÞL£Wâhb<Æ©;I«ßœGi‘tÜÚj'ßÎ:BûñM¨#å³iÖ~2(¤ î¼}Ó'¯ágµ-c¨yg8´. µg[ºGü¥¤G2ÿ`?¿º‰ù õܯ!}ñ&VfúÓ»w:µj¦þE®l®!©èNZvsÊv€bw.Ri•iÕIæ.MÅ1š t¡ÑœdEÑ;l¶QÇ«)æ6D›»Ðħ;fmPe‡ú©ªJFFkÖ¬aÕªUddd`6›iÙ²%¤aÆDGGc2™*;Ô H’„Ùl&>>žøøx|iˆu~ IDATðAòóóINNæÐ¡Cìß¿Ÿ9sæ`³ÙˆŠŠ¢GtïÞý†í}œ––Æï¿ÿÎÆ9}ú4ÄÄÄ0dÈ5jDxx8F£±J&C>>>´oßžöíÛ]Zu¿k×.6n܈Ãá yóætïÞŽ;b6›«ä¹Â¥ˆº*éò%tÈF^¾Âi›øé™Ÿ)FCPëF¾Ö’ú0Òɞ°wûoGëëMLßXšìÜv{=±cúðTàL]²"À`"¢]#îô.{¬s|:vâ¹Ñ›ùò³ÿñzBC¹íÎô‰’/úþÊ ª*6¥,ûvù™m¹ßRìö´{+ÛæíïT[W5’ ”žG‘;›#Åë8Z¼‘Mš/ðÖ“ð­üï"ÄЃ\u¿ŒÜn7ÅÅÅ$%%ñÕW_±}ûvBBB0` ãççwÃÍ Iþþþ´iÓ†Ö­[ãp8((( --µk×òßÿþ—éÓ§Ó£G @DDD•M€ÀS¥šŸŸObb"?ÿü3[¶l¡AƒôéÓ‡Ž;ˆ··7¦ÊžÃ¥L»ví¸ûî»)((àÔ©S,Y²„÷Þ{—ËEÿþýéÓ§aaaUú: B ©k§êÚ ›8“ýÿìÝy\TåÀñß™YØAQÁ505µÌ½²[ZæR™Væ’¶šešå–ZŠ™Kj¹ä5µDM½f.¸ïû†Š€"‚ì30Ìrî#¤ij:Êûý|ÎG™™sÎs˜óð.Ïû׺yqÿ€G›Ü2 KxÔdnp¡Ó ½où\ñÏ[` 6o‹ÆÁ鮎)#[[Ûd™|óU.è÷²ãê<ŽæüŽÁ’ÏV 4 g"Ýž¥‘Gwü¢pTz–«QqkÜúõë9þ<Í›7§cÇŽDDD<òã˜ŠŠŠØ´i«V­âèÑ£DFFòä“OÒ´iSÜÜÜÊ:¼‹…K—.±}ûv~ýõWÒÓÓ‰‰‰áù矯«5äççÏÒ¥KILL$22’.]º‰“ÓÝ}6 ‚-ů]FÃæmY:oZÉc×ßOÓRéûö;u¹>|-BÅaí:•9–·–]™ 9™»\SZY‡Ufd,XrØž9Ÿcyë¨í܆ÏW vntç‘’¥ª  €Í›7³`Á iÞ¼9ï¾û.uêÔ)ÿ¨S©T<õÔS´lÙ’C‡±f;ýö[~ýõWúöíKDDD™·J V®\ÉÒ¥K±X,<ýôÓ´lÙ’ÀÀÀGfÒÍ899ñôÓOÓ¢E öîÝËÆ3f ¡¡¡ôìÙ“zõêU˜ŸYááòpõiÂ5fÙÄUÃy6¤Oaoæôæ¬ ×"÷ÏdrŒ©ìÎ\ÄñÜõ4r‘'¼Þ¡’:…ô`oÊF£‘ .0jÔ(’““éÑ£]ºtÁÍÍ­Ì“—²¢R©hذ!õêÕ#==E‹1pà@š7oÎ[o½…¯¯ïMdYÆh4räȦL™Â•+WxõÕWiÕª&‘û;­VËã?NãÆ¹pá?ýôo¾ù&;wæõ×_ÇÓÓS$vB¹"VŠÛÚlC–eL–"ve.àûóϳ%}:óUD2w33y¦4þLŸÆÌó/p {9¦k…KýܲLNN .¤_¿~ÔªU‹… òꫯR©R¥ ›Ì“$ µZŸŸÆ ãûï¿'33“þýûóÇÜT8º4egg3kÖ,† Fpp0?ÿü3/¾ø"^^^6™»žZ­&88˜Q£F1sæL>Ì€ذaC…_E(_Ä,Wá¡b°ä³íê¬NÎ|µ¬Ãy(ÈXH.8ÀS“kLã1ÏÞh”¥;H¯×3qâD:D¿~ýèÒ¥‹(êú áááŒ;–eË–1aÂΟ?OïÞ½K½ÔÉåË—™4i§OŸæÃ?¤yóæ%µù„I’Dݺu™2e ?þø#ãÆ#''‡çž{N$¾B¹ f¹ ù„+W®Ð§O1V(s·Mèô…ù*á‘ç~Ï{ʲŒ#¿_æŒï0˦Ûð^È8û?ð ÷ÿ~³tiw 9 Ùƒ'Tª J4Ö˜³Ù˜þ-Z¥+m}Þ·yQ⬬,FMQQ±±±åjöæõ.\¸ÀŽ;èСƒMêÂíÝ»—„„š4iB``à=ÇÎÎŽ-ZàëëË Aƒppp W¯^6¯Ã—••ÅW_}…››#FŒÀÓ³üÕ0”e™íÛ·£Óéxê©§îé™™™¬_¿þ¦Ç»víz_³ªÕj5Íš5còäÉŒ1µZMŸ>}Ä.B™ªØY„‡‚$IÏYÇÖ«³0ËÆ²ç¶d lü¸·„.3vMìD(È…=8U†ÚÏAç@uëþ“\ÄW¦àïE¸k»û?à5f³™U«V‘‘‘ÁÈ‘#Ëm2°cǺwïΙ3gî;¡KMMeðàÁlÛ¶¹sçÞWBW¬V­Z|ðÁL™2…àà`Zµje³Ö“ÉÄܹs1å6™ëïýäÉ“ILL¼ç„îܹstïÞý¦ÇóòòlR&§nݺ 0€‰'Mhhè}SîÕm:—Ê*áwùÎ/¹%™ôÂÖ¥M ÈòàŠ—‹ Ü¡îËàâú«prþ œ«@6¶8‹ŒÎ|•ui¨¬ ÆK]Ó%%%…¥K—òñÇS£Æ=d³!ƒÁ@llì=/Qu;ÑÑѤ¦¦òÓO?…»û½·r“e™;w²mÛ6&MšD•*Uliù7gΚ7o^òµ­Z<íììhÓ¦ éééŒ;–éÓ§‹ZuB™-tB¹f¶Ù›õ_u»mz\Y†K» ÜkÂÕS`,°¶†yúÚ¤ ®ž†ü4°Aãµ@í ’dí"Í: ¹) v±vµþ!²Îƒ>$%8zC¥PÜâ·¯r]ëV̽¸ÂÂöÖlvýÈœÓog_ö/<é=¥t²,3sæL6lH“&MlVΡ¨¨ˆåË—…,Ë;v¬dA­ZµJÎ]¼¢ÁåË—Q(øúúQ2#;;›={ö““C@@À-g'&&&ròäIòòòppp 44”€€€¼‹ÅÂÖ­[Ùµk|ð¿ýö›M®¹˜íÛ·gíÚµlÙ²….]ºÜ÷1óóóùõ×_éС~~~6ˆÒêÔ©S8p€¶mÛ–¼®®®DEE•´Û;~ü8¹¹¹hµZ‚ƒƒ B’$Ìf3III=z°¶~×B•eI’0 œûì3~úé'’““ñðð ÿþ 4777öîÝËøñãÙ´iYYY8::Ò¨Q#†NË–-9{ö,C‡eË–-ȲL‡8wî\ÉÒb²,óý÷ß3þ|NŸ>Á`ÀÇLJ¶mÛ2iÒ¤Ûv/Y²„õë×ãççGçΩY³¦M“.¥RÉÓO?M||*•Š]»vcƒØî^¯^½xë­·x÷ÝwyþùçÑét,Z´­V˳Ï>‹ÉdböìÙ :”—^z‰Ë—/³lÙ_ŸEõêÕ£}ûöL™2…´´4‚ƒƒQ($&&òÇðÓO?pÃ9'MšÄ¤I“J¾NNNÆßߟI“&Ñ»wo›]›,ËlذFÙ¤^\`` *•гgÏR©R¥ÖšT©R%ºtéÂüùó‘e™ pîÜ9f̘AëÖ­©S§ݺuc„ |öÙgÄÄİuëVŽ?^2›ù¥—^bÅŠŒ=šN:Q­Z5ôz=§N"))‰¥K—ÞtÞ^xæÍ›S½zu²²²øí·ß8{ö,ï¿ÿ¾Í®­¸UnëÖ­„„„T˜R0BùóÀf¹†6ðåÓïŸãÛ6ðÓü…4kÖì¦×ÄÇÇóJ¯—øUBøÞÅùeÀÂÅ_NÓplG¾oOÆï=~+µ£ž¦‰[»¿XÍâ³ôœú¡Ú¶Nú“iC•ŒœÓ{=»F¯cEJM^›A°â k¿Üʽ’ÇÁRȱ)«øáT=&FRÉLʺÌzo#. ž&æŽ šŒ¹ÐŒ¬Rã¬.ŽWø7œì*ìÔ’ã¹ëÑ›³lvÜ»¹¹úC“p`œom%sõ‡ú½¬]Ÿjˆxö`Ïtpö±¶Ä]Úý×9j>mmi;»ÎZ0Ød°¶ÔùDXëÍýÖÓZLøðë„ •“µLJäk7–3±G¥!N-Ñ(ï¿EÁÅÅ….]º°páB4hP*ËUý“Ž;’––ÆO?ýÄ Aƒ°··§~ýú|üñÇDEEa6›ùðÃ?~WüóX#ˆ†ÍÛ¢q¸ñšg¼Âü¤×8’³Ê¦1éÒÉZ®˜! sþ*"ËÖñr¦kW©ReMÈ”ªkݧf(Ì£Îú˜ÆÍZ/NãjMøÀÚZ”oà€Åºœ—½ƒ5Yû{ÙÙE:ëñ,Fk2h§±W²á0L ‰ú®]è0 ';ÛÅÍÈÈà­·Þ¢gÏž´k×Î&c¾Ìf3çÏŸ§R¥J7¬>>ȲLQQ™™™ IŽŽŽxzz–Ä`0¸rå F£'''4 W®\Áßß¿$©Ñëõdeea0eFƒ‹‹ ŽŽŽw,b2™HLLÄÛÛ»d Øý2 Ìš5‹3gÎ0fÌ›$–²,süøq>þøc>ûì3"##mÒJ—MFFÕ«W/ér/**")) œœœeNGff&F£¥R‰››®®®%eIòòòÈÌ̬cèt:&“©dlžÅb!77—ÜÜ\ŒF# …­V‹»»û-)NGvv6………H’„ƒƒØÛÛÛ¬uÒ`00iÒ$²²²øâ‹/X’,Tñk—Ѱy[–Îûk"Ïõ÷Ó´”Dú¾=äö-tf‹í9‡DVaÀ˜V¼Òëå’¤®8™0¦!‘Uîþ¼ YK€…ÅŒu/%Žj3z3†ËWÈÀ•'•XŠéîEM7.P`¹ÂU…+í%ç´ó¯JUû³È²™ÂK©\.Ì%¡×\âþvjïËzŠ,êüÊ™¬¾íÞ øà /T²³h »'ÎöÞtª2’$Ý>rL—±UK§ã-BQ»ü•ˆ5iÓºóKÑJJëóÚëžÿ{½8¥ýͯù'’ÔÎÖ­ôHx©kѾʧ6KæÀz~õÕWùî»ïðòò*™íx?”JeI—Ûõ®ï•$ µZ}Û®.µZ}À}à¦ÄËÁÁážW°³³»eœ÷J–eâââX»v-Ÿþ¹ÍêšI’Dhh(/¼ð#FŒ`„ Ô©S羓77·›–zS©T7|O$IÂÉÉéÓâ#׿/ Å-ÏõOKµ&œÁ``Ñ¢ElÞ¼™¹sçŠdN(Se2)¢Nß’¤®_ß7ù~Öw ÓŠ: îm ª¤¸ùÃH¾‹›¾$’„Ýõ|+$”Å_Ë2²Â‹>K;íy÷xra& ÿ•†0Þý:œj®÷é‘åïE‡*Ÿ—úy¦tD÷õ½’p¶ó¦c•ϨæPÿÎ/ÿ ?þ8'Nœ`̘1|õÕW„……ÙôÅbaÆ ÄÆÆòÞ{ïaÓ±n’$ѵkW’““ùä“Oøê«¯³3ÿ…âqs¿ýöË—/gðàÁT®,–ÊÊÖ:qJ¯ÔlU0æ ÆÇ€1OP§AÕ{<Ö­â´>f_¹žrÇΕÁÝÞvKU,ªjt¬ò)Qn]mT°äFŽŽŽôë×–-[2hÐ 6nÜXR^D¸3½^ÏÂ… 3f C† á©§ž*•YÆ~ýúÁ Aƒ8xð F£ÑæçywÏž=›ØØXÞzë-Z·nmÓRá^Ü~–k)7‚ÔŽòeÎæ7Pkìîí\×ö).'_÷€TÉŸ§šîcöø D›Í¶Éû¹X-œWƒììhS??ÏL ÉÈ|¤vÌ<Π† ’gÛà›ñ›X.7$&L‹œ•Í©­‘ŸjHË€¿2æ²iÄ–œð⹑¨R3IL$;Ü\q­ñÄ´¾÷Bjj¥#-¼ÞÆCÀ/)ï‘n8ÃÝ´Ä Ö„ØW[.U¿ Ü¥= [Èûˆ§§'cÆŒ¡S§NôèÑ£T°TX,.\¸ÀüùóÙµkǧuëÖ¥V¨¬åZÞÿ}~øá‡’ÀÏ>û,¢µîŠ[åŽ;ƬY³8yò$_ý5 6,ëÐ(k¹ª5Êû8Ïß[èþö˜BK£Ÿ$oÊ–½³J<£jóæˆzTSË€–ÆÃ[‘ñÕ6¾ì²;'jw #dÿñkû«Òž·Y,t:ûöícêÔ©äää0dÈZ´hQ²b‰ ”6›Ìrý§êÛ‚p¯î§Ç IDATËõz’¤ÀÉΓèJ}vnIüÕÙË]G²þ2¥³¬ÑÃB)Ùã§­O˜K[Zx½‰›}Õ;ïTJ$IÂÛÛ›aÆñÌ3Ï0kÖ,úõëGƒ hÛ¶- 6,Ykµ"°X,¤§§³gÏV¬XÁùóçiÓ¦ _ýu™vI+•JªU«ÆG}D§N˜>}:o½õÑÑÑ<ýôÓÔ­[''§ ñ>ß÷RRRعs'k×®%))‰.]ºÐ½{wÑ%-”[bé/á¡WIHGŸÏhìþ‡rV²?k))G±T˜äNB„‚jõiâñ2¡ÎmñR×ÄNQ>nJ’DPP_|ñàÏ?ÿdòäÉ899ѲeK:tèpSY‘G‰,ËœåZ™¡*–[u¹Ú‚BEUmÞêZ<æÑ‹$ý~¶\ÁÝ> ÍyÉ:›œ§¼Q+Q+œ©î؈æ•úQM‰³½J©|ŽSS©T4nܘúõëÓ£G6oÞÌêÕ«ùé§ŸhÒ¤ O<ñ‘‘‘¸¹¹¡ÑhP*•]ò Ë2&“ ½^Ovv6›7ofãÆœ>}šúõëóæ›o‰——W¹Jä®çàà@“&M¨W¯—/_&>>žåË—3{öl6lH»v툈ˆÀÑÑ­Vû@ÆûÙZñû¤ÓéÈÈÈ`ûöí¬^½š””êׯÏ|@XXnnnåÏ¡Pñ”é,W¡â±U÷OìjÜTUqSU%ܵW Ïp,o-§ò6‘QtžtÃYŠ,:@âáûƒÅ³Z጗º•TÔviC¨ó“x©k¢Ž›jq!`???^~ùeºwïÎñãÇKœÇÆÆR³fMÂÃéU«øøø”ë1K‹…ììlRSSIJJâèÑ£œ8q‚ääd|||xì±Ç9r$Õ«W/ëPÿ­VK`` tëÖ#GްnÝ:¦M›†Éd"00ÈÈH‚‚‚ðõõ-—c#‹g§‚õ}ÊÉÉ!))‰äädNœ8Á¡C‡¸rå ÞÞÞ´oßžV­ZáççW®®Aî†h¡Y I‰¶6•5!Äx¾Fºá,i†Ó$ë¬?ÀyýôæL$å´kVBBBÆ‚“Úø;Dáï…·ª^ꚨ•e·Î¨­( ÂÃà #//³gÏrìØ1Nœ8Á¶mÛÈÌÌÄÁÁ5jP¯^=BBB ºëÕJCñX¸Ó§OsâÄ Ž?Îùóç1™LxyyDÇŽ ¡fÍštmÛÒbooOTTQQQdeeqúôi8tè6l ;;777‚‚‚ !,,Œš5kâìì\’]Ÿ\ÙÒõǽþÿf³™´´4Μ9Ñ#G8uê.\@–e¼¼¼¨U«ݺu#((ˆ€€€ =DxøÝ6¡Óæ?¨8„GÞƒŸ¹WL’$4Jgª9ÔÇOA=×NYò)4çq©ð)úÃ$êw“¬?„QÖcÁ‚ÉbÀh)Ä‚éĨÀ{…;… JT kòæ…Ÿ¶>U5ah”N¨ŽØ+4¥R¸¬/ýIDDƒüü|233KnÈ«W¯fÆŒF<==©V­5jÔ Zµjøøøàç燓“J¥¥R‰B¡(Ù$IºakbÖ$@–e, ‹³ÙŒÅbÁd2‘••ÅÅ‹INNæÌ™3\¹r…¤¤$òóóÑjµÔ¬Y“ÐÐPºtéBõêÕqqqÁÉÉ •JõÈ&îîî4iÒ„ÆóÌ3ÏŸŸONNGåðáì^½šØØXdYÆÝÝêÕ«S¥JjÔ¨¿¿?UªTÁÑÑñ†÷©¸[³xœÚÞ§â÷Èb±PTTDVV—.]"99™‹/’˜˜Hbb"z½GGGj×®MíÚµéÚµ+5jÔÀÉÉ GGÇGú}*–Û&tO|ñ âq«¶_Ö!Ö›„JÒ¢Rhq²ó¢’ºõ\;!#c²‘Y”ÄÕ¢ó\1œ!ÝpŽ\ãe Ì9,ùY (’õ™õ¯ýß,1Ë&dÙrÃ$ ¥µ}MR ”ìPJö¨$T ìZÔ Gë¿JG´ 7\ì}ðR× ²:OUuRµjÕr;^QlEü„ ÖÎM{…šÊš *k‚å)ÀZï®Ð’ÁœG¡%Bs>&¹£¥ƒEY.²&t˜­-˜P`mmP¢”ì°“T%­kö’µÒÒµÂñׇ{˜iµZêÔ©C:uJ3›Íèt:rssÉÍÍE¯×SPP@aa!ƒƒÁP’´·¼5±“$©$‘P«Õ%É V«ÅÑÑñ†ã?úè#²³³iÚ´é?.2/X9::Ž··7±±±¼ÿþûtïÞÂÂBòòòÈËËC§ÓQPP€Á`   £ÑˆÑh,iy3™L%ïOñ¿ööö¨T*´Z-µZ‹‹ ÎÎÎ8;;ãàà ZÜ„ I$t‚p’¤@«tA«t)ëP„ÛP*•7$^¥eÈ!ôë×5kÖеkׇrv烤×ëùú믩R¥ /¾øbI²\–ãáQ%šAî’¿¿?o¾ù&?üð§OŸ.ëpÊ5“ÉÄŠ+Ø·oÇÇÁÁ¡¬C„GšHèAî’R©¤M›6Ô®]›©S§b4Ë:¤rI–e.^¼ÈÂ… K–¡t‰„®´è¶3°I î Ç Â£ÄÙÙ™aÆ‘ÀÂ… 1›ÍeR¹c4™2e µkצsçÎbB‚ <"¡+— 8ðéㄇ‡ß°5}o7"=„²çççÇG}ÄüùóÙ»w¯X÷ú:&“‰%K–pìØ1Œ««kY‡$‚ø³©³øYã(ybïV‡¿<© <š6mJ‹-˜9s&!!!b ÿ5‡æ‡~àÝwß]­‚ð=t-t;wî¤Fw½íܹóÎ5žgfÇHžùv)ß¼ÙÇê‡S/úF®¹HñKÞ|ð<Íê†Þ€¶}¿æÔ¿ÆÏX²÷2ó­§iNx³ù|u2Eן£0‰µã_çéFÖÖ¶ègßå‡}ÙÜ®³FéâOíÐPB¯mAU¾7LQ†>}ú™™ÉâÅ‹+|׫,Ë\½z•ØØXš5kFëÖ­Ë:$A¨Pºü iÓ¦,Z´âââÈÊʺi‹‹‹ÃÃÃE‹Ñ´iÓ»<²‘„…¿aÿÚl=°—¸÷¼X÷Ùçl¸jóÖ~ø:c÷×bà¼8Öü2žöúE zc' óÖ|ôS›2rÉZÖÍì…rñDâu׺a,9lÓ›»ªÓÆJÖ­ý…1Of2óÍ÷X•öÏ7­y,<œðzóüÐ9ìɬØ7 A(O$I" €÷ߟ… ²sçÎ ßõºxñbòóóéÛ·¯˜Õ*ØC—Ð5©›6m½zõ">>þ†çâããéÕ«Ó¦MûÉœ•G»¡ôi艤!à©DÛgó¹BÌ—ÿ`ÞV;:ŽÎâ_»5oõA‰ÿeáñÌ—ÿàÇmžõÂüð mÏÐO;QéÚZ¸æŒLÿ]C¯±ïóLƒøúÕæ‰7FòšÏ~–l¿z‹UD•x6íÇãb™¿ð'fŒêŠÛ®É¼Ö.g‹nz± e¨I“&tïÞo¿ý–”””²§ÌìÝ»—Ÿþ™·ß~›jÕª•u8‚Pá<” Ü:©»Ÿdì©TËUñ—JGÜ5² ,]>ÊEªÓ,Ä©dM;ïH"=r8}>‚ËG¹¤¨ALcÉÑ´5c¨¥²¾º(e?‰…IÌx6ê¯Iõ;òÍ9Ù—rn±Z¨ ÿö¯Ò£C Q‘4{f0ßN}Ïã‹ùåLῼ.AJ“B¡ [·n¨T*~üñGôúŠ5uI–eRRR7n]»v%::Z¬Ô e࡞q}R×·o_fÍšuÉœÕÍŸA22Å](ÿü%É€ÂûëÓcÉ»â]d ²¢cþX@¯{Ë¡µ¨&-çBæƒY,^„»çááÁàÁƒùàƒ§K—.eÒ£×ë‰ÅÙÙ™×_]”(„2òжÐ+NêÆw_ÉÜí¨ªÔÅ—D¶ŸÖ•¨Tæ/mff&#GŽ$,,Œ—^z {{û²I*´G&¡»/ö¼±êo\ÿ˜¦Ÿü¹·äK…s=zŒ_Fñ·>„Ò½1o~·Ž7¯ð­ëލò¥õ XZº‹xÔAôþv9½ïúA(/*W®LÏž=™9s&ÑÑÑÔ­[·¬C²)Y–1›ÍüöÛo\¸piÓ¦=²I« þøc/^L|||I)‹ÅBvv6&“©ÌâÓëõèõzdYF–e, , --þýû‹%‚PΉ„Ná‘$‰&MšÐ³gO&OžÌ… 0›ÍìÚµ‹Aƒqúôé2‰Ëd2ÇçŸÎ¥K—صk?ÿü3ƒ Âßß_tµ B9'ºŘÀ7Í«óäÉ”Ýßà@þf^ cà]YF!Úþ󜜜˜?>Ë–-ãÍ7ßdÁ‚üïÿ+“xòóóY³f 'NdÈ!¬]»– &ðŸÿü‡fÍš•IL‚ ü;"¡AxÀ\]]éÖ­Ë—/çõ×_çСCX,–,YR&Ý®iii¬_¿‹Å²eËèÞ½;yyyüç?ÿK{ ÂCB$t- Fãÿ” T4²,sðàAfΜÉéÓ§ÉËË+y.!!¡Lº]÷ìÙCZZ`Ï—““ÃÎ;™1cÉÉÉeí¨¬çÔâ¡tˆ À××߀0Z¾>—³E½Ä’wˆÙýZâë‹oèÓ¼ÿkF œúa £k[÷õ Ý ùÍ¿öAz­Ëö‰/f2¢k#jùúÓzꌅ‰Ä|‘è _|}} mõÓwea.>_ÖN¾éM __|ÃÛóÁŠ lû­á.™Íf~ÿýwÞyç~ûí7 †õz=›7o~ 1ɲL\\ÜMët:&L˜À°aÃ8qâ„Hꡜ«° ]³f͈‹‹ÃÓÓ“¸¸8²²²nÚ®þnÆ‘˜’3ðþ¿œmûö³sÝl†=釪d,±‘“ßçH£‘,ûs 3»™Y2ôCÖ¤[ FE0/}ù_âwíbÓ?$lÿgô³—¿F»9=ûÔï¬äxr"kûz°mxWÞÝV“Á 6±sûz¦tÈäÛWÞbyªÌiü:°'Î6cüšíìXüÊy£ù3_|0 BYP(T©R“É„V«½éyNÇÖ­[ÉÍÍ} ñȲÌåË—Ùºuë-6T*nnn$Aî]…MèÀšÔÍ›7Þ½{ßÔOïÞ½™7oÞ] 6ç$“e@³–õ©îS™jµ£ã‹ORíºUrœŸÅW¯µ$<8‚ƒ?ä »Cl8Sh ï=€n-ëèçGPÓî|úy+ôVqæºå;Œ`PË*¨v¨u™ü›†7¦Žä…&AT ã©ãx»ênæoÎÀxéwfnÖÒýëOy>"ÿºÏðÉØ®x#:A( ’$ɪU«0`þþþ(7~ ;vŒS§N=°xþ÷¿ÿÝÐí `ggGDD'NdÖ¬YT­ZUÌr„r®B'tpë¤î^’9uÐ ¼\çC›6¥sߘ´h ‰ºë“';|£q(þ\´w§ŠCYÀLƶoéûd¾ÖîÓ:¯¬#7ë"¹¦¿ö¯áOq5(CÒ.Î$2¥u µ›Ö×ßêÍ{¦¬”,t—’"Ѳ¶SIÁ- V‰fA(K^^^|òÉ'ÄÆÆsÃs œ:½^Oaa!F£±¤€ñß;wŽ#GŽ`±XP©T3wî\f̘AãÆÅ WAxˆØ•uåEqRשS§»3wKv®„´ìFHËn¼ýN;^lô‹~F‹&·ßÍxqÇ‹ê1âõ'¨å!&®?A¶Éÿ÷QWkD «X¹ó*];{Ý”«|#ð•wsàbO¹¨(J=ÈùB{»:AlH¡PàííÍçŸNóæÍ™2e 7ndÆ >|{{û’d-??ŸÂÂBòòòÈËË£°°‚‚dYÆh4b4‘$ •J…R©D©T¢ÑhprrÂÙÙprrÂÅŶmÛFBB®®®<÷Üs 2„°°°›ºA(ÿDBwfÍšqñâEîiÿÂc³øz“­Z7 †»™äÿ­å´©2}¼UwÜ×Î;Å/ü¾ý2í;ú`<³”QSŽƒôÏ Ò§Ãþ3‘—‡¾ÁXyÝx!gœaûï›°tý„^5ÛÑ7f,#¾\Âs3{PK:Dz±sHÜÓ ‚`k™™™?~œŒŒ |||°³³#))‰wß}www4 Z­µZJ¥*IÐ\]]ñññA’$ìííQ©TȲŒÁ`Àl6c2™(,,D§Ó‘ššJaa!ƒ¡¤uO¯×sþüy²³³©R¥ ^^^%]½µjÕB«ÕŠqs‚ð ÝßÜk2 P«H[;Ž>_%‘'ƒºjc^˜4›~AöÜiy¥O&ŽÝN¿÷£ö{.¸ûEóÊ;íÙ9é6µæn´üj%s¼?a쇈Í´>ÔkÙ÷Ü ôáÙ©sI4”a_ r÷#úå~DÇϼçkáß) §×ëÉÍÍ%++‹ýû÷³oß>Μ9Czz:NNNøûûÄܹs1™L¤§§óÊ+¯”´¶)•J EÉ&IRIKÚõ‰Wñù®_“õúÍl6c6›IOOgÙ²e„„„••ŹsçX±b‰‰‰È²LµjÕ ¥aÆ„„„àææ†³³3jµZ$z‚PIG7•·lÛAvÆå’ãþ;€WÞú°ŒÂ5?MK§zßò¹âŸ·ÀA4lÞƒÓ-_'NÇ©S§8uêû÷ï'99™¼¼<¼¼¼'((ˆ:uꈽ½ý û¡Rݹuÿ^'w?o~~>gΜáÔ©S%3n ððð fÍšDDDF@@ÀMû ‚`{ñk—Ѱy[–ΛVòØõ÷Ó´”Dú¾=D´Ð ‚ Ø’,ˤ¤¤ð¿ÿýM›6‘‘‘AåÊ•‰ŒŒ¤mÛ¶øûûS­Zµ[Ö¡»^i&s@IKßß999Idd$²,“““CRRRÉŠ%K–™™Ipp0­Zµ¢M›689‰?¡¬‰„Ná>wk^½z•C‡±|ùrû µZÍŒ3¨T©’h‘»I’ððð k×®Ô¬Y“O>ù„«W¯òÎ;ïˆ2'‚P Ä'’ Âmdff2~üx<==7nÞÞÞ¥–Ìét:fÏžÍéÓ§KåøÿVvv6³gÏæüùó÷| ¥RITTãÇg÷îÝ,X°£ÑhÃ(A€;&t²ØÄf£MN ,@¯×óÞ{ïáææVªçÊÌ̤oß¾lß¾½TÏs·RSSéÛ·/ûöí»¯ãH’Dxx8£G&..ŽøøxE(B±Ûv¹ŠÛ° •,ËìÝ»—µk×òÝwßáãã#JpÜI’ cÀ€Ì›7àà`|}}Ë:,Axdˆ²%…>…©ÏþzÜK¼Q_¬¿(wRXXÈœ9sxöÙg©^½ºÍŽ+Ë2ÇçØ±cèt:4 AAA„††Þðš={öpòäI”J%5"((“ÉDBB'Ož$++ '''j×®MhhhIi… âçç‡{÷îÅßߟǼ¤äJBB………x{{Ó°aC¼¼¼$‰‚‚¶mÛÆÅ‹©\¹2ÞÞÞ6»n°&uÑÑÑüúë¯lÞ¼™_|Q”3¹}B'‹6ºGFñ{)Ë÷ü¾ž=ŧìgÛ¡|аÃ3"œ·&4¢†Æ†q B9qîÜ9RSSyâ‰'lzÜ72bÄ>LAAjµš€€&MšDxx86l`òäÉ% ]‹-ˆ¥fÍš\ºt‰—_~™sçΑ››‹ƒƒ5jÔà»ï¾#::€¡C‡âç燧§'›7oæ•W^¡Y³fL:•Ù³g“””„Á`ÀÃÃ-Z0}útÜÜܘ>}:S¦LáòåËxzzÒ¥K›^;€³³3Mš4aëÖ­tîÜYL“"„»bºxœoÞŒç”O¯Mî̈imøÏShD”ðˆJNNÆÍÍ ›S–e~ýõWŽ?Î_|Áž={رco¼ñÆ ‰Í¾}û=z4'NœàË/¿dïÞ½,_¾°N2ˆ‰‰ò‘ýIDATaæÌ™¬]»–qãÆa4™4iRÉ9Šãâ‰'8yò$'NdݺuL™2…Çœ-[¶púôi>ûì3vîÜÉôéÓÙ¿?³gÏ&,,Œ;w²råJN:e³k/¦P( ãìÙ³Øüø‚PQ‰1tå‘1›U}–±«e õOæÏ}9h+Ñ|H^n㌠秳aÒVâþ¸J¾lG¥†¡tû Q•­9ºœ›Êê1›‰Û‘‡ÑÅ‹}ƒ1j®½¯†\öÌÚÊ/+/‘^tÚŒ¶õ47gù²c3÷p>¬9_~„ûµÖ»öôƒøžÂ$Ë2yyy888`oo»! ’$Q¯^=Y´hÛ¶m#22’:Fjj*½{÷¦C‡ØÙÙñÆo0nÜ8Î;@zz:ééé <˜´´4Ìf3@ÉÌÛâq~ÑÑÑôíÛOOOV¯^MQQ5kÖäàÁƒÈ²Œ$I¸»»³~ýz‚‚‚HLLdöìÙ4hЀaƱyóf›]1wwwòóó1™L6?¶ TTwC'nÕeC,\üå4 Çvä›ñödü¾‘Ñã·R;êiš¸°û‹Õ,>@Ï©OªÍaë¤?™6TÉÈÿ·wïñQ•÷¾Ç?k­¹%“!!W1@‚‚r‰ E·Rk7Ö˱µÚÖ½­½x¬¬õ«í±­–]»·¶ÛË˶îºÝÔ­¥VªrGEˆµ\ —„k „$3“™Yëü± €DD˜Lø¾_/^$kÖ¬õ‹@òõù=ϳžI?o;ËîŸÇ [+øê¯jdîäÏ.àýv‹±8`‡Yûó¹<ùa×þt•yq¶Î[ʯoŸOÖo/¦6ÿcÃn‘&–¯ˆQôù6^ü×gYþa_ß&Þ\Ëec‚hŒôD–eaÛvçˆW¢Ìœ9“ââbæÏŸÏš5køÙÏ~Æ_ÿúW~øáÎðUPPÐ9·, tnõñ£ýˆ%K–píµ×2lØ0|>>ú(;wî<â>¹¹¹ôêÕ«óó¦¦&víÚÅwÞyTMƒ&‰ÐÑÑAiiiçñÃ?N$Û¶µŸH‚iQD7–uáy\<< (˜8„!Îç½M1FuÔóç¥&c:Ž †ù0ÈaÆ=#yïê÷xýÃþWŸzæ½íaüìÑŒ«ò™|ñ¶í¬ü× ØM›xéu‹)¦¶Üý¡‘wÝù\2ÿþ¶<ĸéééœö6vì·©f-½o™ÀßõÐ8w1O~ïUŒ§>ÏŒ E:éYŽ\µ´´‰Dv݃ς7n'N$òÆo0sæLêêê?~|çýŽ´(ÇaùòåŒ=šï}ï{dee±nݺ£îqðC“ã8 4ˆ~ýúñØcQUU…ßïǶmÚÛÛ ‡Ã¬_¿ž¬¬,.\HQQŽã°`Á‚„}í‡×רØHnn.~¿?á×9S3ÐÅíøéªCgÛØŽIV™ÓŽãþ)Xýqv·Ç‰lßÉn²¹¨ÜÂ>øgÔ+ŸŠœ›6…Ù;i2³™VfvþzúSìÝ€ãÄ 7nc{¸…õ×?Å+»uŸíítØþ#þb8vðŽ˵_("À¾ß8ŸM‹^æ­?îfê-yèHÒÓTTTÐÞÞΖ-[¶ÚÓ0 ~ò“Ÿ°}ûvÎ9ç<o¾ù&Á`°s$®«÷þqUUË—/硇¢°°%K–°f͚λÚZÅ0 ®ºê*þô§?q÷Ýw3}útJJJ‡Ã¬[·ŽúúzfÏžMuu5÷Ýw›7o&wÎÛK¤x<ÎÊ•+©®®ÖcÀDH#tݘaýÙ9Ž6¸á†çðކi`üÜqpÌ|¾òütÆõþôU †?l?´œ•qh„/HY>ü­!‚b¿ôDÅÅÅŒ9’9sætÎ)K„ñãÇóè£rï½÷ …èß¿?wÝuµµµÇµH`Ö¬YÜyçüâ¿ ??Ÿn¸ÖÖÖO}šCUU³gÏæ‰'žà™gžaÛ¶m¤¥¥1dÈ®¾újÊËËùÁ~À¬Y³¸ÿþû©ªªâ†nà›ßüf¢¾tÀmý®ZµŠ/ùË¡I ͡떜Ã~wŽ:æ-È£·³…µu0º—;a;Þ´ƒõÍ>Êûyñå÷&—lÜ£&Ãm‡Ævífg2pðö¡õ¼ý^ˆ±“ÒøÔH—–ÍÐrƒ6µqzá1€hCÆ`–þžHäñxøú׿ÎM7Ýļyó˜\Ѐ3eË>öCËHgĵeüáž%<û²é#,ç.áõ9L›Ö ¯£è/=SAA7ß|3¿üå/ÉËËcĈ'=™ßãñ••EVVÖQ¯Y–EaaáQÇoùZ–uTÀ Ÿxþá Ã8f{ײ¬#R]Ös"¢Ñ(¯¼ò óçÏçá‡Öþs" ¦ºnéØ#t˜iœ{÷Eìÿùæ|ó´aÑûœ*nþþ0úú ófMb÷ñàå+ðdePué*ß©;ð~C¾s ÿ’»Œù#nüé”7Ë2¿×!™cÇñÝo-å™'^å-à/.æ¢j¹ä,³ËóEzŠI“&±aÃxàî¿ÿ~† ’ì’RN4套^âñÇçž{îaÀ€É.I¤ÇѺîÈ›Í%Ï\Ç%‡ äsõÿ\Óù©‘‘Ï…÷\Æ…÷t} 3»Kü.=üàõûGÃo¼á7gM¦—~3ÆsÏŒñÇù‘žÁçóñ•¯|…H$­·ÞʬY³7n~¿_-ÃOqp?¿ßÿþ÷<÷ÜsÜvÛmÔÖÖê¿›È)ð)-W¼ˆÈ™í`›òÛßþ6yyy<øàƒL›6k®¹&aíÈž(SWWÇSO=ÅúõëùáÈèÑ£µÿœÈ)¢Y""ÇÁ²,®¾újî½÷^Þ~ûmn¹å,X §t!‰ð›ßü†ï|ç;x<~úÓŸ2vìX…9‘SHsèDDŽ“×ëåüóÏgذaüîw¿ã®»î¢¦¦†›nº‰ ÏØv¢mÛìÙ³‡åË—óÄO …¸ýöÛ?~ù$·ß~;555Lž<™Ñ£GµR´'³m›­[·²téRæÎËž={¸è¢‹¸þúë¶Ý‰ˆ|:ЉˆœÓ48p ÷Ýw|ðóæÍã‘G!p饗2mÚ4Š‹‹{l›1‹QWWÇœ9sX´h999\qÅÔÖÖRRR‚Ç£5w"§Ó1ÿŵ‡[OWÒã9#rfñûýÔÔÔpöÙgóÕ¯~•E‹ñÜsÏñä“O2lØ0.¾øbª««éÝ»7™™™)tÂá0---ìÚµ‹7ß|“×_ÆÆFjkkyਬ¬$333!›/‹ÈgwÌï,3‡ÿòtÕ!=Üoÿ8Ù%ˆœ2†aàóùÈËËãòË/gúôé¬[·Ž ðòË/óôÓO“““Cee%ƒ bàÀœuÖYdddt«9wŽãtÖcÛ6»víbãÆlذ5kÖP__O8¦¼¼œ/}éKŒ7Ž¢¢¢nõ5ˆœ©RóEDº1ÇÃàÁƒ©ªªâª«®bÓ¦MlذU«Vñâ‹/²mÛ6‚Á åååTWWSSSÀÈÎÎNZ‹6³sçNêêêX½z5k×®eóæÍ˜¦III ÕÕÕ\xá…ôïߟ~ýúé9¬"ÝŒˆÈ)bYYYTWW3tèP¦M›F8¦µµ•µkײvíZ/^ÌÓO?M8&''‡þýûSRRBii)ÅÅÅ‘™™‰×ëŲ,<–eašfg{Ó0ŒÎ hÛ6Žãà8¶mÇ;Åb1:::Ø»w/[¶laÛ¶m466²iÓ&…Bäää0xð`Î=÷\¾öµ¯Q^^N  àñx4'ÒM)Љˆœ†aà÷ûñûýdggSRR”)Sp‡p8Lcc#[¶laóæÍ444°fÍ.\HKK ñxÇÓâLÓìüu0`™¦ÙäàP°‹ÇãG;Û¶ñù|äääЫW/ŠŠŠ9r$}ûö¥´´”¢¢"̓IA t""IdiiiTTTPQQÑy<ÓÖÖF[[­­­´··ÓÑÑA8&‰‹ÅˆF£Ø¶mÛ<þøã”——3uêÔΰçñx:C¤Ïç#  ƒdff4â&ÒC(ЉˆtC–e‘••EVVÖ§žë8¯½ö#FŒ`ÆŒ§¡:énzæI""g²‰ˆˆˆˆHŠS IqŽžÓ(rÆS Iqj¹ŠˆˆˆˆHŠS Iqj¹ŠˆˆHŠSËUDèDDDDRœˆHŠSËUDèDDRœZ®"¢@'"""’âèDDRœZ®"¢@'"’âÔr:‘§@'"""’âèDDDDRœˆˆˆHŠS Iq t"""")NNDDD$Å)Љˆˆˆ¤8:‘§@'"""’â<É.@DD>»Õ«Ws×]wu>ökÍš5,\¸—^z Û¶©¨¨àŽ;î ´´4É•ŠÈé @'"’‚JKK©««£¾¾þˆãï¿ÿ>¦irýõ×Ó«W¯ä'"§Z®"")(77—Ï}îs˜æÑ߯³³³™0aÁ`0 •‰H2(Љˆ¤¨ë®»˲Ž:^XXÈ%—\’„ŠD$YèDDRÔ Aƒ1bÄÇ Ã`âĉôéÓ'IU‰H2(Љˆ¤¨ÜÜ\&Ož|Ôñ/~ñ‹I¨FD’IND$E&L˜@ß¾};ÕÔÔPSS“ĪD$èDDR”aTWW3tèÐÎϧNªÅ"g :‘VPPÀ¨Q£ðûýäåå1fÌ|>_²Ë‘ÓLND$…ÄQ;L$ÞF(ÞBm\|Ù$i†ÖœÍÙö÷Žï'b·³#ØŽì²EäÓÆÂ""ÝH܉ÑÛKk|7¡x3¡ø>Úb{Ç÷s"DìV"v+Q;LÔã¹aüùŒÒ–2›·¼˜†‰×à3Óñ[øŒ4¼f:iV6éVéž^¤Y9dX½I³²1 Çq:Ÿd[èvw|D(¾Ï]s"„ã­„ã-Dq'8]^§r&¤•¬gÑžõ]¾n`b>|f:+“€™Çð㳂dzòéã@¿’’´j ƒ X x")DNDäs›°ÝJ[¬‰ý±]ln_ɺÖl ­boÇVllÇ&îtàpbíÑAÓÁ8Æ$›˜&ÓßsÔë&–áνó˜~úøpVp,ÁqªÈôä“îé…×HSÈé†èDDN‘p¼•ÆÐÃkØÜ¾ŠMí+h ¯¥ÃnÇÀ8áðÖë$×AØÄ±ÑxˆMí+ØÜ¾Š¿íz” •Kÿ๔¦ÕPšVCßôáôñÀÄ£p'ÒM(Љˆ$ã84uÔ³ªùÔíÝáhŽn¥Ãi ¶LOhv'qÚâM¬m™ÇÚ–y¤[9äúúQ¨¢:k:Ãsf°2“\©ˆ(Љˆœ$Û‰ÑÝÆæö•,Ûó[êZþBÔ‰w:>vf÷qŸÌ­½=¾—öÐ^B«y·ùE^h¸“‘¹3ž}9%iCI·r5j'’ t""'ÈÛÄÚ–WY¹÷y6¶-%æDÚJí®bN„æX#¯ïü9Kšž¢&ûrjrf0(céV/;‘ÓHNDäDí0Ëöü–ÅMO³%´Š»=Ù%%‘C{¼™%{žaMË«”¥bjÁí ̼…:‘ÓANDä89ŽCÔ Qßö6/mû>µ-#îDIíVj"9ìídmË«¬o]Èy¹_bbþ-cV²‹éÑèDDŽS{|/oí~Œ·v=ÆÞhÃÑZ=a»…»Íæöw¸¨ÏÿfxÎ <¦I&rª(Љˆ‡ýÑ]Ìi¸wšç±[“]NJp°©o›ç¾KKl;µy_Åo“]–H¤@'"r Žc³3²žç¶~‹¿ïý@‹U>‹æh/4ÞÅÞŽ­\RtiVV²KéqèDDŽ¡5ÖÄË÷òÁþ¿b;±d—ó‰Âû`Ý¡t ô:ëÄ®á8 ÁŽÕ°¿pÜkõ ÞÀÉÕ×a·3׿‘å-`RŸ[± ïÉ]PDŽ @'"r š~Í»û^ìÖa ´–ü .¸ïÄ]´ –>[Ch/à@°Lø>”œwò5Æœ¯ïœMIZ5ggM9ù ŠH':‘.88lh]Ä›»þ˜Iv9§\,+‡ú7 ò2¨œáŽÊm]þvH÷F·òúΣ PIo_Yâ.,r†S éBÔ±x÷S´D·'üÚ¾ìŽ|eÃö÷ qGÕúTƒu  ÁöÕ°¿œ8 ¡ÏPä€a@, oCë6HσŒ¢£ïÓ¶ËmŸ†šÀôBîÈ fßù›ë¡a©;7òî³a à w‰åðaë|þ±ÿMFç^£íLDDND¤ »"ØzûÀóLiÕàÏvÃÙ¶•`Ç =jñ`ÇaÅc°á/nëÓ±! Å£àü»Á€º9°ú·ÕêË„² ‡®ï8°g;â¶ýèh¬v ú'0?–£öo…ÖPs=Ô=ÛWA œ5Ù½oW!ðDÅìkZ^eDάŒÄ]Xä ¦@'"Ò…¦ŽM쌬;e×oÛ §¹óÓvÿ–͆5ÿåºú7àsÝ6ìZð¤Ãß_tƒVÝóP4þþä…Ñ·6,zèе#-°êIØ·&þ_wd/²V>ï? yƒ!¯òÈz:Ú Ú_sƒiÁžõn-£¾U3êl>ØÿQ»]N$AèDD>ÆÁ¡Ãn#b·²{ÖÀ ËÀtGêÖÿv®v_Ûñxƒ0âFwT `èL7øm]™Eî*Ô î…œÓЪ¯†åîÇû¡qäUÁ¾MвpÜ·–­Ð¶ãè@n‹5» ÆÏrÏÝýwXþ ø`TLIì\º¶Ølº÷B‘T¢@'"Ò Ó°ˆ;§æiÞ xÓÝ-/X·õ îjSÓÁüCçû³ÀŸ í; ;ê¶i:üc;憺­KÜ_ïb+=OX~üw~@þÙÐÿXþh×ï9&è9¯" £@'"ò1AOo2<ùì‹6žª›`|BžÉ,u·iXÅç¹íÏ]¸£m9gwYîë/qßÓ°ìÐû=w¤­ †_ïÎ×3LwñEx¤÷îâžEn€Üµ2 ÜEá=°÷#HË=zÎÝÉ* Tá1ü‰½¨ÈLND¤ þA†œº@w ý'º›/ý9”ŽuGζ­„Öípî-Ýò‡À;ÿ {7l[uèý^0ø xïï…œþÚ^hú ÿ ô;ÿÈ{æ”CÉXñ°ã}· ¼w#4.‡³¿èŽà%ŽAMÎeøô0‘„Q éB–·ç³±mÉivkNŒ½Í]ÀðWÜjïJwDÑ·{Înà«û7°}%,xÀ}¿Ç§»#s̵ÏA¼2 Ý¿ì~GßÓ„á_vÛ¿ÿênu,„!3Ý6¬åKÜ×—ëíKeÆD©=üYy £s¯¡"ã|ŒD]TD0“]€ˆHwôäryñýäzû‘È üÞ´£G¼,¿{ü ÃpÏñ¦¹‹'<þÌ8ôºÇീ½éG†5Ã’Ï?Hyp †¶+I8ЉˆƒaxÍäÿ ÿ\ú0%iÃ0ô­ó8˜ Ëþ'®í÷8•™ŸÓ³[ENЉˆÓ0©É¹œ_ ÞþÿXÓò'âNG²ËêÖÒ­Îï}#äßLž¿<Ùåˆôh t""ÇÉ2<”§æÆògy{Ï1çlvv¬§ÃnOviÝJÐÊ¥,}Ó‹î¡úh,Ûì’Dz<:‘ÏÀ0 |Fãz™ªÌI¬hþoÞm~‘ú¶åØÄ“]^øÍ ƒ3'S“s9çä|€•™ì¢DÎ t""'À0Lzûûsaþ·–u)k[汸é)Ãu€ƒÃ©ylwc`b^*3'2>ïk”§&Ë[¨¹r"§™ˆÈIð˜> ƒ)T2>ïkll[Ââ¦'ÙܾŠ}Ñí„ìæd—˜pž<²<}¨ÎžÎy¹×ÐÇ_ÇðcZ0"’ t""'É0 ,üVÁY“”9‘Ý‘lh[L}Û2¶„V³5ôv;îø]*10qpÈôäÑ7meé#)Ž¡ð<²<zâƒH7 @'"’`–á¡ 0ˆ>þœ“s%ÍÑš:êÙÔ¶‚mKXß¶P|&V·œwçîçFÏo)2Æ3(cEig“ëíK¶·©ç°Št' t""§ˆa¬ ­J üƒ¨Ê¼Û‰uÂl ­ekh5µ-£1¼–p|?1'B8¾ŸˆÝJ̉~¥¿ŸìÈžqÄ5 âsàµùoÿ|åìon"Ô¶?)…‰ˆˆˆÈ§kÚÑ@Ksßúî÷xmþ[h¹tѤ ÀÿÏ,<^~ uŠˆˆˆÈ'øæmwt†9øX ;hü¸1ÎiªIDDDD>ƒ‹—•ßþ?ÞòHKÀiIEND®B`‚ocamlviz/doc/gc.png0000644000175000017500000013002611251431652014126 0ustar tonkartonkar‰PNG  IHDR8úxš~sBIT|dˆtEXtSoftwaregnome-screenshotï¿> IDATxœìu|G€Ÿ½»ä¢@"8iq‡âP\ u¡-ýŠkq-‚” ®-î…R T Jiq+^Ü„8Äïn¿?B.¹œ&¹\2O~óËîÈ;ó¾3{;;3;+a‚ªMÊʦü@ äμ%eôS¥?©Ù*PÖ$Ê´šîŽ“›…BñüJ' ÇÑét$Çéà³²²J-qfÏM}ç@PµIY¹Ùçn¸x*IJД˜LR‚&wJ, GPª(U œÕND…ÄrzB?j AJ‡ ÍÌB$%¤tDg@ ŽÈ…Ÿ£sDn•× çË|\=œ‰¸ÏÅ5)€&Q‡¬ƒ„§¢C ÇäâÎhÞzû ÊV °«Ü[ÿ=â‡?QùµÂù.ŸØ¨$”Î 4‰:Te+—ÛÍò"ñI2‰O´¤›Q L|=â>`¯ÇqþV²kÁ@ °:‰Òбçú&»ŠmQá#ÐIÈÉR¾ÌGÖ@Íþ g—U²žF$¡K6LX&1€µ#IŽÏÍ¢èjÚµ\ÀNlî~€Îk_Ì‘ø# kA—Úx£EõÙB—ôLvrþÌG!Ih4)/ªã5è´Éñ2G º>jG\l,á’P¼8:MJx \’žOßä¦ê«]wPVSŒžOßdb‘¥v-¼@Ûõ(N§:C©Yòe ¹x“Á™{ûùîÄ|Âcævñ 8œ@ý‘®9_ ÈËÈ:Ð&Khì|Õ&KÈ:ô÷@Kù\ÛóÄ&™åZyf+Ÿˆ›‰DÜL2)+µ ÞÎxª­æ)ljñš”We F£É’ÄÕ7+)S)2’’1>Üq §¥®!š'O(žàDó¢µùÛõßkFBâ#º&¶a­÷n›Œ"äu|=K0íÍíèt:ÆLÀ¡=ÿR­|Ï[JÍýí[ÄÈr»˜ÜÞ%Qªå­F:}]ŽÆÛ_ ptZ“íÿd-'§ÈN½OZÊGN†ãë[”W¯›¯Ù´¶æ~%IŸO½n¾¼Ð¬7öÅøp±š¤ë§ôsé8už5®áæâBË'UèûûÕW)ñPEüãû4÷¦­I" (©ò¢Œ{qn)òÖ”@Þi(…]}=a({~>L‘’ÎÜŠ9Ë¢ÕÁ|>j6‹ aÍ©q¸x§\?­ª¼GÇš])áý"Oâ#ùîØ"vÿ·E/ïµZÝéÞl<²¬#:>œoìaÝÄ'=àû!WXº'ˆwêöÇÛÝŸQ7øæàl*‰•ß¡°«7wï²üŸI\yxÊ ¼E aï–899ÑoõËDƦü8x»û±´ç>4Údú®nÊÚ¾ÿÂ'ÐðíòlýäšIýß[XÞ¾r­„.IBgïáv ´éæú-ä£K²ž·Å´YÈçøºÇ¼ÔÙ€›ı)ÒúúNÎÄK¿–<ùì(]RÉQQ4I,MRD„IE%@EÏöìu9Çné„Éx£P«ôËìÙó7EpvSâU ®éдQs&'Sþug^oØ•Þ-'pèìºôúˆ¸H Ãàñ|*¥ìæ¤tåã ¶ü»ó:o¾ö6Á_Î!>TÁªcŸ¡pN»@ =®D×ñí tnÀ×sVóÙ+Øyx3ïjIÅ"õY:o ýÓwQÜýÓ6‹ŠŽâ·~âÍvïóbdG&¬ÁÉMÁËÞD!)Ù¾ã[ö/z}Sâ‡\Š£v7Þ™[žS+â¨÷RÖ.߀R©âÄ×)á# ë@›”ÓI©ÃíÖóÑ>»Y×z×ߤ¬ÓÛB,¦µ5ŸRµ Së]No àÄæPƒðZïúS¶Aa4ñÖõ´cUʉ„ÎÄHAznEDPD«Å-1I²W–I|øf^åùÃã¤ùxàéê @ttÞÞÎx–‘pò€)åÝao’žh‰¹ ¯èÀ¸ÑA„E‡S(À™E›¦¦ÃÅ\ý$¶XʽsI*­bßù]ÀšÖn͸)ɼÐ.mîoΙÄëžûBÚ?Ÿ&Á)–Dß¿Ò%Êrã÷DÊ¿nxÓþî—õ¼Ùî}Þ~ã=6õYI™¶ šWz €5V£ö0ØÈ”û! ¡DñšîÔ(W¹A+qR9ÑoH/$EZ¸@בspú eažd599íé— ÷¸s"Zf.­­ù”ªQ˜šoøsæ§ÿšoøSú¥ÂhMtLåië T’arŒe#nr;N­k%(ïáA©B…P*ȲŒV–‘…Bèd™Ã7np¿Ô’uâ‡DàØÄÄFâåY”Â…‹ )ãQ¨$’cÀÝÝ €ˆÈ´Z™ÄH(êY €{÷ïQ¤Œ3Îî Üý$FAÍJõèÖv8C+ãªvÓw®‹ñ"6LKÔÕ´yýˆˆp|˹¢tÖêýÂÂã[Þg÷”x’$¡I”‰¾bXæë·/sòÂêTiH`±J(\)í[#Çråê%|ç“c$šµmÀä®ËpV©:j {þÙM‘j°úû ä´ Éq‰‘öm¯ÉqRŠìg×¥|’Ÿ ×› ·–Ù|2ÊÌèg-Mú| m„ãÙ#ƒ ’å…FO<ãØ_û*Ò£J”PŽ;11DÅÇãV¤åÔj” ŽWWþó5=G)8'¯ uí·hÖ´/ü‚B•rԩЀ}þA¡”Ði ,ú!þ^%)Y¢$ñNñ(.¡p–q{vûá|¼=}ðiþúóo(¹xê:’$!ke’Ÿæ­PI¸^Ø ¥„k†QIm’ñµ»óøzêTiÈ›ßÅÍË €ÕëVáì®@¥6þ¦I­r ™ôñ2œTjÆMÍÏ¿þD‘âjÔJi%ŸT,vD²™Ï½s†‚*mRv=LõÓw ª›ëäd¸ï?;V™ ´@‡ÄòüétœèB Ô*ÅW5wxDXr!ÎDD (éDåXýTmY®ûÓ6¡A%4æ>ý¦¼Ã‡ÍmDEmQ$¥m2‚¼L¬Ûf­Cдdcuè´ rgw>e\PºH¸“pðöv¶ÚB\¸M¢'‰"eœxúÎ(ñÑ÷¯y' m¢¥«ÄÆo6v%QŸ×S*pns¬þ\RØæg*ÎϧWóÕâeDßMÙàÄÃÏ¥ ¨‹XOŸžêݳoDà9 Yy‚¯ÚÖ†o˜I›ñfÛùòWëó)Y#m4 dÂzÿBþj›ò ‚”•‚Öu(ìâ¢ÿÐã)µ>QÜå&¡”u- xìC•ø0Þ°I p8”jð®ªÄÅ+eÁ`ê0¿¤çž%AñlHߥ(ø×t"ö¡ºYI N®2($¼«(Q{º¦ì *ƒ¤‚bÕÜÑ=Ûb¯éŽ61ílóËx.¾Uœp+¬Ò—ÙÕ7íâ·˜>¡§dü^ €…'ëR5³>&IÞ'ó@>…\LnLdKŒòÃ郌=K\R>Æ5 ©+|“NÑh¢IB–4¼P¤’ö8Ÿçåè²6Ëò:*5 ´íÆèê“âLuÑÕ…@]ÕTXÚyÑÆá¶ø™Šãæn~¦ËmKzÀ¡PÒ„íÝŒŸÝ@õ÷´ü–G 21}pÛ-šæIºïÌÖRÿq%â5<Ë¡‰‰áFd$R ”ýSt@ <'$ îÞxHdžØUî݆õóS>qMA&F ®Dz÷É-t Q"É ÏH=>†&É• ©èâùÛå‚èà¹Q®™;ý1GdWzÅ+ßæé:"ÅÊøÉ¯Ï+Aèõ§&’ @ ÈïhuœXñ$e¤@óT"ÉÎ;@ @ pR^Tœß“«E@û¨Ê•x};–¶Ñ‚,‹-M@ ÈϤÿ¸aȽ[ô8ÜÖÝ @ äwT¦½ÅH@ ù㵄¦;¢O AþÆÄû&;¢O AþÆÔ;‡bú@  ¦ò$/VªÆõKÿåv1ò4GÿËÈÑcyøè‘°•@ Ø 3Ó¢W`Šr•ªsíÒ¹ç’WjäTžÏS—œ`ÆÌÙLž8žÖ­Zˆö*vÂô+‰²m®\¥ê¼òê›È:ÙÀ_ÖÉ´ïøå*U·YVnº†M[˜h2,&æ ¯¾ñÑÑ1\»xîù”)]äTžÏM—gí$Õծ׈!ÃF‘-™—._¡YÓ¦¹Þv„N8áÖ™ÀÌ>¶KtuuåïöøïÞ³77·LÊÊ=Wï¥:lÛñƒÉ°M›·P«f ò|Žer »eFŸkÏríâYvÿº'''‚&Mɖ̤¤$œœ”y@7á„N8GuÆd{ó¢>½z°lÅ*¿e+VÓ·wO?­Vˬ¹ó©ß¤UkÕcØÈO‰Õ‡—«\ƒMß~GóÖí©\£¯¿ý>/]2ψ)¿¬Ð¿ooV­]N§3ðOJNfã¦oéݳ›Q~{÷ ÃëoS¹Fš·nÏ–­Ûl.ëÝ»÷è;`05^jH•šuéÙçÂÃ#L–-}ºr•k¹T¬Ùך\K¶·'>>ÞL?†ýä¿zÝš¶hKù*5­ê“Zöô6°¥}e&[ì’œ¬aÚŒYÔoÜœ:õ›°jÍ:}˜5Ù–Ú@ ä&;²,ÛäÚ·mMxD$'OF–eŽ=NTT4íÚ´2õõ²•œ?‘·}ËÑÿà¬V<{ž¬£Çþe˦õœ8r€vmZ1~âƒpSùÛZVK®JåJ”.Y’ß~ÿÓÀÿç¿P³F5Ê–)c”ߨ1ã:h§fÓ†µœ>sÖæ²öùdÝ»|̱ƒÿpdÿß–eꌙ&ã¦?¾záŒÞ}ùùDZ¶hf³}-•Çší³ë2Ú#c;8sæ?nû–+çO[Õçê…3z[ØÚ¾2“‡-vY°ø+®^»ÎÛ·ð÷î_yø(Äæú°Ô~„N8ជ³¹S ½zteÙŠÕ,[¹šÞ=»¡PŠÞºm;Æ%Àßww7FÊ»ÿ2ˆ3yâ8üýüpuu¥wÏn\¸˜3O«¦è×§+Ó=é¬Z»ž>½z˜Œï¢VFDd$Å‹0í‹É6çõëÏ;hÔ°>jµOOF ÂCGlNðð6}ûófëýl±¯%ž—í#""˜6cM54ð7vÞÞÞúóÌêcKü¬äaÉ.?üø3Æ!ÀߟBžžŒ;ÚfÙÙi?@S˜Ù§ s¼óÖ,\ò5;ù•K—/³tñ|£8!¡iÿê›~é?ÆP¤paý±‹‹ Æų‰õë¢PH9zœ† ê±ÿÀA¼Š¦fê&ã/^0‡%_/gÑâ¯ñðô è³OiÕ¢¹My:}†àÙó¸pññññ€±-Ìqíú &O™ÆÚUËpwwÓûÛb_Kä´íS‡ì=<ÜiÒ¸_Lž`îçëkpžY}l‰Ÿ•<,ÙåqX¥J–ÌRy²Ó~ §0ýJ¢™asqœœèú¿=6ˆaƒàä䤗‘úß·¨ßmÞ€¿ŸŸÙ¼Lå›ê§R©ˆÇÅÅ€¨¨¨L—ÕýúôbùªÕ4¨_—•kÖÓ§g#ù©çÕ«Ueé’Ȳ̾ù,h‡öþeSYÅØOGÒìå&x¸»GMÌÚ"õ8<<‚C†3cêç/`ÇûfÄVÛÛƒ+çOg*ÿ̶—¬´¯ì¶IߢE¹s÷eËű&ÛRû‚ÜÂn_Iì×§'Îük´À0•μOÐÄ)ܹ{FÕ«W>jŒÍò+U¬ÀÊ5ëHHH $4”‰ŸOµWÑõ´jÑœG!¡üøÓN"""hör³q‡õë7HÖhe­6m‘¢µ²&&&â¢V£vvæÞ½ûL˜<Ŧòõ4”~}zQ§v-£°ìÚ7¯‘Y}²¢vmöö›¯óÅ´< !æÉ¦ϲY¶¥ö#¹…¶9¶7%¼oïî¬X]{öåqècÊ–a@¿>Ò›’•â÷åç7ás¾Zº???úõîÁoü™É²ZF’ _¯Œ šÈŒ©©¯Ì™.OëV-4twîÞ¥lٲ̞ñ¥ÍeöÅ$¦ÍœÍƒañ÷ó¥WnìúõwÌÛâÙB¹³ç8söcÆ¥ ½_9 °Õ¾¦u1>¶ä—Ulk'©d¶½d¥}e·MØ™³çñÆÛï#Ë2>IKkM¶¥ö#¹…ôrã†ò¾ƒ‡‰ {¤÷LNLÈÅ" @ ÈiœÔ.úã{·è3p¸ØæX A v[S À±_I@ˆ¯$ @ x†)@Øå•D@ ù“‚»7¯>ïr@ xŽ”«b¼žÉNÁƒ{·s¼0‚¼A³vo²ïs»@ xŽ4k÷¦I³Dzå.9VAÞà·ípó(ˆú‚‚BêoÜÓ£0‹_I4•@õ-HEÖiÑ>û.ƒÝ‘@’(•J$…ÒþòA–±Ë§“AþAÖéxÍÁƒ{ yøÀîò E}ýhÔ¸E¼}b5 ¯ :À­VÃÑ#(]ª,ï|Ø•ʾ?‰‰ œèô^–ãgVž)òD§`ׯ¿1uz0… Ë27¯^ÌÑüR{^9OV°gÙò²žyGµÏó*wê+‰‰ŒŒ$!1Ñjzµ//¯œ(š@/$‰±ŸŽbì§£ÌÆI[‹o‹P(”(UJ<==ô~žž¨TJ½Ÿx%Q p,²µ¦ ý0wÉ%Ÿá‡öQH-Û¼bàÿÁ›óðΰzÙ™#‡!xÖ\Þxû=”J%U«TfôÈá4mÒØ Mêb8'''Àö-]SõV*• à“þ}:x`¦ÊhN¿Œ„†>ÀÇÇÇàHH¨>΃‡(^¬˜Þ/ýqNcvððÑ#}zSØb‡T2ÚÔö±VçÇÿ=Á¬9ó¸pñqqqú¶e$ËR»³Ç5c/tZ šä$#ýH$áì¬6ðsvV£z?SéAÞ%Û £¢¢™9{›·l凟vÒùƒNúðbܽwc‡÷ã[´h¶ k«ÌݺòчpñÒe9ÊÌÙs>òSŽ1^W¬-´§ÞE‹úðèQáááøúú`°º¿x±bܹ{—RªdI íFø<°G;Hsïþ}Ê”.mn‹ÌaûX«óC†óøñcV-ÿš—›6A§ÓQ©Z­L?çÄ5“UÌ=Ñ;«ÕúðŒ~éýÕj1" 8Ùž>(R¤0“&Œ§¨3gÏáñ³7 ztï@ð¬9ÄÄéòë‚F£aíú 4hҌҥJòI¿¾üöûŸöTË*Ùiݺ|Œ‹‹ ëÖCÓæ­ðòòbØAúp[ì`ŽçaŸysf2ù‹©tþ¸þþ~ è×7KrrâšÉ:¦ßp~6íѧ_ZG%u*¤_ÿ>~‰Úä.£@à˜<‰‰á×Û¹}óFŽå¡T*)Yº _OO›ÒH/7n(ï;x˜¨°GzÏ}üÈ+ït!îiLN•UH­çß¶oõ-Гœ˜À7ëWѳÿPâcÛ„“³Z¿°Ð:–ä$ó;nÞ°†w;}ˆgŸl•W pD¶·‰À^¤qËöúN5Àå ç(W±Š…”æ¹vù«Tןk4ÉüçOn߸F›ö¯âáY0}¹w‹>‡çmŽA^Äô0rbB.”E È_Ü»sƒÿõè‡J©ÔO?BÊT¤N£É’LY§3¥T(iܬ5û÷ün³ Ñ)¦É£¯ÆÆ¿Ñ!8²NF¡TmD§“Ho„M IDATe´ZÃNÁñ}¿Ó°UG´­ÙãÔ´å)J}^¶ :À$yy=àÐo>Ìí"Ù¢¦¢©ÁS½Œ6ÃHAƒ–åsÇ©iMÉT($\Ü<ùe@t òf¯@RH”næd=¢@GQüª@'ߤuèŒF ´q«Ç©iMÉT(lÑPt Idòæô€¤¥ZÊíbYF!IfG t:gÿ=@ƒˆúÄìqjZ“#’í׊èÓȶïòù¼Q($TÎvùt‹@+(¦;²¬3ž>hþ ¤N˜9NMknúÀVD§@ ˜$O($nî[( —: ÓÓ²‰…†ÑaVSÓŠé@3äÑ•†…¼Š²aè¡Ü.†@-Lgf¤Àx¡áÕ §©ß¬‘a¡fSÓŠ‘@3äÑé­VÃÓèÈÜ.†@-œT*4 Ê Oñ²Ng´¦ ^³vȤ|¤ÌÜqjÚŒ­N‡“JEÜ“(ýæE–@`ÙÌ6Ç û”(ýϤRµÚOò2ÆÓܱzœš6ýôN'sùü)J–~ɯņ¢S  ‘Ræ ŸDGSëûe@©Pä˜| ¯Ó¨Yýó;§íG«M»‘k´ZTJëÛˆ›B£ÕrhÏ/ús¥Ro@Iê7mRl^$²‚$)(Vœ›7®S6ð»ß¸eàÖ­›/Q Ɇo(ù7ww6k“ãùH’„B¡BíâbS|Ñ)(•*ê7hÂáƒ{9wú$ZSïRgG¾Bo@1êÖ­ÚÅÕ®²G–9þçÕNV“LRb:­öy”'_#I)ûP;©]PªÄnl‚¼‰¤PPØË‹Ví: IJLY¼dOù€¤Tâ¬vA嬶£d@],v ´Z áCù{ÏÜ¿{­èP>YUA`ÄïJÎ!:Ù$ãGcΞ=G§Þ'22Š÷ÞŸ­[¾£Fê¹XÂÜ%õbÈ«=oKưUkÖšÓEXÁžuf-þª5ëèÛ»'+–.!.>ž‹–0tø(¾Y¿&‹¥Øñ»’sˆyl"?)egΞáƒ?dôȑܺqÑ#GòÁ‡ræì}[×DËWæ›MßÒ¬e[*V­A»Ž¯ó|¿}­Úv B•¼úÆÛ\¾rÅ MÆôM[´Öǽpñ’]Ê–””̺õéÙ½›Ù8{÷í§]ÇשP¥M[´æÛï¶êôZ-Á³çR·A*U«Åa#‰Õ‡'''óå´¼T¿15_ªÏŠU⦓]l©3kñׯYIóf/ãææFQÆý”'Nš•!Ú@ÞCü®d®M‰NA¶‘Ÿu d¦N›NÐøqôìÙzöìAÐøqL6]'/~`&/qàÐ!¶lÚÀ™Çxë×èÞ«/ÿü³oÖ¯áìÉc¼ÚñÆŽŸh6ýÑcÇÙ¶e3gN¥}»¶Œ 2 v½†T¨RƒÖí:ðõÒåf_»ÝþÃ4lP?³²FŒÃð¡ƒ9wú_¾Û´‘Ó§ÏêþZºœóç/°óÇíœ8zµZÍô™³õáó.áêµkìúiûÿþ‹GY,wAÆžu–Ùøû¤víZfÃEÈ›ˆßÛÛT–;%J”лŒÈ²ÌÔ©S©\¹2UªTaúôé7CkáŽDÊ”/SmX»†?x_.ët|øÁûlX»ÆÀO`ži_L¡X±€”NU÷nÄÆÆòÅç“ üþûï¼ÙôS&OÄßßWWWúöîÉù –‡ñN?ÂÅs§X²h>ûbÚŒ™Fñt:+V®¦_Ÿ^Ë®vQó8ô1‘‘/^ŒӾЇmÙú=“&Œ' Àwww>=‚?þØ­ßþÃLšD@€?… y2aügó*¨Ø»Î2ÿÂÅK|1uS¿øÜlÑò&âwÅö6•åNÁýû÷¹ÿ¾É°7räÈþùçþþûo:ÄæÍ›mw4RG”J¥Áˆ€9y¼¼Šè]žíÕÑOcaÓ§"E Û7¥RI¥ŠY0wßoßa¾ë×ß äÅ_°(çëÅ Ùwà ßx‹æ­Úñמ¿õa!!¡´iß‘Àò• ,_™ú^&,<\þøq¥K•´ZVA öª3[ã9zŒ>ý°pþ^,kVŽhyñ»b;9²ÐpëÖ­Œ;ÆŽˬY³øè£l w$rb@ê|Ö´/§ðõÒå„„†X61£GpüÄI¶mÿÈÈHÊ—{‘/?Ÿ¤Îý‰ŽŠâï?åëÅ ¸pñ#?M2|§OŸaá¼Ùœ9q”ŸôgÝú9 uþ`ð°‘\¹rFÃí;w=f_io矽ûpqqå¥:µm’wíÚu’“5Ȳlð½?ú±ã'pûÎ4 —¯\aȰ‘úðwß~‹Ï¿ø’GBˆ‰yÂS§ÛOÑ|„=ê,ãŠuKñW®^ËŒ™³Ù´~ÕAjùD(Ø8úïJŽŒÄÆÆâîî®?÷ðð0Xi-Ü¡e~ÙºÎæèÞëjsÜáÃ†àææF³tOúÆÆÍÍ–-špëöm}Xll,jgg@’¨_¯.õëÕµ9¿œ ã*^È™÷гÂ+íÛ2tÄh®]¿Ž7¯uìÀè‘à â,ùzýûÚ6/Ý®M+úÌí;w ,ËÜ9ióˆýûöAb%ÿëÚƒÐÐÇ–eЀþúð¡ƒ2=x6^Y–ñO£#MÆ1ÕÈmñ[³n=Á³æ’˜˜ˆR©¤j•ÊŒ9œ¦M›Ì'µžÛ¾WÞéBœøƒ@ ä{RûÓÿæ‡Ü»EŸÃsfú B… œ=›öÚĹsç¨X±¢Íᎄ,CB\¬Í.'öèÖ•3'޲ãû-Œ>”³çþcøÈOs,?@ ä/r¤SЩS'‚ƒƒ !$$„àà`Þÿ}›Ã‹´Í‹t:Á&EæüsŠþsñÒeªT®L£† pV;çX~@ È_dyMAúý RS§>þøcnß¾M‹-èÒ¥ ;wÖÇ·îH¤_·‹b”J%ÊTbXçñxö1 7Ù)HŒç¿SGˆx’ãt …½|e™¨ˆ°Ü.ŽÃPÐíVÐõwtDýSl¢P(øãú”ÅãiÝ´*’ÊñßÀ“µ2w/D°àÛ©|Þo®Q¸ÉNÁ…3Ç)Vêš¶{…B™ã…tt:-×.œåÁíë¼ñ¿¾Â.6RÐíVÐõwtDýSl¢ÓiY>x ›¨y˜ ‰ùc'ZeY¸tÒôC¿ÉNADè#jÔkBÜ“èœ,—ÃP¢—NvÉ$Ýn]GGÔŸ1É&’NÂõ¿èòÙ®¾’î´I“¬C’$ñ™ß H’„NÖ »d’‚n·‚®¿£#êϘ‚d¥BÉŒ‘KS¾~—x­C“þf„ÊÎ*Â6Y£ Û­ ëïèˆú3¦ ØD©P‚N—ï>a§43íc~GÃPÙYFØ&kt»týQÆ›(JtÈù®”éNA~3€=¶ÉÝn]GGÔŸ1Á&*…™ü×ÿQeºSïK쇰MÖ(èv+èú;:¢þŒ)6I™>‘åüõ¹{1}`O„m²FA·[A×ßÑõgL°‰R¡LéüôNAAÊ*Â6Y£ Û­ ëïèˆú3¦ ØD))A–‘uùKW¥$:vCØ&kt»týQÆ›¨žÈRîë*ë´Èɉ(ÔnÙ–•é5ùiXHÖiA“ˆäœ}C¦Ì?¶±DA·[A×ßÑõgLA²‰½tU*Tyf¤àñŽÉ$Ü:A©á»²-K©0}ûW˜K 磿'Î&bCo»È²·m*Õxé¹ÛÃÖ¿¼l7¡¿õ¿çѶ¬å‘›íÛÑë/'þ ’M쥫òÙÛÈr®º¤ˆük ±—÷{î÷lË+°k 4¡W‰;¸FCÂå¿QWh‘m™ö¶M^´µ#Ø-'É/ú?<­å‘zç—ú³'É&öÔU¥P‚œ»oZÈÚdnÍy&€»K:Q~öMî^Y–™íéƒ'OŸ²øëåìù{/!¡¡¸¹¹S·Nm>îü> Ô J­ú\8},SËJ[‘uÂWtFÖ¤ìY¹®þãŽ#¹ΦàÛ4kÝ?ùµZmåÉ“'téÙ—õ«–Q¨P!›äårÚnUjÕ7%§ÚBfÈiýÁr»·ë5‘‰¶•å|­åñœÛwAo¿¦Èí6ý<±·®)OÔ:£·BC3á"öìù‡G!!¸¹¹Q»VMzõìN«–-²©…!’BIùY7Œ²ñFD¶G F~:Ž’%K°zùW ð':&†cÇOðõòU4¨_×l:[ȱަ¤Äï3ãFšÝüRÓש]“?îäƒNïÅÙüÝ6jT«†§§gž|’²HÛíü©£z¿ªµœç [ä°þ¶È³—2+''®ßç^§½ýš"´éç†uU*” KȺ´Ï&? áíwߣÓ{ïñÝ·› ð÷çéÓ§œ8yŠU«×ѲyË,__^I¡dÙªÕãõëÕY›Œ¤tÊ”üÌw 2 •=~‚¹³§ãæê €—WÚ·kMûv­‘‘©V;åã Uk7à¿SG¸wï>3fÍãØñh´Zêխô/&âãím6̓‡™5o!·oßÅÏ·(ýúôàÝ·ß´IÑTCnÙny!Æï¼ : ˜Yla1g¶éݳ£ÆŒç½wßD¡H[ž‘œœÌæ-ß³jùbîÞ»gVÿŒòªÕn¨·A*éý´Z- —,cÇ?G«͘<ñ3ÜÝRÒ8ŠÝÌù[j+‰‰‰|þe0ìþ wwº|Ü™y –8\»1wn*ÌšM¬éüíÖm¬Z³žÐÇa”{ñ¾ü<ˆJ+å—•ë7••k׳~Ãfbãbéо-Æ}г³³‘.ù½ýV«ÝOGë݆́>~̹“‡­êœßlbÎF‰‰‰L žËïìà•ömùìÓáúQVk×¶Õrä ®©oîíƒÙsçðÑG2xཟ—wÚ´iI›6-á™’““™6#˜mÛ@£Ñ0tð úõím5Oml×ô¡ä mŒ1Âd¼¹sç‚$±{>êbñ¨ùz¦ô2…Ù…†%Ô®UƒÉŸOãÌ™s$&$…ÿwò0ÿ<œrüÌàБtùßìßó+ûvï"°lfÎ^`1ÍgAŸ3¨Žø‹u«–röì6-œÐÅF½¡¯~HkĈ&]ª~±û–“xáÌ-ÐHg›*•*Pªd þÜ½Ç Î/¿þAõjU([º”Eý3Ê3e÷ô~+V­ãâÅKlݼ–}ý‚ZíÌÜy‹Înæü­ÙjÑ’e<}ú”?ví`ûw9uêŒAz‡Òßœ=2i‹:ÿž8ÉÆ5Ë9¼÷OZ·lÎä/f˜Ì3+×oj'Nœbûwø}çvÂÂÂYòõòÙ~Îýwž­›×rîÄ!›tÎW6±Ð¦-YFhh(»~üŽ?|ÇÃGXüÕrƒpK×vnêšúD-˲ÞíùûÞ{÷?Snμù\¹r•ß~ù™ÃöòðáC«i^áæÄšÄ]ü›ÔÑ Fé.’Ó<›‘e™¤—x°¼‘{WX•Ÿê²=}0ÖtV­ÝÀÄ)Ó¸{ï>>Þ^´nÙœOúö¢P!O³é~غIìììÌÐýiÿÚ;ñ2¦Q«yü8ŒˆÈ(üý˜<á3£8Ñ<¾AôÊ÷Ñ%Äò\Ã!•êk’õyjB®û×B<^ µÞGå§'}YzõèÂÜKhצ•Þoí†M|þ¬Ì™Õß”ž©~Ûø‰¥‹çáçë À°AŸðnç®}6 p,»™ò·f«_~û“u«¾Â«HFÂ?ûèÃMÿjuYkÍ&Öt?f… §¬iéÞå#–­XmÑ&Y¹~ÇŒ†·——þ¸W¿A œöUPÚ/ÀèáCð*RÄfó›MÌ•m×o°fù};;j½ú fÄЀõk;7uM™>‘uió÷‘øxyø•~¡¼þøÎ«lÛ¶ƒÍ߬'ÀÏ€‰Aã Ò˜â陟Ñ%Ħ”÷Y\Fà ‹£ uOíèt( ¾}"…›ö´ª“^/˜íh’“ Î]]œÔ¿ƒú÷B–enݾÆÍ[1fKÎ1›î̹óÌ_¼”Ë—¯Ÿ¤|‹;}¼ŒifOŸÂòÕëùjÙJ<<<=|Íš6¶¨`Â…ßÑ%ÄȳdHMr’GQb›…S­÷,Ê7‘®¼µkTCBâð‘£Ô{©6‡Ž£p!O*W,‡&9)Óúg´Ez¿ÐǼñngƒ°ô²Én¦ü­Ù*<"_ý¹¿¯AzGÓÿÔ‘Lƫݰ…Í6±¦³»›‹>®J)¡ÑjÍÖƒ©2ÚÒ~ý}‹êÏüŠa²Mç÷ö àU¤Á¹5ó›MÌÙ(""‚?_}x1_Â#"l¾¶ÍñnèãÇ”.]Ê ­5¼Ú CéîCè·#ôé´Z-‰‰‰ñTªg·o)eºAáâAà´ 6ç•é -!IeËðéˆÁ4kóšÅ¸ŸŽ›Äˆ!hÒ¨îînÄÅÅÓ´uG‹iªV©Ä‚ÙÓe™ƒ‡1ùË`vÿ²Ýb—ƽP¸z»kŠÞÏ¢!]\$’ÚÂÃÿ²(Û½ºÿµ6Sï¥Ú¬ß´…î]Ò.òÌè¯T*IHLÄåÙ<[TtŒAxÑ¢>¬_ù~¾EM¦w4»eÄš­¼½¼xøè%KàÁÃGé]SX³IVt¶gþ>¤TÉÏŽáãmú5©üÞ~MaMç‚bo//ƒvrïþ¼½Š„[º¶ÍñHók޼߿ƒú›L“×××—ÛwîòB` My¥âÙ¸ Î¥jêå$''¬ÓIõKÍ«ð˽ñí<J¬ ®è17R`~ó¢ ó½?Êïî!,<FË£,^Jõª•õq<=<¸yë¶áüHbÎÎÎ89©¸wÿ_LŸm ßTš±AŸsýæ-’““‘eZÖ¦9§ZoãÑk“~)Õé]š!eÔu;ShÄ>Pªmž‡1e›—›4"$ô1;ýƒÈÈ(7¬o³þé+”‘u¿%>!ÐÇL žcÞéí7˜2mwïÞG£ÑpõÚuÆMqX»eô·f«öm[3wÁWDFFÅìùK ÂIsöȬM,él*Kùfåú˜= ‘DDD2kÞb:´oc2¿üÞ~Mű¦s~²‰¥¶Õ®M+fÎ]DxxááÌœ»öm[ëí]Û¹©«J¡ ׌:„uë70ÁBîÞ¹‹&9™¸ØXöîÝ—zYæ½wÞfÒä)à=úÏÉC{˜8ns.aô¸|‹¥ëÿ>à÷Ô…yfÒ4¹ £ÆNäî½û”)]Š/'Ž3*9Tþ• iI?e@%“ºZ%C| èÑ¥3“¾ fÊ„1áÖôO/oÂØ‘L™6›«×ãç[”]:³{Ï^}x÷?Dú Áã°pÊ”.EïîëÃÍný­Ùj@ß|9cÞzw7w>úà9æ¸ú[Jo£M¬êl*3ùfåú¨U£þד¸¸8Ú¶nAÿ^ÝM–!¿·_Sq¬éœßlR§‘ñ«x'íaP¿^̘³€7:} @ÛVÍØ·§Í×¶5rRW¥‰Í‹Š—(ÆŽmß1ábÞyÿC"""ðôô NíZlX·ZwèL›1“ö¯¾Ž,ÃA2½ R¯î§|ó ቿ¤ö@Rª²¼©’¹‘éåÆ å}–6\óçßòRãæYÊ(/!ëtôÔÀOrv3ư…‡öæ ÛXÂQìvóÖ†ŽúŒŸ¾ÿÆ®rEiDýãh6Éεmo]·ïÜÈ€“INŒÏRz{ k5ܪŠ..m­Dàì[HN®Y–¹bU0½{ŒÖŸ‡Ü»EŸÃó÷‘$YGÌWo '¤ÍÍ}IrÉžà|`Käe»ÍYø}zt!))™y‹¾¢ÅËMì^yYuDýã6±×µmo]• %RêôA.!)”ò÷f4 ø°]H*—l•)ók òßB{—•zÜ»®•:[2óm,ýåa» ðçí»ñÖ]ñôð ŸnJñgߨ?‡´‰Ý®m;ëªz¶£anãP¯¶C(T¯.e_ʶ¼,|û Ûyæ >/ nÜ9&eñêöÑ+ŸØÆyÕn;½CçŒÛJç@}äUý¶!êϘ¼n{^ÛöÔU©P‚$ç‰ê/òê8À>f/°_Ip~9e#{锟lc‰‚n·‚®¿£#êϘ‚d{éšró”Òïrœ/Èt§Àá»Å9аMÖ(èv+èú;:¢þŒÉÿ6Q=ÛäGÎg½Uf7/ÊÃÀ\GØ&kt»týQÆ›¤,4DŒ„`Ö¶ÉÝn]GGÔŸ1ùß&J…Y’ò¦zM½¶ÉÝn]GGÔŸ1Á&*… )ê™… sª(ùa›¬QÐíVÐõwtDýSl’òöAî¿’ho2?RPj;‹Ûd‚n·‚®¿£#êϘ‚`)vÀ¼^ùzGÃCØ&kt»týQÆ›ä;,ŒÌ!l“5 ºÝ ºþŽŽ¨?c„Mòb¤ +Ûd‚n·‚®¿£#êÏa“|‡ÙNÁ¹“Çžg9 a›¬QÐíVÐõwtDýSPl’÷Ôz$£Y»7Mú›ítê5,Ç # ÷øg×Vj5xÙÈßÂæEÿ4:Ç $ w}hÒßb§@Ì @ÿÐét&ý-v Ä"@  –G D§ Oñß¿¨Õ¨šä¤Ü.Š ¢n#ú[e+Ói‚‹·ŽréÎqt:ÑQÈi •J×¥rÙ&à Â.bŽŠ¨@àÈX™>H;¼tç_Ú6|•Ò)‡‹$Ðh“ùóÈV*—1Ý)÷<Œ¨@àÀØ<} ÓéP(TèÄ”BŽ£P¨Ðétf§oÄ´NÞEÔ@ pd,=ö<ߪ¬ÅÙ IDAT¼Š/Öçòõ‚±9†iÌÙ[Üxò.¢nã’©…†r.¬'ÈNž•Ê7àÒÕ£v,Íó%¿”y¡·o\Éíbä(Y­Sl(r›×¤œËTªÐÐlôKWŽ˜ «T¡¡Åpóe0ý#ûäÉS-\Á_»÷Š›»õêÖæã®hÔ¨^Zyô di  Ì‹(_®þ¶ËàÓ˜²,Ó¦}G®]¿Îíëö¿©,ˆR¥Š³fÃ"Šó'::†£GNòÕ’Õ4hôR¦óÉ‹˜[Énm…»««+íù›Ö­[êýþؽ777›Òg…C†Qºt)6o\OñâÅˆŠŠæð‘#,X¼„ÆÍw$óÖl›×ßN¸uý2Ò‰ ˆ`Íšuô8˜?m·)}^×O XFa1T–Ó\Æó ~‰ L?ƒúuÚR¿N[&Í 1!d™*)ˆ*ëÓܽsŸýFS·VkjUkAß^à ‹°œç3wôÈ FŽ@ÉÅP*x{¡C‡V¬Û°X'}^©y§w©aZ†¹³¿¢iÃW©]½%#‡M$öi¬Ù¼Ÿ‹3go 6IÓ¯O/¾^¶ÜÀÿë¥Ëéß··Aú;wîЫOªT¯MÅÊÕéÖ£7aaa ËŒšÄÖ­Û d|÷Ý÷Œšd2ßÃGŽðÙ§£(U²J…o/^ëØ-߬×Ç)ûbEƒãŒ.}}ÏœÍKõQ±J NìÓ§¹[¶Ô— uc.¬ì‹‰ŠŒ¢N½†DGE„EEFQ·~c¢£¢l¸ñ›M4iÖ’ò•ªÑñµ·¸pá‚><1!£ÆP©jMê5hÂÒe+ Ò[*Ÿõöfð \½zd™N|ÄO?ï4Hóàþê7lš"2]—ÿü³¶¯¼JùJÕhÒ¬%ß~û]î×¥pÂåg—N,Ëz—r®3péýÌ_NHH(¿ü¾™]¿mâáÃ.X,ë8i?ç/íçü¥ýú4ú¦k·N8¼“ý"0°4ÁÓ˜”ŸÑÕ®S‰A38}ê &ã¤OŸš÷ùKû™Î‚EKèÞ­ 7¯^Ðש­u9bÔ§ :˜s§ÿå»M9uúL®×¥pÂåg—­NAFä .½ß®»;nÞ>^øõf측ìÚù§É¸©îÇ]¨ßð%œÕθ{º3tD?Mš·bÊ—Ó‰ŽŽ±XÖñͦÍ,œ7[ï·eë÷Lš0ž€ÜÝÝùtôþøcwvLâ0ôìÖ•›6£ÑhÐh4lúö;zõèn2þ”Éñ÷÷ÃÕÕ•¾½{rþÂE}ØO;w4n >ÞÞøx{4nŒÕüËWÖ»º š°~ã7|1y"Í_nЇ»;;wýÀÍ[·Ø»?=ºu1+ÏZ]ª]Ô<}LdD$Å‹cÆ´/¬–Q ä×dܲU“œh"NŠ_DxEõç>D„G¤É˜þÌé ÌŸ»œK—®Ÿ€$IÓ¤âêêÄà!=<¤²,sëæ]6¬ÿžCƒXº|¦Éô7nÜæËÏç°ty0jg¥>,4ô1¯wøŸüŒåÈ Ìm™km+]Mro½Þ‘ù ñÃ?ráÒ%¾Z4OŸ.õÿ©Ógž= /¤êîU¸o¾ñ*‹¿ZÆØÑ#ñ*\ÈlÞn®jFÄÈ¡ƒe™7o±zízÊÚUËL–ýÚõL˜4…µ«–¡vvÒ‡…„„Ò¦}GùéË•—±¥n,…•)]’r/¾À®_~áÕ¯°ó—_©]«~¾>Fõàáîª?W)h4ýyXX8þ¾Eõç~¾VËpõÂýqtL 6nfÒ”/X¿zýûöbÖÿÙ»ïø&êÿ௶”¥º¡lTdTeƒ?DFòeÈ–QPvÙ{(Ê¥(â\l"@ ”––îÁh¡íýþ8š6ÉåšOÒkúz>}@î.—Ë+—ä“û¼ïs‹—á…ÏbÉÒ:h ü¸F¶ P~-W-[ŒÕk7`ÙŠU¨èQÓ¦LDû°v&·ˆlKÝ)‰F~Âê¦ùúú 6&UCC1×ãàããmpŸ‚÷ŸðölŒާ[7‡»{ܹs­[v7{ãœP½F(&L‰¶O÷4zÿ””TŒˆw' 0(À`™J•}±eÛJøûWV|¾ödêPÒ! I’àêêŠþ¯õÅ„ÉÓ0fÔ¸ººêï§ûwÔ˜ñ˜<ñm´mó4*º»ãöí;höÔÓúùÿ^¸ˆO>ý«—/Áì9óñlûv¨jѶ׬QÓ¦LÄ-Úl¯îÿÉÉ)ù¿±˜?g‚ƒ –ñ«\ »wlE€¿¿ªç­–¼6JóÞx½V¬^‹Î_À‡[¶cÖŒwŒfhj}ºi•|}{Cæ@Ll¬ÅÛž2è ¬Ý°I?½}X;,]¾‘KWà³g1îl³Û£ôZ6z´!Ö­^I’päØqL™6'orûˆÈ¶TJyyù§=ÿB.Xä¤$'¥`áüUx¡c˜~¾‡GE\‰ºfpÿììl”-ë ×2.ˆ¹~ïF,1X§±ÇÔý 8¾ùI‰ÉȹŸƒø¸›X¾t5zÄèýÇŒšŽoöÆcëZ×+¯tÅìˆ%¸~-9÷îã҅˘<á=“m¿Bùlé˜úË7?|ð@ü}æ7 4Ðèüììl”+[n®®ˆ‰‰ÁôˆÙúùwïÜÁøIS±xá\txöÌšñF›¨/-ø×oÀ |ýÍ$%&!7'qqñX´xkÜÈèc{k4¿‰fM+´®>¯¾‚i3f#::9÷spñâ%Œ?Éüó.î?•¯¹y­[µÀ­[·±mûN¸»W@ƒGê_‡©}äÁÿ»vîˆy‹#5%©)©˜· Òâm€$!33ïoþ5kT×Os0|è lúàCŒ:eË”ÑÏóôð@TÔU¯åØñ“ðß—qÿþ}HyyÈÍÍ-þ×’üsä?ªNI,x;ÿ´‘£ÞÀ‚y«Ð½ë@‡çÛbÄ[oèç¿>àe¼Öw$îÞÉÂïgfDŒÃâÈõ˜7~~•ÑÀË8pà'ƒÇ1ö˜0$ü5ìÚùæÎYŽÛ·ï Re_´lù8æ/zÇèýÏûçÎý‹™Óéçé¶cÀÀ^€Ó„ˆÄÄT«^ƒ‡ô)öÓ«L=¾ÒvY:Î옻p1nŒ? Ø_}s$Ì|w.^­7žx¼)$Hx&¬ ®EG#â½¹˜ûnD¡uŽ>Û>Þ…™³çàÖíÛð«\ ­Ÿn‰e‹}=Îþygÿ<‡IïÌÐÏ»pþ4`È 7§ÐP8Q½z5Œ\쯇%”¶±î£M MÓ=ïü÷}£_̘5×®4û>4÷ž=j8¦G¼‡¶ÏuDÅŠîЯ/Ž;avóo_ùòåñD³¦X9ßà>Î.Ψ^-={t3˜>h`üß«}qçÎ]‹_ËgŸi‡·Æ¼èë×Q½Z5,šÿ^‰x‰•S›V-¤#ÇO"-)^?ñоxeÐ$ÄDé§}sz+Ú4~¡8¶±T:úçtjfXÀuåâ_hÒ²=Ò“oÓV‘)%áµ¹uCGŒÆ÷ß~aÕz†‡®_@—Nü< *itŸU_|¼zôÖO¿sCFŽUª)0¼§~ì!²‚©#=¢b¢µ×fÞÂÅ9l²ïÝÃüÈ¥x®}X‘·1//Ÿìý×¢£Ññùš{®Dd=•…†lØSQ ©øhíµ  Ý^Dvv6Ú·k‡Q#†y4y!ÁÁX²p.œœœ4÷\‰Èz_%ÑÉÉ9¹÷áâ¬p²Zn^œœ“}«ü0Ö.m½6ý_ëþ¯õ.0µhÛøÏÙ߬^i›ÅG jú7À© GÇ£6çì䌚 y¤ âkCD%™ÂU~ÀÕ h„Zl½=”‹ J¾6DT‚©*4¤âUµF=$ÇÇ÷f|mˆ¨$Pú¬R5N9.‹»ˆˆˆÈ±™l|¶eµ=·ƒˆˆˆŠ™ÉFÁ‹ýGÚs;ˆˆˆÈNö¼¿ÌètóD"""¢Rƒ"""ÀF=ÀFP¼ö‰öÃýøþÛý-ëâRa:£ý ]m¼Uðµ!RÂ÷ˆãc£ÀÎ~:ô fÌ_7·rŠËfgeaδq|SÙ _"óøq|ª»þþûoôíÛuêÔA³fͰsçNý¼Bjî_PTTúôéƒÚµk£víÚèÓ§¢¢¢ -—’’‚'Ÿ|²ÐãýøãèÕ«jÖ¬‰† bÔ¨QHJJ2ùx!!!xæ™gŒ\2ZBXX˜Áú >ÏúõëcРAˆŽŽ6¹~ÈÍͱè nåÊ!77Ç¢e n“I’0gÎÔ¯_ 4À¼yó ž·µóIHHÀÔ©SÑ¢E T«V 4@¿~ýðÃ?}jrÁV¯ÒûBi¾¥ï¥ý^éµKOOGxx8j×®FañâÅŠÏÏÖïÒ[~~‘6¨jDEEá7Þ@¿~ýðçŸbÿþýøõ×_ –‰5øS{ÿü† †'žx§OŸÆéÓ§Ñ´iS >¼Ðr‘‘‘èß¿¡é6lÀ°aÃpîÜ9>|1b„ÙçX¾|y|÷ÝwÓ8€ *ZV÷cbbpôèQÔ­[C‡5»~[2–¹)Û¶mÃÏ?ÿŒŸ~ú ?þø#Nœ8;v›_P||<ºwïŽÊ•+cÏž=øï¿ÿpüøq¼ñÆxÿý÷>­ä*‚¹÷…Ò|Kß:Jû½Òk7yòd”/_§NÂÑ£GqíÚ5ìÚµËìó+Éï"ʧM«’$IRjbœþo÷¦¥’1#FŒvìØatž$IRpp°Éy–Ü¿ 5jHÙÙÙúÛYYYRÍš5 –¹xñ¢Ô²eK)++Kññïܹ#U¯^Ýäüàà`iÿþýR= ¦wíÚUúòË/ Öoì±²²²Ì®_’$iê˜!fç[»¼$)¿’$Iݺu“Ž;¦¿}ìØ1ƒçmíü‚Æ'-_¾¼HÛnI®"ØêµQz=”æ[ò>0§à~¯ôÚÕ©SGJKKÓßNMM•zöìivûmý¾!m°ÇçÙÇîMK ¾÷ÿýã¤Ô¦U IÕ‘‚ãÇ#!!M›6EíÚµŽôôtƒe6lˆjÕª¡M›6X¹r%rssUÝ?¿çž{«W¯FFF222°jÕ*<ûì³ËÌž=&L€›››âö9r?þ¸Ùe:w¤$œ:u pâÄ ¤¦¦¢S§Nfï—œœŒ+V(®_+.^¼ˆÆëo7jÔ.\6¿ ~ø½zõR½%-WS̽/”æ[ò>0§à~¯ôÚIFºþý÷_³QZÞ7DŽNU¡aJJ ¢££ñã?"""0yòd¬]»ô‡=sssqñâE̘1ÉÉɈˆˆ°èþÍž==zô@dd$ J•*øâ‹/ôó9‚””ôìÙSqÛÿúë/DDD`ûöíf—svvưaðzõjlÞ¼«W¯ÆðáÃáì\¸ýT°ï×ËË Ÿ}ö™â¶hÁíÛ·áî]±bEܾ}[Øü‚RRRP¹reƒiùóËȼ$çjŒÒûBi¾ÒûÀcû½Òk÷Ì3Ï`öìÙ˜1c†þñïܹcöqJËû†ÈÑ©:RP¡BLŸ>ÞÞÞðööFDD¾ÿþûB˹¸¸ ~ýúX½zµA_¤¥÷×3f ^~ùeüóÏ?øçŸðÒK/aôèÑúù³fÍÂÌ™3áäädv»Oœ8bÍš5¨Y³¦âóìÕ«Μ9ƒÏ?ÿÿý7^yå£Ëåïþûï¿1dÈLŸ>]qýZàîînðEpëÖ-ƒ/ kçäëë[¨ÈÓ’þõ’–«9¦ÞJó•Þ¦˜Úï•^»ùóç#==Íš5C»víPµjUøúú*>^ixß9:U‚úõëšfî ÙÙÙÙàP¤ÚûÿòË/=z4<==áéé‰Ñ£Gã—_~ÑÏÿ÷ßñâ‹/TlüòÅ_à­·ÞÂÆÑ´iSÓO.Ÿ²eËbРA=z4Œ²eË*ÞÇËË #GŽÔ>ÕººuëâÏ?ÿÔß>wîêÕ«'l~AíÚµÃîÝ»UogIËÕßJó•ÞƘÛï•^;___lÚ´ —/_Æ™3g„§Ÿ~Zñy•†÷ ‘£SÕ(xõÕW1{öl¤§§#==xî¹çôóGŒÿý999¸víÆŽ‹.]ºX|ÀðK½nݺX¹r¥¾/uÅŠxä‘GôóUlçÿå¹aü÷Þ{صk{ì15Oo½õ®]»†‘#-»ZdFFÖ­[‡Zµj©z{ÊŸí+¯¼‚ àæÍ›¸yó&,X`Ðçoíü‚Æ?üK–,Att4rrrpûömüôÓOf·¹$äªDé}¡4_é}¾¶Jû½Òk7~üxÄÅÅ!++ ß~û-–,Y‚±cÇZô\ñ}CTš¨ª)èÝ»7bbbкukܽ{íÛ·Ç¢E‹ôó;wÞz —.]Båʕѭ[7Lž<Ùâû´jÕ*L:kÖ¬<þøãXµj•ÅÛ;kÖ,@XX˜Áô‹/š=Ôm©üÄ*T@óæÍ±nÝ:«×+b{tÿ7uŠb¿~ýpíÚ5}6¯¿þ:úôé#l~AUªTÁþýû±dÉôìÙÉÉÉðððÀã?^èTF­åj-¥÷…Ò|µï¥ý^éµ{â‰'Ð¥KdddàÉ'ŸÄ| ôKÛÑ^_"‡¢æ”D²Þô·‡KYwïZ´lÖݻҌñÃm¼E¤Ã׆È<¾G‡©S9̱…u茹ÓÇ!'Gy¤¯2eÊ ¬CÅåH ¾6Dæñ=âøØ(°³ö/tåXàÅ׆È<¾G/LDDDØ( ""¢Ø( """lÑ& sîgãVzª=·…ˆˆˆlìvFšÉy«–/ÅøIS·Q¤2ÖÜ9==’KYxWÊ”C®Sxy{ÃÛ×—·‹x[€2åàUIÛã·áì É% ž>~šØG¸v+ yN®ðªä¯‰íq„ÛÉé·øyjƒÏÓôô xyyù{.´f]äææ¢õÓ­¹`ªV­‚ÇàıŸàææ†ááCЪu˜œžßæ¶bïî¨S§6 v­šX»j…ÉÇ÷÷ó+ò¶…S›V-¤#ÇO"-éáaŽCûv¢CÞ­À»r ­¶ˆˆÈ*ù¿ÛŒññ RÙ…©ÓfZ½ýjXÕ(HOÏ@Zšé>R/--™ ÆLÅc¦â1SñÒÒÒžn}C+==‹—.G£GÂÚ¶ÅÚõ‘µë7¢]Û6f§ç÷úk}1nü$\ŽŠBnn.¢®\1ûغF†½XUSàááOÏ¢÷ÕPaÌSûd¦N›iÕö«Åša¿¢xÌTÚº}^륋¡×+/)N kp‚Üu`¬ áõ×úbÜøI¸…ÜÜ\D]¹bv’’“‹¼ýEÁq 4†yŠÇLÅc¦â1SñÌSÿ0¼· IDAT½îÿ©‰qÝ cÆÉ¿ô_êõð0{ÌÕÿLNoÖ ~ÞD•¬^¹¬ÐãŽ7 #— [Ï—˜˜„ZµjbÓú5F·- çÍQý¼­Áq 4†yŠÇLÅc¦â1SñÌS`ªŽ ÿtK–ÉÏÝÝ_îÛkv›\\\0eÒL™4AÕºí…5Ã~Eñ˜©xÌTP5Ã~Eñ˜©xÌTRh¦–ÉËËÃü…‘¨ß¨)|ýƒõëÝÿå×hödKT¬‚¦O´Àþ/¿.´N¿ |¶ï ƒi«Ö¬3Ø6ݶúúãÑ&c÷žOU&õKµªU"Œ¬;·ô£.œG­GU¼³$‰É)ÆÕ«WqêÔ)äååÁ××—·‹x;77AAAˆ×Äö8ÂmÄÅÅáüùóšØG¸}åÊœ;weË–ÕÄö8Âíß~û ®®®ü<üyêãå‰råÜ }uêÒK"`ùÒÅð÷ÚuеKg,X´©‰q˜¿ÞúCöÞÞ^سc»ÑÇ4¶Ìqøéð xsüü*cþœwѹSG,[²/õꃌŒ xzzâÓÝ;Œ®sXø` N_ÀÚu±ëã­Xºl…ÑÇuuuÅ–Í›Tå”k 4†ýŠâ1Sñ˜©xÌTDzc°h0}:ðôÓÀÔ©…º>Ea¿*VnÝ|}Ŭ¯ž)YžiBðùçê eK Q£"lYÉÅýT<]M‡‡GqoJ‰!~œ—•L›|ó 0i’ü×¢E¡Å„÷+º¸99âÖW±¯V<‹2•$`À`Áà÷ß-ÿ ¾úÊ>ODC¸ŸŠg®¦ //óF¢~£¦ðõ†_ÀÇ/Èà¯V½€Cß}Ç›·B@H(º¿ø2 ­ÓÔ}uæ/ŒÔ?ÄÅÅ£c—î EÇ.ÝotŸíûÂ`Úª5ë Ö£{<_ÿ`<ÚäqìÞó©… &þÚ¥þ—©QË–M›mÚ˜]Lø¯„ŠK}#¿¼Ä³(Ó-[€ÄDà ŒŠ?¿RÙåÅýT،ĸëF·à}§¼3U«VÁˆaCáã¤?¢P) ‰q×áììŒÜÜ\„TCR|ŒÁº|ü‚pú·“>‡¾ý mŸé€]oEÃÇšéד¿+ÁÕÕ[6oBÇž7›MÁïù›1W1däXëºÒÓ3 ¹¸îĬ)0 lÜœ9cÑâº>Ea eʰ¦@t¦T8ÓÜ܇Û?œ8üóOÑVîá\½jýF–0šÜOý(Á*e%$ ½A=£o//„µk‹™3¦áðá#9jŒA£`Þ‚E˜1C»[×ÎèÖµ3¹¾àëo¾-´NS÷]¿q$IÂ;Óg€¾aàíí…¤ädøûù!9%Þ&N¯Q½:0aòTÔ©] ÁÁA…–IMŒƒ$I8qògŒ=N±Q`Šøš6 EDƒUªX´¸ð¾Úúu…2ýðCy?¯Yˆ‰öìÊ—/ÚÊYS ?ü<û,ðÜsŽ%E曓ƒ»›Œ¡ kp‚Üu¿ áÄÉŸ‘““ƒÆ »Ñ%IÂÅ‹—0=b6xÝèzÝ7%á†þÿù„µm‹µë7bò„·±výF´kkºæläðaèÜ­'¾ýê “Ëè$%'+.cŠØq ä‰%ºe)Ô__|!ZYHø¹ÊeÊ÷ï‹]g ãPç8`ñQ'[2H4;˜9øùgà©§¬_¹®X¹”ÑÔ~*IÀ AÀþý@׮Ž5EV€WRáŠ~xoÖ ~ÞD•¬^¹L?oÞ‚E>Ô`yÝ!ú€€ ðº¾ï?ÿ—¼©ûš2;b GÕuдIl6Ñ€€–-ž2xœ‚òoßÂys,z|cÄŽSð—i~&Èc¨x³ ïWÔâÐÓ§Nï½'ÿ¢´5I‚téœeüóà`ùCÚǧX7#;;àææ&7s¬o_ù¶|‘òÚꉯ)ððàE‘ŽÅßÿ8¡ã¨pg|‘¨(`öìÂ?–õ+~ð0|xÑŽϻ㊫.÷1<ðÚkÀ¶mÊ÷±™Œ `þ|à»ï”—HS}µ¦™zxŽÒÝ£B±î§Ÿ~*g>|¸Ü(s¼özâk <Ýð:×6½L“&Ƈw7Ö¯˜™iÅ‘®°¦@=ñ5Í›—úÑ Sâ¬æ—ñô4ÞËbìC63¨V­ˆS¡‚6ºs¦OFŽ”G¹³36ÄcMA‡ßoÙ²wî_-_A²LùÔÀpÕmu|‡¢zóMùôCÄšõÄ×E¿ì==ç`,ÏŒ +Ž”- Ü»‡rå䣄Åâ÷ß律5…/ôaÜGÅcMA>ǯ¼ôî Ô¨¡¼¼°r¥| §““üuw‡›¥k Ô_S@¸uK¾8¡9¦>÷LÕ¹QP¾8R`Wii/þôã¸}K£«âÅz¦ï²~}чÊWÞÖˆ’™ |û-”$ïS•+_®uk ¨ððì–ñô,9G vì1ºÓø¬P÷Ó€iÓä³maÁ¹Ç±¨Ö¨'¾¦€™©ü%nêH©šk”-+Fkóç›7Mš`Ô¯obgøù™¾KûöÀçŸÛfs¸ŠsêЫг§|ácÃpìÙ#¿–=zñAJÊ‘‚»wå3­¶o—·ÙJ%q?MK“ßî¶jddX6FKF†|aÍÂÓ½áãÁî5XS`–ü²WSS`I#ä­òå,{¼7¢£M›€³gÀ©Hå1¼¼lWÉ}Tœ¿ÿ–Oe_³Æô \¯½fåøe%åHÁÊ•ÀãO?-du%q?MOjÕ²Ýú-½”ÎúõräfÍ‚s<ñû/æ]ãXS`™™Ê5åÊÉ?†îÝ“¿·uŒõ+¦§[Ñ(°[kàñãÑ£õ ‚ÔT9‹2 {š··í%±¯V«þúK>”k.S!ƒšêŽhõ¼ùÔTyàcÇ„­²$î§ii¶’ÆÝݲ¯32Œ—‘‘ôdÖ¨Áš¸u˲Ãýº£ùûemRSmŸ‹%ž8!ÿmÙ¢Ÿ”š øú*ßÕËëáiÚ¢•ľÚ>Ï+üË硨(ùì6{žÁöÏ?ÀK/™ÏÔÍM@;Tw´ÀÄõå‹ÝܹrÿH=3…2*Ùk?ÍÉ‘è) T==ݶ/‘»;`ÉU€33êÕ OgMzš¬)øþ{¹ÀÄ\ 4- ؽ[›'Zr¤xXW¿Q`“š‚¬,Û_,1=2Dþ°,WN?95Õ²á™mÙ}P’:GÊÝÕæNoÞ\þpõ½”’¢Ü0;qB>RP¾¼éL+Vx¤ 8ܹc|d1ó瑵q+6ø  L/V£†\a){í§—.ɯ¡Rƒó£€þýͯËG ,­)0Ç)PO“5çÏË;å¼y¦—éÕKnAj±Qpë ¼œ±º‚‚yÞ¹#ÿØW:ün’››m* 33åÑ+/\x8møðBŸ"Zh”ľÚ?þÇz2÷Áݤ‰ØFÁôéòP¦S’äå³ Lg*¤û@w¤ 8.=o)Ÿ gLN¹nÁÍ_«â‰'Œ/rþ¼Ü» ¦Q`¯ý4.N.ì57ÖÒ¤I@|¼òºl}¤ÀÒ¦©º+ŽS ž&k 23åq@^yÅô2MšXV€R23-+¾1VOU°_Ѫ®@þÕž•%îõ×¯Ë •+åŸçΙ½¤¥‚ŠåCÎ99V4€L(i}µYYÀÅ‹@£Fæ— 5~ýŒ¢ºwOþ~ð`åeÍeêæ& çäô°bOçÏËcü÷Ÿ¾.ƘSõ€/V›n¥¦ª/À³×~zó¦ò–  àÚ5åuÙúH©‘_ 25ÀÇ)PÏêš‚ÉÓ‚,:TÈvC†Èç0›S°ŸÝSÕûZ`éÙÆ~ìW´ªëÐwð ¹D½$]»‰‰ò'Þ®]Š—†¶´Q<Ì£R%+·³­ÕlÝ Ü¸azþéÓrnnæ×jYß°¥Ôìkæ2­X¸rÅÊ)Ž7xNŽ|êÄâÅf€ò~íã#¯NÍ/i{í§ññÊ£'O*¯Ë5Öt°¦@=«k ž|ÒY±EgÚ4 iSåFAf¦òh¡ZnXúëÞãðs(ø`Õ鈀|¤àÒ%x®]€áÌô*úê+ùg|l¬Åçe§¤XÞ(ðö–yˆnh¥1 3t(СƒéYjÔºwW^Oh¨ÐâwUs™ ;ûÀ^G RRäVÌÖ­òOèïbIc·zuù:`=fÙfØk?µ¤Q¨Ü}-}´ôó¿(,Ý—Lí»¬)PÏêš‚1c,ß#ââ,»xbF†rëS˧2[Zh(Iò@h†ƒ¡>g®_Y‘—0~<œÓSá•Àš‹Wöì)ÿ’R1PKJŠòQ[Õh­¦ÀÏXµJþR·FÕªb¨éª2—©°³ìÕê2D¾R`µjÀþýŠ‹gfÊmm…ƒdªöÚO€úõÍ/$^›“žnûš.Kk Lí»¬)PÏ®5>>rWKÎË·eaš)j-³ä×Îò_~Âû½¼€E‹ ¥S>†Ï³Z@£H©@|ùàʶzMµVS`I£×¡¡r±Xx¸ée²²ä#–Œ¯£æÂ[æ2vö=Ž|ü1ðë¯rEo¾³fÌIN¶ì4[]£ÀRöÚOoÜ»Ì 6ßÅÈGõl}ÆhÅŠ–S`l[XS ž]Ç)ðñ±ì\tK‡ ¶g÷®¡b놈Öú¿MÑÕ‡ j~¹.],ÿ¥di£àêUËÎV«^]ûÆT¦o½%×”)qw&LPËßÉIÎD‰UƒQåS½úÃKL˜2c†œ¿%Q5*hHðþû–•À“ ¿c~9ggùüO €åcoT¯._+éøqÓËH’ü÷É'ö{ï'$þþæ—qw—£1·OغȰü€‘©-k Ô³ë8ÞÞòád%–üb±wMÕgXHë„ùׄҗ’NNò‡èÏ?›^æàAàÏ?å#½æDEÉ•ùUª˜Î4;[>’¡ôE~èü¡­ôËiÃàõ×Í¿è†Ê‡››r£,!Á²Á_q5Nx±NûöÀo¿ÉR(ŠÜ\à½÷€¬ÜÂ,-ž}ùe¹‹GI¯^ò:íõÞ‹³ìbUwîÈïǺuÏ?tÈö×Z³¤¦ 3óa#¦ Ö¨g×q *U²¼Q`ɵŠú#¢(l]e«c«~EÑGV•‹•Ô>\>?ßœ#€7ÞP>m±aCù5«RÅt¦–¾¦:ÈJ¾üR¾(K•*¦—±WãR' @>:n 5sû©îƒY³¬\í¤¦Zö 94Ô²º‘–-åá£[·¶þ½aYt–Ôù¬\)Ÿ–hªì‰'”k¬åê*7  ŸŸ¹#ˬ)PÏ®5ºêråõ–Þ#¶êWtvÛE›œ,þ,矗ÿDÈ¿¯™ÊTTß¾N@€üËÜ\£À^KJ•,;RpïžÜ%céQtsû©î KK;¦RÆr£ qcëßûééÀ’%ÀرÖo×ðáÖ¯CÝõLuÙ˜;²Ìšõ¬ºÚHzz†¾Ì>>–Ÿ}PÔ« ÚŠ½>ÌÓÒÒTeZ\`öRÈÅ-ÿ–Le*ªo_Ç’/`Ñ %¾¾Æ/)[Úñ0Ìí§åÊÙñ2ÝÅ@ÍØ–hÐ@nˆxïÛ»ÑiJc¬˜;R––†ôtž»®Qv­)°¤Q`é/{Ÿ’è5ºþ9wwëו”¤íF—×Ã}ÍT¦¢?@}}•¢"Jä®%jæöSK+ÆK*Ñ‚† qã€ÌL¹?ÎØaò»wåbW¥Q.±Q ìÝ <ú¨ñùßoºF‡5êÙµ¦ \9ù0öÝ»¦¯ìfÍÀ?¶d¯_x¶¨PA®•1W%_#B”æÍu»&:Í!Êïܹt6 ž{N.ô5uªôt MãóXS žÝ¯}àí-·´M5 ,ýp²´û૯äáÌÍ úõ3¿Œ½~áiíœzSnÞ„É‹Áh%5ÅÑ}`ï#ºm’$ó_tj·ËÜ~êê*?^n.àâ¢v‹‹OT”ü£å»ï”—U:¥O ooù,s™ž;gÙGllÛVôû²¦@=»ŽS<ìB05x†¥¨xzÊç«GE™^&:Zª?<Ütµð•+ÀäÉÊ{ý³å¹ÊåËËGiD<ädíwèÎt1–in®|Ê•ÈÏŠJ•€¿ÿ6¿Œ½¸¸Èï¹ädî% Ú IDATóçE©)L狀.„’ôuú´ü«ÔªD­`.SKº¦ûï_ZÇq Ô³kM ·dŸ|Òô¸ïýeÙé2žžr_“¹SÅnÜ–.•ϵ5åþ}`ß>å«ó¥§ÛçÖGÊ–w^qb¢åÃoï‡ Fc™ÚâÃÓß8rÄü2ö>R<s–~]ºõ;99!883Þ™Š^¯¼dQFY]Spûömx{{#>>±±± DHHˆÉÛ»vUA¹rHNNFBB*UªƒÛµkû+®ïÖ­xœ:¥üxÌÏÁ$ÂÙ9ÚäúnÞ¼ ouU|<­Þ¾wÏññ) 4»üᅦ G $$...(S¦ rss‘““£¿$&þ…ØXoÍ<¿ü·%) W¯Jˆ½£Ÿÿûï¿ëçÿ÷_"Ê•óBll¢°ÇONÎÀÕ¸™\>6¶š4©h×<îÞ AXXBCoÁÍÍ nnn¸wï²²²ô·¿ûxöÙTƒ¼Ì­?++Ëìü¸8 k×[ qAùòå‘••…»wï¢\¹rªngeUÀÑ£¦ó´ôö±cIX´ðð(wwwܹswîÜAùòooÛV}”  R±î¿Æ>OË”IÃ… yˆ½köþiiÍàééTìï?-Ýöò2ÝØúãÌY|¸Å°bÚÌYhÙ²öí݃ù‹czÄllZ¿K—¯ÄÞÏ÷aïîxä‘zp2ÒWðKZiúÁCßáÓÝ;áçWß8ˆAC‡áò…‡×oØ„žÝ»ÁÉÉ ÷ïßǮݟ}ì¼¼<9z ý.r£À©M«Ò‘ã'‘–ôp$ Cûv¢CÞŠwÎÌÌ„W¥Í÷+yæ`úty5Sþïÿä.†ÿû?Ûn‹-k êÖ•k,êÔ1¿Ü† ÀçŸËí1'4Ty¡âòí·À²eò¿Æ2={èß_þW”³g&MÌ2¸a°y³<“½œ9cÙi‰Uª¯_¯|épÑš4¿N¥ýTÔ T¾¾r7„µ‚O>‘¯}¤åâXs™ZZÄÊ®Cæj "fÏÁk}{£Mkà ƒ¤¦¥¡òƒS«*ùú"íAëöÆ8ütø¼9~~•1λèÜ©£ÕÛ¨;zàíí…=;¶]fXø` N_ÀÚu±ëã­Xºl…Ñõ¸ººbËæMEÞ»×hQ­ZrÁ¡9özÃi!Ï[·Äà‡üW2–©-úö+VT¾£°×~ª2ÙÜé¯Ï> üðƒòº´Ü Ìgjél2WS°~ã&H’„w¦Ïðð×¶··’’“áïç‡ä”x?ÕÛË aíÚbæŒi8|øFŽ#¤Qš‡¬¬,|sà ÂGŒÂ￞(´LêÕ€ “§¢NíZ.|ñŠÔÄ8H’„'ƨÑãÐñ…¢µÌí:NVU¯._Èfî\óËÙãsЖyººÊ…•J23ÅžrU¼½ÿÕ^V8ÓO?•/(DEc¯÷½%W&-_^¾îD—.vÙ$›1—©¿¿ò)‰lfnœ‚”„‡W8ËX?¬m[¬]¿“'¼µë7¢][y„°°v'ȵÆj ÔšòÎ ¼=n4*º»ÃÙÙ·ÌŒú5rø0tîÖß~õ…âz“,½ šv§@‹úõS>%Ñ^lYSP¡‚|ž’[·Jv× 8Ö® ,Xä<±©L¾ˆ˜`àÀâÚº’Ï^ãiXr•Ð[Ž)ïê Œ!_—Ý”ØXÇ*Õ^ãô—&öÊÔÃÃü€[ŽÔ}ÀýT¼¢\û ´ãµ4Æ–cÊÏœ Œ­¼œ#œóŸ®'áhì•©‡pù2e|þÙ³Žs¤€û©x–^û€bMÆØ2O__ù¯´á>*ž½2õòâ‌ϊ–/·Ë¦Ø÷SñXS k 4†yŠÇLųW¦Õ«[6 §#à~*k Ôã8Ãs•Åc¦â1Sñ˜©x§@=ŽS 1Ÿ¤ø¬Z¾ã'M1¹.%V@zrœóî!==i©pʽÇÛ¼ÍÛ¼ÍÛ¼­‰Û>>ê 8×­^ Ⱦw... ”‘o~ƒ~™gÚµCä’e…î›·þ7×­F÷_ÖO¯Z¥ À N€ÐªUõóBkÖEnn.Z?Ý ‘ æ¡jÕ*…ÖûXãÆøæÛèÜ©#ö|º:<‹óýeò9øûù©yʜڴj!9~iIñú‰‡öíD‡½‹¼R""¢’ÀÇ/¨Ð¯tÝ¡yoo/ìÙ±O<ñ¸~^BB^íû:&އN_0¸ß”wf jÕ*1l¨ÁzOý~/õꃌŒ xzzâÓÝ;ðÄãÍô÷KLJªÕkqò—_qðëý…¶åôo'1$|}ûÚ>Ó»>ÞŠ†5Ó¯?W‚««+¶lÞ„Ž/¾þÁ4t8Λ£¸M¦¨®)ðñ ‚‡‡G¡ÂˆÚõâıŸàï燄ÄD´j†ÿ.˜.„ ‡²³³Ñ¾C'ÌŸû.º¿ø²þC‚™Z/ûÞ=8x -Á±Ãß3SA®_A—/âÏÓ¿1S ök3Ó¢cv–1US úìÝŽ«+Œ>¿ÞÔ´4T®T PÉ×iéé‚6ÝñEÌžƒ×úöF›ÖOLg¦Ö)X,0SÐà ,˜ûfj Ì´è˜uŠ\hX°0ÂÛÛKß‘œ’o//1[X ˜*Na¦Ö1V,ÄL­c¬ÐŠ™ŠÇL‹ŽÙY§È‚‚…amÛbíúÈÎÎÆÚõÑ®maéèL§0Ó¢3U,ÄL‹ÎT¡3™³³ŽêîݯX777´xª¹¾0bvÄ Žª5ê i“&ؼi½Ø--…˜iÑ銅RR’ѰA}±3-º1ãÆ^êõ°2æêÌÔ ‡ªäÌ´è˜u8xQ)ÃÁ‹ˆˆˆÈ,6 ˆˆˆDDDôDDD€"""z€"""ÀF=ÀF`£€ˆˆˆ0Ù(¨èåcÏí """;¸‘fr6 ˆˆˆè6 ˆˆˆDDDôDDD€"""z€"""ÀF=ÀFÊ÷öåæÜÇýì,äææ÷¦ãä8;»ÀÕ­\ʸ÷æØ„”—‹ÜœH’$~åN€““3\\\àäì"~ýDT,Ø( ³rssœ˜€8ˆØëÑšm«ZÞÅÅ~þAhÝþ9T,W¹996Ú²â!åå!3=ÇÆÍ¸Â×ïììŒÊ~þhÙª-¼}+ÁÉ™‰dÖ½ì,9üjÔª‡®ÿ×NNÚüðÿtûxkâL‹—¿/¿Ÿ<‚_ŽA§ž¯àî­ nýåææà—Ÿ!´juü_ï7P¦ŒØ·zvvNÿ| ¿ýzaí; l¹ B×ODŃ2KÊÍAôÕ(têñ BªV/îÍ1O’ Iy-Z¦L4kÑ﯊„‹‹6:Ö¤<Ä݈E÷—_ƒ³“rsî ]4{ªþXý3îÝ»ÇF‘ƒ`£€Ì’$ 77W³Gò“$ R^áþ󜜣¿”˸¸"77€“¶ÎÎ$ //.eÊØ¬kÄÅ¥ róò€þx^íÝ;w~ŒÆó–Ú©ÆÏݬ,\¼xÉ)©pqqÁ£ ê£R¥J…–‹‰‰ÁÝÌL¸”+‡à`¸¹¹Ùc³‰¨˜°Q`¥uê®\úGSë*~Ι;ÓÞ™Š>}zÞ|s Ê—/9sçaçÇÛ‹s#íJ‚ñâËk×®âzì ´nÝåʕᅵDó'ž€›[Yý2W¯]ÃõoÖ!Ô5ÿ \žï‹ÐªUí¹ùDdgÅÞ}žžy ¡}‡N¨×°1ê5lŒVmŸÁo±zÝ5êÔ7ø«S¿Ú>Ó‹/Cö½{¶¾t Ñÿ$IæÌ™ƒúõë£Aƒ˜7ožÁ/V¥ùE!÷sçAÊËÃÖ7£÷«½ô·¥¼<ô~µ¶~¸Ù`šÃ+Ð]¢û €3$|¹ÿ ¸»»ã©­pú?ôó¯ÇÄàòÎ…èô#8ŸF“„/‘’”T »_ˆJ—bm$§¤ Çÿ½‚mïÄèQ#ñÇo?ãô¯'1ï½ÙBçÊ¥påÒ?øåÄ´xª9Ö¬[Y³ßºîÒ(66±±±FçmÛ¶ ?ÿü3~úé'üøã8qâvìØ¡Ÿ¿}ûv³ó‹J÷eåââbô˰àtG§ëRÑýÝ»—èèh\¹r­Ÿn‰»wï 99>>>ˆ¿y’”‡ë1×qaû\tùhà¤ÜBT²3ŒÕ'‘c)ÖFÁ’e+p-:S&ŽGî]Q¡B¸»»£]Û6øðƒ…–ßýɧèÒýE<Òð1´hÝ;víQõx¾>>xgÊ$Àþ¯¾ÑO—$ ›>øaϾ€º ä#k×o4øÒÐmزu;Zµ}5ë60˜®“——‡µë6 uس¨S¿žn×kÖ­G^_¥ïoþ­ÃžEÝÑ¡SWìýlŸªç¢u{öìÁäÉ“€€€Lž<»wïÖÏß½{·ÙùEa¯B9Ýk¾c×´}¦ê5lŒŽ]zàÇŸcáâ¥xêév¨Û 1ºtüqF¿_~ý /¾Òõ5Å#6Á€7ãðÑcV=gE’áÙ¹9yøïr*xxãà¡ááé›7oâÒ¥‹p÷ôÅéÓàÒÎ%èòðT(ðu^÷Áõû¡zõFÏ> "ÇQ¬‚ï¾ÿðÂóÏ).ûÑÖm˜4eqôð÷øzÿç¸pá¢íذéÌ™·O<Ñ žþ½^~ #—`ÓZöâ¥KøîÛ¯uño£ëZ·a#.^Š®;áü™SèÜñ,Z¼ ë7lÒ/óá–­xoî|4z´!~>~»>ÞŠƒß}'ä¹hÅÅ‹ѸqcýíFáÂ… Ï/ (td@éÏýõ¾ýjÖ¬\Ž /âÍ!Þ–†}ƒµ«–ãïþÅÛ§è—ÿߨñ8sæ,V,ÄÙßÁÈáÃðÑ–mVmƒ’‚™”-ëŠ@üý÷_x´qc<ùä“8þ̘6~•+"f¼£òñÒ0a$ [—Núé۶ˇ­ß1 åʕÛo Àò•«±uÛÇ2h Á:Æ LÞ¶}Ç.À àææ†!ƒbÓÿ·wßÑQU{Ç¿“I2 $´ÐA‘ré½÷*b¹r!HèMé H4i"ˆŠ "*/U°RDPñ*zéÉÉÌûG&!R<Ÿµ²Èœ³çìÅofž9gŸs>XÉšuëéÔ€W®`ܘQäÏ—ÏñûW;'DDDàåååxìííMDDDª×?›m>Juó¶/öHSwÇ !W®\4jØÀ±lØÐÁäÊ•‹¦M±“õâDDD`rw§páÂ`0P«f jÕ¬‘¦1¤äÁ32â”,U‚K—/³áÓõTúWeΜ=Ãí(+Þß3 ãm uŸ‚m—Ùq67'*СÓsäË÷Nä甥¡À×ׇ˗¯píÚu .äX~úø±xÁàò•+KdR[Jâ¶e4)R¸0ýƒú1tð@Çú+!!4mÑ&Þó.^Jx#™¸ñ¤\½z ÀqzWÜ¿!!Wm.]¾ €_‘"Žeþî ¼¼¼ˆˆˆ wîÜܹs'^Hiý㈱DÓþåž©no޼›¦þ|ìaÖÍíþ]ã«‹ýA~ˆŽ>„àÙóèôü‹F*U¬Àë#‡Ó ~½4#9Ö –èø“j¨U³Ñ÷ÌìÞ·ŸêÏ>ÃͰp.y–"êØ>¼ï^dó¾k,ÿ}:wÆË+W‚mˆˆsÊÒÃmZµà³Ï¿H±m‘Â…¸ÄĶäÄM<ñ×Ùóý׌9“ûýS¯â¶}pÿGÛÓÇqòï?¹/_ߨ À7(T¨ £M\ˆ ÿî Ê•+ÇÑ£Gÿýwž~úéT¯6DÝHõOfëíЃß~=ÀŸ­gäð¡ýý¿ 9*CûLê°‰›«+ÏT®D—ç:P§v-¼¼½˜½e/‹Ì]ØðÕu¸R—íßsâÀÏvøED²Ÿ, Æ ¢üÓO³`Ñ–,]FHÈUbbb8áB‚¶¯öàÍi3¹vý:aaáLŸœ.ãèÕÓ€àÙs¹uë6ü°{½û<ò¶ºtî ÄN$4›Í¼÷þ‡tý÷ËŽ6=º0cÖ[ܼÆÍ›aÌ žÖ?#[y饗&$$„‚ƒƒyùå—S½þñÜŸoµZXøðòÌ4p0Çþú›Š*P·Nmܸ.@ÆHúІùò=A¹§Êòó¯‡è4¹sf’§0ëΖ […r3Žýk>Áb‰Ö Er€,=|'On¾øl+>XÉ–­ÛY´d)‹oo/*”/Ï¿*Ut´ ð‡­ZCƒÆÍÈ—/Æ J—qô èÉäÁê×R³n}ÜÝMT¯V•W{õJùÉ6d 6›•Ï¿ÜÄŠVR°`F BÿÀû×]èàÅbaåªÕԮ߈Å‹Ñ?°;¾Ú•.Ofyðúq¿Ç¢Ø½{wΞ=K“&Mð÷÷§k×®Žö)­~{ýóè/ò+‰ïý=4W/_ ôúU*V©‘%×(xåå—ž=—C‡`0¨Vµ*ãǾž¡}Úl$y–@XX8ùÿ^}˜?wO–*NûVÍù©|yŽ®ø€7nЪz vLŸEÄ¥ËÔˆÉÃ#CÇ+"YËа^Ûî}û »~űpצu<ߣ?wÂofáÐ$;ˆ¸Æ;‹æ1päüŠ•Èêá$iQðdz&*âQ‘‘üñÛJ–)O>_®^¹ÀÅs§©Ó¤XcÇÈ×}ü!ýGŒuºZ6G±fÕûôÂÝ;·â­³Z­ürè0ºÄî™™7g6… ä§Qƒú¸¹¹ÉžvsíåÔ¶Zù&—'ÆÓg¨;6•Ô·­ukVòÂK¯û‰„—H‘ì)âV?~·ƒ–ϽâXrá }×eŽÅ‰<0ÓÞäa¢R•šüqä Ç™qss§NÓöØb¢sÔ¤¹ÄÎ>°Zc¹zÝñØäf¤Fõª¸º±Ù¬xx˜hظ!ß™Íì_¹¿ð[\,] CÞ<:d âä ÄiÄ“ÇÝäA¥gkñ¿cG©V·¶˜h¢ï™³n€YÀ–Èi„f³™«×®²ê£•ÿûíÚ´"··w¼v&“‰Íš°ßÕ•Ó¡\Ãz”,SZ“ EœœB8D&¿¹¹»S¥F]¬sŽ ØHôƒ¼VõªÜŒ¤M«õ+’h¯\¹¨ß¸5êÔÆd2a2™ DœœB8 [€Ñ9øæW6%“É åËÅo—Äaw<<âÎÐiˆ"ÎN¡@’e0Ä^ôÉjÉꡤÈf{´ëñÛ°a4ÆÞèÇiY“>û@Däa ’,ƒÑ•’¥Ërøà)Z£1;—LÂIuI·„S§NR´x)bbœpòœ!öªŠ·Âo`È .l€ÑÅ%ö/"™/;¿ÃK6ànò MÇçÙ¶i#SF&&&{î1(\ØÕï¿›êöF£ ‹£eÛŽÜ‹JÛ厳#ƒÁ…ÂEü8}ê¥J—I÷npæÌiüŠÇàbLç­‹HVQ(d®äÍãI@߸à4ß mXcb¸…ÅÕƒIwF£+µj×gÿ¾øýÈ!bÒùbMF .Bµ0yx¦ë¶E$ë(HŠ,–h,wœïƒÓ™\\È›/ÍZµÅrÏŒÍjM×™À`4ânòÀ¶%ÅâlIDATÕÝ”Ž[‘¬¤P ⤠.FL¹0y$}«o‘eé ‘DDD$ûP(@¡@DDDì DDDP(;… DDDÄN¡@DDD…±KòІÛ6¬ÌÄaˆˆˆHf¨^§q’ë’½Ìq›.þé>É;>_M¿I®OñÞwïÜJ׉ˆˆHö¤9"""(ˆˆˆˆBˆˆˆ """b§P """€BˆˆˆØ¥xJbrryçI¯q¤™Nt~ª7Éhª1ÉéÒ öBÙE£VÏeõ$ƒ©Þ$£©Æ$'Ks(èÔ-(=6óØîEFd«rvtÏE´9*Õí ðÊ››Õ–£z<Ïý'këÍ¥zKŒSÕX·À,íßyW5–Áœ©^ÓSº„‰¯ôS8}üXV#˽(Ž>ÄÞ¾M±­ÑèJÝFMhÝ¡3wÂÃ2atâ TcòO¢zMœBA6”¡Âfƒý{w3yöbL&DÛ„……ñå—_Òõ•3uìpZwxþ‘úðüu‘ïôÃàBleÅU—%öÇfÏˉ¬Þ2-ФÕ˜óKíÿqvü“T¯‰Ë1¡ ôS’\—Ü "½_0·oßfþ‚Åìúú®„„àå•‹Z5kàßúõê¦8ž´ˆ‰±$YüçΣ[·nœ:uŠråÊcyäíG.ëçúcÈS.ÿ…íÖ5°ZÀ+/†Bå°Ý¼Hä²Þ°ü|Zÿ”„ÒOUàÉ'˲sÛf ƒc¹Íf£eÛœùóÓ¡][Ö­Yåhó`_q}?ø'&&†à9ó¨Q»>åÿõ,C†$"""Å1<Üfúôéœ9s†1cÆ”†I|1lûÖ`;°CÙúP¿;Ô\lßÌÇúå4xŒ´ýOÖ¯ï«,]ö^¼eK—¿G`¿>ñ–%WSã'MfÃÆÏãµÿô³ŒŸ49Ñ>Uc9«Æ’Rú© „……S½V=ÂÃãŸÞNÍ: ¿• Ö¬]Gƒ&Í)WñÚwzž?ýåXo6›9j *W¥V݆¼»|E²{ad0ðõñaÈ þ?~€—»vgó–­ñÚ]ºt™Zõ%ùþ›RMþ°{­Úu¤\ÅghФ9ë>ÝâØT¯÷åøP0wþ®„„ðÝ×;øv×v.]ºÌ¼·$Ø«çÕ~ýéݳ‡þÈÏ?í¥l™2L›1+UýU¯V1ã'qøðGøH΃{4fL{“fM›8Ö½óîrþøãO¶lúœ_ìÃd21ó­9ÉnoõêÕ4oÞœóçcwWíß¿Ÿµk×Ò¤I ”ª¿!IF°Ý¼ˆmÃkØÎüŒKã¸4†íÌÏØ6Mk ÓÖÅ?MÛÖ­¸qã&‡à§  §M«øÇ“«©7&Œç³_°eÛv6oÝÆÆÏ¿dòÄñ‰ö©K[Îä‰'òÒ¦M+Ö®[où'ëÖÓ©c{òæMx]†fãúOøí×´nÕ’q&9ÖÍ¿€Û·ï°÷‡oؾu¿üzè‘ÆzãK–.ãÙg«0p@ ¿ƒÕju´Y¸øzø'ùþ›RMŽxm4Çæ÷#¿ðéÚ9räh²cR½Æ—ãCÁ¦Í[™4a,¾>>ðõeÒÄñlÚ¼%ÙçìÚ¾…zuë`2™È;7£^ÎÞ½?¦ª¿w—,¢hQ?FŸÈ3ÕjQ¿q3Þœ63A’ØÞ}?²fí',œ¿ø×oøŒ7&ާpáBxyy1êõìÜùuŠc¸pá/¾ø"çÎcÊ”)˜L&f̘‘ªñ§èVÜ»›>Ûr...ôyµK—­àÝeïÑ·Oo\\â¿ô’«)ww7/œÏ[³çr߃²eËðÆÄqT©^+Ñ6×CC 8˜ÙÁ3(ZÔ/Þº|ùbÃz *øHýƽÆŒ@``:]¨ÅèŠKë@ -F`;ºÖÇ~‹°®€¡Å\ÂÎÁÆÄ?”œ™ÉÝ^=º3âõ1Œ6“»{‚6)ÕÔ±¿þâÓÏ6òî’E¼ñæTZ¶hæ¨Ù䍯 wÏÞ^´˜ŽíÛñÁG«™6åÇÚŽ/]r|‘ºpñâ#=?oÞ<öëÃ’¥ËËZ4oÆÜù ™=w>‡aNðÌd·‘RMVy¦2+–½ƒÍfã‡Ý{x}Ìx~Þ¿'Ùmª^ïËñ‡:¶oË›Ófr=4”ë¡¡L™:Nî§Ðr8“&O¥IóÖ´oÛ†×F s¬ï×çU:=ÿ"wïÞuì ž1i3‚¹8h(… ¤_ŸÞl¶KÉAXõñ&LšÌ;(àK£ X¼p~¢íù#G~ãµÑcËâÆÔ¯/VЭG/®^½FéÒ¥4 陲F£+æ¨HLž@ì‹ uëÖ Ú™£"qu}ôÒð üÀ~¡Ž#ö uØwÞ¼o³_¨ã"yËÎ/¹ššðÆzt§VÍ4oÖ”3gÏ1ñ7ykÖôÛRå¬Klöb§Z÷îÙƒñ'óáŠåÝ×ÈáC;aõ6%··7½zú³{ÏÞTÏÓÓ“Z5ª³hÁ¼xmŒF#¥K•â…ç;Ç[žØûoJ5ÙªE3‚æì¹ó”.]ŠysßJrlª×„ ëÕ±íÞ·Ÿ°ëW wmZ‡ÉÓ“6]ü“½SW.ï<ìø|u¶¹÷n’´»·Ã8|ä?íù>Þ1ÂĸººR¯QSZ¶{Ž;·²Ï%=ãê-»Üû@õŸSÕX6¹÷Av¯±“'OÑ«O »¿Û•¦íô H§íèØ¡}:,eÎP¯c÷ÎM´éâϦ5ËiùÜ+Žå!ÎÐwàpí)È)¼òæ£uûΩ¿L§Íƽ{)ŸÎ&G5–3L>“!ƒrïž™i3ƒiÕ²ùcoËjµ²~ÃFΜ=KûvmÓq”)S½&N¡ ‡°Ymÿø„+Ù›j,g(V¬(ÍZ¶!Êl¦EófŒ6ä±·UöéJ+Z”E æ%8M7£©^—.¡à^dÊW8I/æ(Õ›d,sä?ç¼òÌÖ+ ½z¤Ë¶r☲»4…‚¸ùºï·dÕ›d4Õ˜ätiÞSÝ'ˆsQ½IFSIN–ã¯S """± DDDP(;… DDDÄN¡@DDD…±S(@¡@DDDì DDDP(;… DDDÄN¡@DDD…±S(@¡@DDDì DDDP(;… DDDÄN¡@DDD…±S(@¡@DDDì DDDP(;… DDDÄN¡@DDD…±S(@¡@DDDì DDDP(;… DDDÄN¡@DDD…±S(@¡@DDDì\[èâ›v|¾:S#"""/îsþa‰†Ÿ‚EÈ÷ *רŸ¡ƒ‘ÌçSÈ/Ñå®÷¢îÆ[Xá™üqø›?YÕjÍøÑ‰ˆˆH†sqq!ŸoA*V­èz@Ëfl[¶nçî[™:8ÉZ¡!é?d»¾ÝmpT°DGgå˜DDD$“E›£â=vØõínÃË/vávX(‘·³d`"""’yBC.r+,”¡#F±ëÛݰ>ˆÓ²Y#À¬)ãqusÇdòÈŠqŠˆˆH f 2.) let s = "weak" let _ = Value.observe_string "s" s let _ = Value.observe_string_fct ~weak:true "fct_s" (fun () -> s) let a = Value.observe_int_ref "a" (ref 0) let b = ref true let _ = Value.observe_float_ref "b" b \end{alltt} The argument \texttt{weak} means that the value can be attached to a weak pointer and garbage collected. \subsubsection{Module Hashtable} This module is meant to monitor \ocaml\ hash tables. It monitors the: \begin{itemize} \item hash table length (number of elements inside the table) \item array length (number of entries of the table) \item number of empty buckets \item hash table filling rate \item longest bucket length \item mean bucket length \end{itemize} \bigskip For instance: \begin{alltt} let h = Hashtable.observe ~period:1000 "h" (Hashtbl.create 17) \end{alltt} \viz\ goes through the whole hash table in the heap. The bigger the table, the slower the program, so correctly adjust the period. \subsubsection{Module Tree} This module allows the monitoring of polymorphic variants, once they were changed into the following type: \begin{alltt} type variant = Node of string * variant list \end{alltt} \bigskip For instance: \begin{alltt} let tree1 = (Protocol.Node ("1",[ Protocol.Node ("1.1",[]); Protocol.Node ("1.2",[]); ])) let _ = Tree.observe "tree1" (fun () -> tree1) \end{alltt} \subsubsection{Log} This function builds a log and expands it. For each call, it will store the string along with its time. \begin{alltt} let _ = log "\%d This is how we use \%s in \%s" 1 "log" "ocamlviz"; log "\%f It is \%b that log works like ocaml printf functions" 2. true \end{alltt} \subsubsection{Kill} In some modules, there are functions called ``killed''. Calling this function will stop the monitoring of a data. This can be usefull if the data won't change anymore and if its monitoring costs a lot of ressources. \subsubsection{Wait\_for\_connected\_clients \& wait\_for\_killed\_clients} \viz\ provides two functions to blocks the program execution: \begin{itemize} \item wait\_for\_connected\_clients $i$: this hangs up the program execution until $i$ clients are connected \item wait\_for\_killed\_clients () : this hangs up the program execution until every clients are disconnected \end{itemize} \subsubsection{Automating Instrumentation using Camlp4} It is possible to instrument automatically a file using \texttt{camlp4}. For this purpose, a preprocessor called \texttt{pa\_ocamlviz} is provided. It is used as follows: \begin{alltt} ocamlopt -c -pp "camlp4 pa_o.cmo str.cma pa_ocamlviz.cmo pr_o.cmo" \emph{source_file.ml} \end{alltt} This will modify the following top-level instructions: \begin{itemize} \item References on integers, floating points, booleans, strings \item Hash tables \item Functions (time and calls monitoring) \end{itemize} \bigskip If the data are visualized through the GUI for a file called "file", data' names will be "file\_name". For example, a function "f" from a file "g.ml" will be displayed as "g\_f". \subsection{Linking with Ocamlviz} To link the user code with Ocamlviz, use \begin{alltt} ocamlc unix.cma libocamlviz.cma \emph{} \end{alltt} in bytecode, and \begin{alltt} ocamlopt unix.cmxa libocamlviz.cmxa \emph{} \end{alltt} in native-code. \bigskip Note that \texttt{Ocamlviz.init} (or \texttt{Ocamlviz\_threads.init}) must be called somewhere in the user code. \bigskip Once linked with Ocamlviz, the user code acts like a server. The default port used by this server is 51000. Another port can be specified using the \texttt{OCAMLVIZ\_PORT} environment variable. \bigskip The server's default timer is 0.1 seconds, you can specify another timer by changing the \texttt{OCAMLVIZ\_PERIOD} environment variable. We advise to keep a timer greater or equal than 0.1 seconds. \bigskip Calculing the size of living data in the heap can cost a lot of ressources and considerably affect the program execution. The computational complexity of this calculus is O(n), n being the number of blocks of the heap. The default period of this calculus is 1.0 second. You can specify another period by changing the \texttt{OCAMLVIZ\_GC\_PERIOD} environment variable. We advise to keep a period greater or equal than 0.1 seconds. NB: this doesn't affect the heap's total size, which is get according to server timer. \subsection{Visualizing Monitoring Results} \viz\ provides two clients to visualize the monitored data. \subsubsection{GUI} The GUI is launched with \begin{alltt} ocamlviz-gui [options] \end{alltt} Command line options are \begin{description} \item[\texttt{-server}] to specify the server machine (the default is the local host) \item[\texttt{-port}] to specify the server port (the default value is 51000) \end{description} If no Ocamlviz server is running, the GUI fails with the error message \begin{alltt} connection: couldn't connect to the server machine:port \end{alltt} Otherwise, it opens a main window which looks like: \begin{center} \includegraphics[scale=0.5]{gc.png} \end{center} The data are displayed in a notebook, in the following pages: \begin{itemize} \item Stats: displays \texttt{Point} and \texttt{Time} \item Values: displays \texttt{Value} \item Tags: displays \texttt{Tag} \item Hash tables: displays \texttt{Hashtable} \item Trees: displays \texttt{Tree} \item Log: displays the log \item Gc: displays the garbage collector informations about the size of the heap, the size of living data in the heap, along with their representation on a graph \end{itemize} Inside some cells, there is a second information which is the last time the data was modified. The color of the text can be red (value was killed) or green (value was garbage collected). Cells can also contain check boxes. These check boxes, once checked, allow to create graphs and lists in new pages or existing pages, through the menu ``Visualize in'' or shortcuts. A list can contain any data, but a graph can only display data of the same type, representing integers, floating-points, percentages or bytes. It is possible to pause the GUI and even to travel back in time through the record panel. The database will store one minute of data by default, but this can be changed in the menu preferences. The maximum window is one hour. \bigskip \begin{center} \includegraphics[scale=0.5]{tree.png} \end{center} \bigskip \begin{center} \includegraphics[scale=0.5]{hash1.png} \end{center} \bigskip \begin{center} \includegraphics[scale=0.5]{hash2.png} \end{center} \subsubsection{ASCII Client} This client logs the monitored data into a file. The ASCII client is launched with \begin{alltt} ocamlviz-ascii [options] \end{alltt} Command line options are \begin{description} \item[\texttt{-server}] to specify the server machine (the default is the local host) \item[\texttt{-port}] to specify the server port (the default value is 51000) \item[\texttt{-o}] to specify the output file (the default value is \texttt{ascii.log}) \end{description} If no Ocamlviz server is running, the ASCII client fails with the error message \begin{alltt} connection: couldn't connect to the server machine:port \end{alltt} \section{Developer Manual} \subsection{Source Files} \begin{itemize} \item \texttt{ascii.ml}: this is the ASCII client, it writes monitored data into a file \item \texttt{binary.ml}: contains functions that code and decode several \ocaml\ types in a buffer \item \texttt{bproto.ml}: contains the functions that code and decode the \viz\ messages (see protocol.mli) \item \texttt{db.ml}: the client database that stores the data and gives functions to acces them. \item \texttt{dot.ml}: contains functions that create dot files (graphviz) from a variant (see protocol.mli) \item \texttt{graph.ml}: a module that create a graph on a cairo canvas, and functions to manage the graph \item \texttt{gui\_misc.ml}: contains miscellaneous functions for the GUI \item \texttt{gui.ml}: the main file of the GUI, containing the main and the functions to build the notebook and export data into graphs and pages \item \texttt{gui\_models.ml}: contains the functions that create the models and refresh them \item \texttt{gui\_pref.ml}: contains the functions that create the preferences dialog windows, and manage preferences \item \texttt{gui\_view.ml}: contains the functions that create the views associated to the models (see gui\_models.ml) \item \texttt{monitor\_impl.ml}: contains the monitoring API \item \texttt{net.ml}: contains the client-side network \item \texttt{ocamlviz.ml}: includes monitor\_impl.ml and contains the server for alarms \item \texttt{ocamlviz\_threads.ml}: includes monitor\_impl.ml and contains the server for threads \item \texttt{preflexer.mll}: parses the file called ``preferences'' (if it exists) to apply the user preferences \item \texttt{protocol.mli}: contains the protocol types \item \texttt{timemap.ml}: a module to store data in an array and retrieve them with a logarithmic complexity \item \texttt{tree\_panel.ml}: contains the functions to create and display a tree container \end{itemize} \subsection{Protocol} The protocol is made of three types of messages: \begin{itemize} \item Declare, to declare a new tag to a client \item Send, to send a tag's value (only after this tag was declared) \item Bind, to bind tags together (optionnal) \end{itemize} \bigskip These 3 messages have the following structure: \begin{center} \begin{tabular}{|c|c|} \hline command & arguments \\\hline\hline \texttt{Declare} & tag, kind, name \\\hline \texttt{Send} & tag, value \\\hline \texttt{Bind} & tag list \\\hline \end{tabular} \end{center} \subsection{Binary Implementation of the Protocol} \subsubsection{Tag} A tag is an integer coded on 2 bytes. \subsubsection{Kind} Each kind is assigned to an integer. This integer is then coded on 1 byte. \begin{center} \begin{tabular}{|c|c|} \hline & \texttt{Kind} \\ \hline \hline 0 & Point \\ \hline 1 & Time \\ \hline 2 & Value\_int \\ \hline 3 & Value\_float \\ \hline 4 & Value\_bool \\ \hline 5 & Value\_string \\ \hline 6 & Tag\_count \\ \hline 7 & Tag\_size \\ \hline 8 & Special \\ \hline 9 & KTree \\ \hline 10 & Hash \\ \hline 11 & KLog \\ \hline \end{tabular} \end{center} \subsubsection{Name} A name is coded into two parts, the first part being the string's length on 4 bytes, and the second being the string itself on \texttt{length} bytes. \begin{center} \begin{tabular}{|c|c|c|} \hline \texttt{Bytes} & 4 & $n$ \\ \hline \texttt{Value} & length ($n$) & contents \\\hline \end{tabular} \end{center} \subsubsection{List} A list is coded into two parts, the first part being the list's length on 2 bytes, and the second being the elements. The way the elements are coded will depend on their types. \begin{center} \begin{tabular}{|c|c|c|c|c|} \hline \texttt{Bytes} & 2 & ? & ... & ?\\ \hline \texttt{Value} & length & element \#1 & ... & elements \#n \\\hline \end{tabular} \end{center} \subsubsection{Value} \begin{itemize} \item Int \bigskip \begin{center} \begin{tabular}{|c|c|c|} \hline \texttt{Bytes} & 1 & 4 \\ \hline \texttt{Native Int 31} & 0 & $i$ \\ \hline \end{tabular} \end{center} \bigskip \begin{center} \begin{tabular}{|c|c|c|} \hline \texttt{Bytes} & 1 & 8 \\ \hline \texttt{Native Int 63} & 1 & $i$ \\ \hline \end{tabular} \end{center} \item Float \bigskip \begin{center} \begin{tabular}{|c|c|c|} \hline \texttt{Bytes} & 1 & 8 \\ \hline \texttt{Float} & 2 & $f$ \\ \hline \end{tabular} \end{center} \item String \bigskip \begin{center} \begin{tabular}{|c|c|c|c|} \hline \texttt{Bytes} & 1 & 4 & $n$ \\ \hline \texttt{String} & 3 & length ($n$) & $s$ \\\hline \end{tabular} \end{center} \item Bool \bigskip \begin{center} \begin{tabular}{|c|c|c|} \hline \texttt{Bytes} & 1 & 1 \\ \hline \texttt{Bool} & 4 & $b$ \\ \hline \end{tabular} \end{center} \item Int64 \bigskip \begin{center} \begin{tabular}{|c|c|c|} \hline \texttt{Bytes} & 1 & 8 \\ \hline \texttt{Int64} & 5 & $i$ \\ \hline \end{tabular} \end{center} \item Collected \bigskip \begin{center} \begin{tabular}{|c|c|} \hline \texttt{Bytes} & 1 \\ \hline \texttt{Collected} & 6 \\ \hline \end{tabular} \end{center} \item Killed \bigskip \begin{center} \begin{tabular}{|c|c|} \hline \texttt{Bytes} & 1 \\ \hline \texttt{Killed} & 7 \\ \hline \end{tabular} \end{center} \item Tree \bigskip \begin{center} \begin{tabular}{|c|c|c|c|} \hline \texttt{Bytes} & 1 & 1 & ? \\ \hline \texttt{Tree} & 8 & \# nodes & \texttt{Node} \texttt{List} \\ \hline \end{tabular} \end{center} \bigskip \begin{center} \begin{tabular}{|c|c|c|c|c|} \hline \texttt{Bytes} & 4 & length($s$) & 1 & ? \\ \hline \texttt{Node ($s$,$l$)} & length($s$) & $s$ & length($l$) & $l$ (\texttt{Child} \texttt{List}) \\ \hline \end{tabular} \end{center} \bigskip \begin{center} \begin{tabular}{|c|c|} \hline \texttt{Bytes} & 2 \\ \hline \texttt{Child} & index \\ \hline \end{tabular} \end{center} This coding allows to keep the sharing. Tree coding example: \begin{alltt} A / \textbackslash B C / \textbackslash D E \end{alltt} \begin{center} \begin{tabular}{|c|c|c|} \hline \texttt{Nodes} & \texttt{Value to code} & \texttt{Meaning} \\ \hline \hline & 8 & Tree \\ \hline & 5 & \# nodes \\ \hline 0 & 1 & length D \\ \cline{2-3} & D & \\ \cline{2-3} & 0 & 0 child \\ \hline 1 & 1 & length E \\ \cline{2-3} & E & \\ \cline{2-3} & 0 & 0 child \\ \hline 2 & 1 & length B \\ \cline{2-3} & B & \\ \cline{2-3} & 2 & 2 children \\ \cline{2-3} & 0 & node 0 \\ \cline{2-3} & 1 & node 1 \\ \hline 3 & 1 & length C \\ \cline{2-3} & C & \\ \cline{2-3} & 0 & 0 child \\ \hline 4 & 1 & length A \\ \cline{2-3} & A & \\ \cline{2-3} & 2 & 2 children \\ \cline{2-3} & 2 & node 2 \\ \cline{2-3} & 3 & node 3 \\ \hline \end{tabular} \end{center} \item Hashtable \bigskip \begin{center} \begin{tabular}{|c|c|c|c|c|c|} \hline \texttt{Bytes} & 1 & 4 & 4 & 4 & 4 \\ \hline \texttt{Hashtable} & 9 & \# entries & \# elements & \# empty buckets & max bucket length \\ \hline \end{tabular} \end{center} \item Log \bigskip \begin{center} \begin{tabular}{|c|c|c|} \hline \texttt{Bytes} & 1 & ? \\ \hline \texttt{Log} & 10 & \texttt{Float} * \texttt{String} \texttt{List} \\ \hline \end{tabular} \end{center} \end{itemize} \subsubsection{Command} \begin{description} \item[\texttt{Declare}] ~\par \begin{center} \begin{tabular}{|c|c|c|c|c|} \hline \texttt{Bytes} & 1 & 2 & 1 & ? \\ \hline \texttt{Value} & 0 & tag & kind & string \\ \hline \end{tabular} \end{center} \item[\texttt{Send}] ~\par \begin{center} \begin{tabular}{|c|c|c|c|} \hline \texttt{Bytes} & 1 & 2 & ? \\ \hline \texttt{Value} & 1 & tag & value \\ \hline \end{tabular} \end{center} \item[\texttt{Bind}] ~\par \begin{center} \begin{tabular}{|c|c|c|} \hline \texttt{Bytes} & 1 & 2 \\ \hline \texttt{Value} & 1 & tag \\ \hline \end{tabular} \end{center} \end{description} \subsection{Architecture} \bigskip This is the architecture of \viz. When a program is monitored, a server is created, sending the binary data on the network to its clients. Each client will decode every binary data and store them into its own database. \bigskip \begin{center} \includegraphics{archi.mps} \end{center} \begin{thebibliography}{99} \bibitem{lablgtk} Jacques Garrigue \emph{Lablgtk}, an \ocaml\ interface to Gtk+ \url{http://wwwfun.kurims.kyoto-u.ac.jp/soft/lsl/lablgtk.html} \bibitem{cairo} \emph{Cairo}, a 2D graphics library with support for multiple output devices \url{http://cairographics.org/cairo-ocaml/} \bibitem{graphviz} \emph{Graphviz}, an open source graph visualization software \url{http://www.graphviz.org/} \end{thebibliography} \end{document} %%% Local Variables: %%% mode: latex %%% mode: whizzytex %%% mode: flyspell %%% ispell-local-dictionary: "francais-latin1" %%% End: ocamlviz/doc/manual.pdf0000644000175000017500000074534111251725051015012 0ustar tonkartonkar%PDF-1.4 %ÐÔÅØ 3 0 obj << /Length 1203 /Filter /FlateDecode >> stream xÚV[oÛ6~ϯÐ#D,I‘¢ôT¬Á$bõ6md[v¸È–§K‚ô×ïJ¶µkúd™<·ï\¾Ãw‹‹7¿I)Á³L™h±‰”.¸U:²¢à™Ì¢Å:úÄîV宎ó‚=º¯ñ—Å-(å‘Ô<Õ™B¥$×<Ó2JRÃu¡Hév¨]µ“Teìf'ʲªíñÀ²r¿¦›ëÁÕu9ì*úûWœKÖ­Eœ+Ö<ÄF³²íºŽ¬á…Í¢Då\hM®>T‡¾ÚÅ`wtCŠKò¦D,™((t¥"i¹’FûÐeVpaŠ(1Šç¹!ƒWB*Y_ÑOç= ÀWð" NeœH© »!™¶_’­‡Uï@›²d#)yaŒÏ諌«ÑÇ|Râ&ç¹” å¥]È %þH¶i«ŠºfÓÇ*gO¿lÃéfد«5É.ñ晾oË}øÐƒ‰žN¯ÊƒëËš.ž\ïötÑßöÚrW=¡Ÿ¦} £fsb󓄈è ­CëŒn´—Ãn‡¥Ñ"eï1_PتUÏã$Ë4» be]7òSG¢=ãÀï]³w}Óºý–d!ˆ™L+k}!wwKôâÑF&-ä}&áR(hù|Ô:´ÍPw!(hX2Í™(C-}ÖC¡¢‚Ì¦Û «¥a½Ã.dz±"x:tŽ1Û3h¤U\gS'ü_ßd‚ƒÝQºv˶lŸq’øœq­y®ÒŸ³½*ƲîB掇[Ð tt]†¦9—RŸwʺZÛ­OÎnßxSMÍçÆöÅ,ªi;èãº<Ž ª‰ GøÍŠR|â÷mÕVÿ®s}ÕÍ!GMÏB°=5 ª¶l_!NðMmµNKEÇ–KÅYiÓŒ3•ö³Pf¶3SHÓ$•r -H1Kè`Õì®®BXE¨ Ì•. Ò(p*]ÈYšn<½þóæ’Žžýˆ\¾¬¾`¶BÄ~V0‚­rË~/—õ¶Ps¯³ã(~¡â6µ£”B„2QdýÓ±’'}›ñt²úv¶WyzÌì4•ÓÚñ;êÔUéÚ&iÂ÷7Š$ržYóC¦”°BEžÈ%l¸µü”Âp™šW`Áº*q³!` Ѻ ¬œcm»@Ëi–Bñ^ð2ñ‚ƒf÷Óæ:Ú”;×!]†¼k™Ú†ÆÊ<ÁÖ&C²GCwË¡?S·Ø_/Õö Pex L¤qtU­9À“Œ½Á}>= jÁÖ®;Ôå´ä;¬œŽîŽË,—YÚ¿¦vÇ?c?çìº-÷hiÐßÍNYÁÓWUŽŒyj7nkÇ¢x¢P§"wPƒ‰+æé2…—ìž0–#Ï^y+ÄÕÖÀë ÙÑW× íêû jÉØß¡2ÔHXô€ _IæM…'ܪÙRo‡¶[©¿Óª_Œa*`µ(È(Èêç•g"KÎtòñ 8%êuÎvåÃ{ù%T­Xmx¹ÂÒlÃø…–øÉ ×Aƒ•™ЬÞï°S¤ßµ yñëââ?Y%  endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 595.276 841.89] /Parent 9 0 R >> endobj 1 0 obj << /Font << /F17 4 0 R /F18 5 0 R /F22 6 0 R /F30 7 0 R /F34 8 0 R >> /ProcSet [ /PDF /Text ] >> endobj 12 0 obj << /Length 1806 /Filter /FlateDecode >> stream xÚ­X[¯›F~?¿å¥X©÷°7Rõ¥QS¥RšT=UU%Q„Û4\Àçôô×wfgƒÃi%OÞËììì7ß\ð7W×Ï„¸a‚kÜl#£ K¥nŠàu(WkÎ…ïËnµ–F‡/²f%yxÊêÕÛ›Ÿ¯Ÿñ$àœ¥Z <k3‘¸ã7ûrµVp¾hWkaÂüt(› †l¨Ú†öòÌ 6VÆØ¶§¦ a6Ðï°÷êºE5wU³s2EWöý²Iª©M2J™I8ØfmÚÃñÉõu›g‡ú¶ú—Õ]ŶÝ5ž Ö^vÍS*¦E›_¿h›jh»w}µcnÌöÃanb–Àawa‹È% žßÓ8oǪ¶Öãô®ö4²ot‡ ÀÉ.Õ!{¿Iè¶= pªÃ7‘ކá´}‡7aöŽª)Ê@^Äa»Å_㮃…‡„{wU]Ó=D&Àd<û&âª.ôzŠ„‚EIâ‘°<›NX¤ÔY¶¯ŠùM_nJ€ur< ¯ÑQ˜/;‡)a¼ àÆ‰a (&UlÅUÉL*a Y;%ã. ž7ýÐY° r¤™ÆÉS¶ì RÖÇ‘O<?‚ñظø¹C_´„B]mº¬«Êž¦Yç@9v-ãà*|D—OlÖ"b2NüùY„‡³DޱòÒÉ2•@8Wx¹!ýJ粪¡-2ó~•ðÁ1­ÂçíœúÒËê¬;x-íæÔe>8Ë|ô%DXdCænÏ·#Ý£9Ïq‰éƒÇˆÏ®Ë81psßÒ2YCkhÍ·0‘iØ) 5´G9Ä=xáÕ7W_!J€s Ó„qŃ˜Ù9òÃÕë·QPÀ&˜Æ`;¸³¢‡@2ÍŒêà·«_¯~Àü;‡_EœÅZ‚.ðè²ïö]™=ÙááµÖA °Å|ò‚Û Úf`Œv[ö2Ÿ„`Ò´ˆ¶Gþ´Ý{š^ƒ®v’Ö·°Õ@V¸õYæ”Æ|ª@Á-ý/@bâ \÷¾˜zM1k/í›oö]µÛÙxšfªŸž2<sXåBbŸ½÷и BZ#Ë 5#+pbß»|ÛýPú³VYQ²¥¨Z»PY É"LŸVr‰+¨?ý:ŽX¤Íq‰kÉ„I­S–èdÆ%h#µ h~¢_Ïw3å™Álk0Œú}{ª ’=×kcépª¶ªN6)*ÏÜ¿Ö.jÎÖ¬FóðVáó…>_€ßPá/íPÒ²­x`næ9/bÜŒ•çåæ/È-Õ-„Äô4{ rGáùX¹Ï‡6t%™eÃWJðvœWX0“ЭaⲯÐO/žw¦jßÖ'_aMèW3ÇÍlÈ1N÷.°ÁBÅóþç*a{¢ó{Öcd"Ï]Ñȳº^jŠ ^&\_’U­KÀ@1LÌ´jFm·¤–',‰?Ns)RˆhA‘ýÍã”Ïi~ÑÞIÁŒŽ­.Îiþà{À9‰Ó.`žîmF«|eƒÔ)`íÊÌíŠ*Iñ°dmÛl"ˆow‘û¤Åýi±)I@ÛŠT‡Ëo‘Y±óÍ‹êÚÓnÙŸÀ_9ÿþšdè>uøÌf—v°»Ëš¼\üª…fSF¾©w®­Ëw$dNÓïéç`…%“åXCqñáfg@·GK õ¨÷IMõYÜA©SwÛ‹ˆ¸ö6_ÒQ¢¯új†>ØóˆVwgp9­šIš©¥€Ð|©È@h ¦=¥…/ºÿ¨¼° endstream endobj 11 0 obj << /Type /Page /Contents 12 0 R /Resources 10 0 R /MediaBox [0 0 595.276 841.89] /Parent 9 0 R >> endobj 10 0 obj << /Font << /F22 6 0 R /F18 5 0 R /F34 8 0 R /F35 13 0 R /F30 7 0 R /F17 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 16 0 obj << /Length 1266 /Filter /FlateDecode >> stream xÚ­WÍŽÛ6¾ç) _*71#’¢(-ÐZt(z1rI‚mÓ¶YZHôîfyöÎp(YrÔÝMÛ‹Å™!g†ó÷Ñ¿¬^½½bÆ9Ë•³Õn¦ÅL+Ír©f«íì}$gr±ä\¨èÏz±”<ÚžJ ­¢Õ"—‘Ù/>®þx{ͳ¡žx¶‚ñT“šÕŽˆ\DGÐ!tÐŒÕ"¨Ã¦,ëˆï[¢75®¨‚´µ.ðë]°©‡6E,˜„eL6ÿZ²WÜ¡³ ~5ÇrÊÓØa7÷_µ–vaXÀåTJ ³ìCE6«°¨½AgŠª3ƒô"î*ðŸ.Ìt{ðnñÅ­¼„Bc1dREט̢̯j©6öŠ¢.“aÔ9¤*N H4“y(’ÒºÅRq>BL÷´þ‰>+³gX p–X_1*W®9y:‰¾nêSåzl¸µMQo¯xÇ´eîLPkÌñ¶´óîf"cY..üx SަùLÌ^Ó‡XÅhóêêýGðH>®^é——*M1_3âqö†)ѯ‰âßXT_bqÞº:m>Õ"ËQ¶²AK'‰¯µa5<”(ÆáLè+7=&gJënÓ D[ÒÊ—’>¶´GKÛ°ê5ÜÙß&¸ò-ÐâÜ{HMö °ðé\ÑŽ®7[¦)K3>Îê}Qb7ÃT jˆ€©€#Án±/Tú¡] ,i MùoŽƒÖ¢µŽm4œ; äÖlÐóQÚ7SãP ÅtÂûq¸Á˜åÑ]ñ8• •³äœ¯=9hƒgîÐÔ§ý!̸ R U6ª¶Â•ö Ê¢Žã¯_g°8Xs‹E-º‰¼u±ßû¨Ôyã0ÙPü2íf"lå<*¡ã1Ý=RÑmSïs GۚěºiÊɱf¶ŸN­Ã ÖéÅ—icÀ1t‚"É×äLþ 9ßyäÄqûìÄú:½O`ŒðR‡…Ö]"4yôV6îI¯¼é–ø÷…;ŒN§Ñ®îôâéÉÒ‚»e| i8Ÿ@Ú$Ëû‰0͉x4w’X2%Sˆd(ƒçCÌõ”zXf²÷© ²±PTí¤î°Tçߣv©:¼K°LÂó X¤Šñ 00/pã»nHz©$êÒšêÿ¾'!BKM"C&dÊ —hÃËá~©˜Pj =>튀ßS?ŒÙÓw3¸wX߬^v𨹳7»v³Û¸ñË@œ_;’6'"ðîTáØÃ¬-ø GÀ‚ðä[¢98¿·æóüÉwÂ37¢ätØœnÿ»ÆAÐÇÁûj’²¤†áIFáQ!<àÌ71á™§**wÓØå¹$¦çÆÏÆ}=²»§¡ÙûoƒEuön¼[?ÿ~ÿ%Š#ÓìOÊMõŽVLA½‡¦Ä¤L¾¤2ë~×ѯތëVÁbDú¿¸À‰’E[Î?Ãé¥a·AE„ô!Ô‡<5žƒÆ~kÎîM³6{Æ LöTŒc¿Ø±¯3 ¨9L. ÿGE9E¯~[½ú£û´« endstream endobj 15 0 obj << /Type /Page /Contents 16 0 R /Resources 14 0 R /MediaBox [0 0 595.276 841.89] /Parent 9 0 R >> endobj 14 0 obj << /Font << /F22 6 0 R /F18 5 0 R /F17 4 0 R /F34 8 0 R /F35 13 0 R /F30 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 19 0 obj << /Length 1149 /Filter /FlateDecode >> stream xÚ­WKoã6¾çWHEÄ©÷í¡EƒnÑÝíÁ·ÝE!Û´Å,’7=ô·w†3²­@i“E.9ä çõ}ãü´¸zs«ÔLJQ$‰š-6³LͲ$E”ÌëÙ'/R$~ ¥J¼÷Ö"é­µ†E–x¿–]僤/— ú²øíÍ­Ì/­…³@)!ÓŒŒ-*Ó¦J½˜RÙ` V§]6>ì{Úö–Žw¶ñ¥gzÛò3Ùå32‹D–ðœ{æãò«^õæÞy™{?—»zÊ9†"‹ä Ua0ô(†Ó ?ˆ£Ä{ן<ÀçÙ;ÒoÉf^Ú $/LSXÄ" 2ý9”Ù¤RäO:@ÏÖºÙö,þ&¡KÎaç«Ü[B sO·th7ôÕµÞiJ!ûjšÎ¬Ùø}ñ”“Q°cDþ’ ʶ-ññzæI÷3ç~öÈ}Ø7ZßÝ‘`ˆë[<QúÿÇ5Èìnß_„¶<¬pw‡4äúuó8Ù  ×µi¶tÒ–½~å$Ô¶ÙꮟŠpTÐ× ÖþO‚íB¨4™Q*¢4&í[?Wžm™Gš®/›Õ ñèU%¢0+™ˆ 椟IdâUø‰½h‡Ôæ2/€wì²Ó-Ò žü³×­±ë·@!©Ì«9a‡;Åe-V­Æò¸ 2;÷똹‚)—>®±ò»7O%/ E¬Ò!y[¢RÄK,á­=l+Ü0hPz¬l­IFå®Rg¡Ð4ƒ6+TºÜfa¬Í²¥Ùn#ËÎÈ reá„®Lìa ¡â”üìj‹U=úÐ:zßÚm[înh×1ë¯lÛ“׌¸rýõ0ô&kfÞž±jx¢ÊØxªÁФÙÅPKŸj ¿ˆ¼V?ž©"Ï3”5‡Ëœ¿tÓÍbÜ#»à—â°õÃζûʬHzï' pªá¡ØÝ ®A‡Ÿì>ЊËr£ª4¯I`ˆX­+P8.Í© ;¸}"¢<Îò£ê÷ýÞárøq0Ì_ìøæ¿]OyAÌ|ÇêgÝØ« ”¢,‰PÉ7“BÀÚ“¤Ð·è¥–#ßæ´r)¡Ek±èóÉ\Îo>¹,«0ÀØã\;ÅK­˜µê}A¢ø~ªFO멱^ ‘‘27¼;8ŽŠTä)ÜQ¹È õ(æ?GD¸(G€íÀó¤ò‚õàlshÎ{÷–Û?’9§q¦Á1>O4ø¥£ôw»}6ã0Dgà mh·<˜z¿'ŠÂ+ITƒA·(›5-ô_{X³¾éüÒ$=÷‘»R¬ÈÒ 0ŽÄ' ¸Nަ†LÔ´éæš–Ä–NFî^Æa;Uê£~2™žõf§Å‹GÚ¸’.d7¯®×\[—/ц =’àÈ•>tÜl×|Ã4ÞËÏužƒù9Û·8À`xÍ©#cÚ2ÇÈ΀Þõ†´Þ±ÓƒK×K†`Uðt޶½ëJ¸HÄMM'ÜC’{攡:vN‰Ù‡IŠ—)´ `"€ÿ)ò‚½ñæÕ/‹«â,O¼ endstream endobj 18 0 obj << /Type /Page /Contents 19 0 R /Resources 17 0 R /MediaBox [0 0 595.276 841.89] /Parent 9 0 R >> endobj 17 0 obj << /Font << /F22 6 0 R /F18 5 0 R /F17 4 0 R /F30 7 0 R /F34 8 0 R >> /ProcSet [ /PDF /Text ] >> endobj 22 0 obj << /Length 2119 /Filter /FlateDecode >> stream xÚ­YmoãÆþî_AèCCц»Ëå.A€Ë!—8Ië6u[ IÐeG‘ Iù%¿¾3;CJ”i§ÉéÃöu^vfž™¡¿¼¾øì½R”"5F×›ÀªÀ+Rm‚ëuðc¨…n¹’R™ð»²ª–?_ûÙ{éŽïDÁJ)!KW.ëåJvͶ Ñ¶Y®” ×ûªè>Å%öwEË»Ù0Øìë¼/›º£ižUU±¦ñORÇJœ/Äre¢4|»e}KÛý]ÙMiÐì%&aúf7œ-P ”ZÆ"Ž’zÛÔeß´D2Õa³¡ßŒ~ÖYŸçD'á51ƒÅ<«ipãõC5Ò8ÜwÅfïùÂNÉdëHˆFK¸ÓÔŸôL §wY}Ë6,X`/Å!z)þâÁà€x0ñ^ W‡xžø”¸ÇiÑ>Ñ”q]Á R d–I©E¥+ÀéºìNIbÍÛr‰œ Þ~*»‹}-9¤æl®Ü„ìFFöõ€HR9 ˆ)3 ®ÈIOKƧßë¥Â\HŽÒ•ݘè‡b kCkÃèQÖ4ʸLØ4TàîÝ›¹‡X!â¸ÔLk/\³êrÇ*Ç_®v;,°£ sûù.û¥9¶ƒx &Ùa‹5=œØµt~Á%ÇÅ’º ÖÞ70Å/›²*Äv¶O]Å8˜Š§*p;OÁÝ"<ÆÐ°–›'®°†"ŠŸ ʱ±¿‚ÎrU1xT´DAD%Ú|AQnþL}õC±Î¹Î‡ÚÐÃZ–°ª¸-ZßcÃ4Í)è/%Ãë§´J½+*ìàVEV@‹áõ¼¹ô›¬»ã§ËÎMC…Dzõ9¤/·lCj¤9ì»Áâ5èÎ}³O7A€²@è ·—Ø4ËÁ'¤ZzX¢| 1öº}†YþæMbÞ6ûÛ»“»_á]ÒxãáÉÐ|W™>†ÀxA 4’L=ûOh§Î¶Þ/äèÌ@fø8A Y@©tŠˆLï9´¥˜Âu ¡@ˆ¬û¨\ŸZpt¤bá,?$J»`€òF#8Y³í®*ØA³iÏCG›/·Íöè¿~Èàƒ·€‹i€“Ó»ð¼wUæ¿¶` 2ZFFxîÛç/ÃÓÄê,/C—j5}šÍâè+ ¦ „ Êg<Œ 㡎P\D|_ÖÆêà¡ìïhtõJ 9ùxwíí@Pµøƒ¼Á6Ê"‹ái{ŽéCܘK'€Ý:Šg’INÈ¿¯ËÇCr¨Ê›£äÍeßl%cñðù¤¸ ‚¡ûb6!¨(õEÒDŒ²|=¢/FMY£ ‘bý‡”3$«õ8«×ã¬bJI(ÏÓ?¨˜†¦ÄêyÅjÈ ”®V£nÞÝ‚tƒ+þ­é±é³XWgýœÚÔvãËöe]ösÂ9ð×x¬š©ÁyöšN(ý„ìÌ77ˆE F”ЦðüS)Ä)¨â–¸§ä.²u÷¢BØA,’ô^Û¥÷ÿgñá1n pŽÀÕ}W¾'°V©êÁ Z¿‹/[ñ *8”FÕ^ôb¿DÁ‹££à…§à~Ö‰ŽŽâ§YîûrO÷Ã’0Õ¯Ó\ã® q^i¨¶øÀºØdØŽU=ÍwcÒö#O–"ñåÆß,¬b~ EKóa*ê(B 3¾­üëmpMäyÂÔÑWV[ ¨Ò©"/1¹ÝÔЈáiþ›Â©7i¨7õ!t¯Þ½ýë÷ÿ¾üïL:Qø‰;ÆD­?Ê…c­HéiiÍ)âïW?\Ϲ®²Â™Ñu©é»/Û¦ÞrïË”ƒs‰›¾úýÒàט2»ñU#ùž‚db¥ô ¯s\·™Aãÿ}Jrò endstream endobj 21 0 obj << /Type /Page /Contents 22 0 R /Resources 20 0 R /MediaBox [0 0 595.276 841.89] /Parent 9 0 R >> endobj 20 0 obj << /Font << /F22 6 0 R /F18 5 0 R /F17 4 0 R /F30 7 0 R /F27 23 0 R /F34 8 0 R /F36 24 0 R >> /ProcSet [ /PDF /Text ] >> endobj 28 0 obj << /Length 1421 /Filter /FlateDecode >> stream xÚ­WKsÛ6¾ëWðjÆD’à÷ÚyŒ3Mݤj:­ãMÂÆ$¡ð!'ùõÝÅ‚4¥0MgÚ‹,€Å>¾ýºØ¬ž¿â©Ã9Ë„œÍ½“fLˆÌID²P8›Ò¹q7;¹öÂ(v;ÙÖAâÊöYG’RÞçCÕÓ¤Wµli¨ìºÏøx´ÐMÙÁLp÷ jÑ-yc÷ì×j/Ôý”$n¾æn£û©MÜæã%‰{·R÷‹U‚wy³UÍv}»yãx<1žx¾’G‚e 7º¢4£›}ùþêúYxœ–Èg Ý(tö ZÝÔ8N]“îÖB¸y«ò»J²µ%‰ûÇ: \IËyyÀøAj8‰|·×ô}0i•{šåvq µïn[™÷4á®¶BùiÈ+lˆr&øi´Mfƒp……3§Æ ‹‚Î\æU1T˜DJlfújF›{’Tê0m+ó>§UÕœÜÉ|O#Âì)tד(·ªt¬»•]§‡¶Ý×”ãѦS¥÷}„É‚˜ÌR7ÿèóP=ÍÈ"ì[½móš&ò³„œC¯t)‹…oË Ö ]ï‡>Ç%ˆó$ªägÕc¾ì5Æhs©:ÜÛQi5X, Åþ±­×}á7ðá,ƒ,q!>AšA]™24ÑŹ±<È|×`m¨ñn»§¥4Áœ¬´‘›j|èHha©¦á„ä+Ê&"Á‰åV‘¶òøòG… :‰ë£”3É[‚Ü+Rîþ¹†C@‰°À€Á $ŸØ&ßš…Ò»1¨iÎBFò=ÆÉ–¦üÇ”ñŒ¥@ÄqŒ<Áÿç@À™žC]AÐÕ¯/. c&âôÿ¹¨+€*9ºôˆŽƒz±Àt¶æ"?c±ˆŽS[Ó>,´8AŒ¡, ‘"ëÁ BÕÙ±a@øÎwà']Ê8,>‘!L´ýšS–÷@H¼ÏxÏØòËŹ½|·\™%Ý'»æYO :ãôÔPD@ìfz1Œ{Ý f-ÏHú¸S„Jš*»y+­ª¼(t[^ú>µz+Ç^À(cAí‹A×5ÓC@dݘ²ú „ûAuõuª…·ºQ½n§ù{ÙAÉwɾé > endobj 25 0 obj << /Type /XObject /Subtype /Image /Width 517 /Height 568 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 29 0 R /Length 32950 /Filter /FlateDecode >> stream xÚìxÔÆö·ÉMHòÝûϽ€ ¦Ù¸7 `À´Ð{3˜j0„ÐLï½÷^C‡Ðzdn°± î½w\c›ºßY E«ÕW¿ó¼ŸÑhf4gf4G3GZ—*õ©þ‹1)PJ‰ÔjeBgÇÝ«>Ù£æTÏZtšçi¶§9ŸfþR ‹‚Q7m'=©9æ®ËuóßÎÐU†\6¥©ž&üþǸË Oxøó¨[6C/YüzÊQwP¹|¢ý¥ ¿fÕk÷ßÁªžÑøû?>gÑÿ˜ ¢Î¯åŸä<3ÏPv*DûKsr5&+@¶Àغò¸;µF\¶u>hÊeÖ®ÆÁ7îÚ3€R N½ý¾³]©–g(;¢ý¥õÙkÒg·1ÙbìÍZýš÷ÝgÊ2cGc¿… }çÏ?=q"7€,WòŸH»¾z{=gýzÚ8ÏPv*DûK#z훃JÕ*Œ¾V»Ï.3.d ܧM»:`ÀáéÓ™˜4Z¿þꦩÌáôíM׬áå€Ëè#MïL{›ôñÓúKáQ‡›Í¥™©ž†w>Ó)S»Þ®'³û2É3” )Í~¨¾š–Ö~ieÅŒL )è±Å„l1êRí^Û̸x/Zt¸gÏMz\wq™¼®>Å\Ý2ÃoÑ¢³fm]׋_Ìží=eÊÅ¥#x`õg³Œ¬—i™É.szUodì4°GJjrjzÊí¿ÁÕÙ©¾£¹H2fu,žH–Ÿ{êýñ`vŸÝ¦y†²S!"¥Õ¨/S"t*Ï¥±ycK#7|1#Ï×î¹ÑœË“úŒXTkÒª>sçú-^¼c˯>sæx ÎÅ}øpï3¦lhÊË qÇÿ ©sÇ›ý\¥n'šr篙B1'Ïë¼ÀŒI³õÆÌˆdÿ÷ߥ¾IÜ~k›wßÝ¥”òóçOéo“oø°ýËød6¥Lzóáãû¨—ËÏ ;å¾=5S¾¡¢fïÍMY»mλìOŸ?Û݈‰wÙݘß}Èþmg]& UŒP¼уàgGý·çôÜd–g(;"RZ¾å•™:•ŸÒ(Ì;)è¶Ú”1#ÎÔî¾Î\çÓ§{ŽK¶àÙ¨Q˜Õ¨ÒÂÅ<1#†›·kdÝÀ°~73û®f¶ÚM6g²×íZÍÞÁ¬¡£¥IKK­Ñܨë2‹/Ï9kÚ44jâlõeüK­-ª5êm™» øl^«JǹìTï<¡3ƒj6«Öe‰yTr¶shE%p7”èŠ,FÎqÎÊ΢5ÐÄöK<,5:ëo¹0·ËB‹}ž &ß rqq6ŒÂî¹¶à©‹ËÆŽ§o¢,;,i¯S˜©»~7ó3ä1ÎËQLRr’±MeZ/°ö¢n'³&ýÍÛO±l1Ì¢ù‹i8ûF¸¿ÍΤ¹Ï0©^¥Ù ¿ŸùÉÄ4ç:Ðáß& q îTÿÌï1…»:µ¾Ì‘Ÿ> øºM¹i¨z3wÿšó>ëóçOã&¤ÖncÒ »9úQÊØ´.¿áؼ¶,ó e§BDJ³im@ƒþªŒT§4nvVËQ,h?Õü«9°ë4ÇB„•CNVàDŸ>»ýú+c º¤Gñ¼@šÜôš¡pÝ:vò™M4c¡bnnÊ‹ öoPß>,ȯ`¯U¼šª¬#††Uû:û=×({… ¢#´V;@£ÊD‹@SMÓ&¿§gȯ1GÜI2º¸èçÔ{Ó†µ¼È¥‹ŒpZà×*^MÕ¬[¯÷o¿èÓ«§Î¨( òi\÷ínݲÓ¢y³?÷ïag’¤ØˆÓ&›šš pîÀf¤»º­Mùòú6¼çºà”·éî­kµjýœÉÆÄG‡Y[Y¹?¾Ç-óÔñÃöõêR¨[7m¯€×ÓG=ºw«\¹2=3wíÒ™&X^n€+âí x-e“SèS©R%6~õÊeÔ eË–UV7ž "ý¨²(¢Ã'Ogjbbdh¸jùñ¶ì/@‘™ƒ”ø(è6§›·v­Z×/Ÿ§Ã‹gOQ˜b(žI°pÞœ.:úx= 2ø·Ñ#‡³û÷ëëëí¸`îìfM›°ñ¼òÅ+  ‡Î\÷îbwnÛìÔ»'¯L“ƒû÷ÄE†<öÄeè`ñ Ô«[çüé±ÁáA~Æ8À™—@±ª[6®ïîØU¼¯¥¬q4…[%ÆpËòõRÙGlvñ~T§(AfNŸJ=EéÂ|'Ž+^ˆ` |šú»ù÷u=»;Ê'á.iäÎ$ô ÷äá]&ðÂÓÜÜŒÍð‚ Ç„éëë¬9 ÃÄEë×·¿yõ"¯LkëõkWÑ´#rEÁ P…éÙUÜœ=u¬q£†4¡‰·ƒ2s Ø8y64]4°Wîl¼ßs6™H©“FÍ¢5¢eÅÓGwyÕVVˆ`´ÊЛ……ù¾Ý;è/…¹3 ÝøÜm‡²eˊϺeˆÍ›^8s’§nß®b™·®]êáØÍÄØ¸fÍÇ»ŠW€–?­[µ¤leŠp3>¾‡VIÞnlŒ²v(ÔF`/Wµj§>½hj,P>R³5ín==½„è0^µ•"Ø_€"3Éq‘"ÐÝÊ–,œOwñÒEóyñ6ÖVô8'’‘wH…D‡2á`?o^28rp¿C—NèÔ±ÃÉ£‡”]:)6âÄуô*^+KË}»w†ùRúð ?6^1@³n»ÚW/žå^EY;6‚²ÆÑeyñêô‘šý¨iwÓꀼÄâmÅë/@R æ@Yüâóº9tñp»úà¯ýû9‰ÏM~i<î,šiBèÛ§w~ÌÍööõvmßÒ°A}ÁkQeÝ»rüÈŸ&&&â0®VíÈŸûc#‚Ÿ¹= Œ"æ y³¦;·mæUFY;hƒ9P§ÔìGM»{Öô©]:w|áù$4Ðgâø1â…ö ÍA„¹÷µX|bLØ’…ólmmÊëëÛÛ×Ý·{‡`Föð¯›W7j¨¯¯GY6®_­¬|5Ù½c+µ{çVÁkíݵã)A½zuO;$^î{kÖ¬¡§§gkc½nõ 6^0Àñv¬˜²ÆÑ•½£~©Ùšvw\TÈ„q£ÉÔV32Zµb‰x!‚ý(@T˜ƒØR@Ü$ņ0T›ƒ˜pR@Ü$Æ„*ÌAt) Ê„âæÀýîR@Üœ;´%hs@qM>*ÍÁ»ì· h`Zm(–ÉGsÀµ ðàš´†––›™ßï=ã"R⣨(´'ÐæÉææ(·qQÁ~‡÷mÛ°|n~ظrþ¡=[Â^PhUs`JôHÜu烛—s²³>~xŸgÞf¾¾óò±;’8¯vs`J Éqô`Ÿ“õö}Nλì¬üðöÍ«M+çÇ„ UÌ€9(yæ 6bÃò¹Þ¿{—õ6ÿPQ1!¾hU÷ÝËäø™Ó§V«f4sÆ4:T?x^˜˜ ž9ÈÉÉÊÌ?TT4ÌÈ[6ýÞ¢Eó ¿ç¶oݤ~ñ¼00@sðþ]NöÛ7ùæä“–-[\:† S u«–ê§Ï ssÔ29ÙÙ™¯óÌÈ'U«V‰aÂÑáÁFF†ê§Ï ssÔ4Yo^å˜OÊ•+—úõ]e èé驟Fë²e˲õÏ?er¥ˆ»&ÏU–±¤›ƒbé…B­ chqð:ý%—¨ð _eÐY^z˜ åÏ¢y3e¾ ÍêÆÆÕœû:ú>Wóºæææ”ñé£ûÅrû—ሾ¾~Í5fÏœ‘UÍA~z¡ˆ'álöâ0o^§¥p ô{ÑÛ©'‹â!/=ÌÐas@º£—/YDa‡.‹ñRSsÀ„Âý]†¡ÃQ#\´aÚÌ›9È[/‹9(²f/`sùúUj2—Ÿç4í'&&`ãâccãb™C^z˜ Ûæ€Hˆ‰ p… ¸\kV­¨õóÏåË—·±±^¾t1»OUæŸÂÆl\¿–ÙAÏ~õÒù-šW¬XÑÀÀ «Cç³§Op‹Ýµs›]íÚôðY¯^Ý+Ï©3QD†ÑaÕªUÕ¬9·žÜ¢R“âhB®^Ý–®nkk³lÉÂTÎO¯]½’NQ™T±=ì(ps i/;·oiܨ¡A… VV–Û¶lR©…¢úê륲ىukVQL¹råhñHf‚}#N¤gUvVA™ƒ¬ÌשI\ü|¼iÚOII¾ó×- 0‡NHŒgyé`€Î›ƒøèp WcÏ®\¾”b†DsÔ‚ys(¼zåre3s8fÔˆ¸¨0•Ù---éðø‘ƒ‰±‘×._èîØ[ÈðaC©#])L³Dæ%‘K+Ö“[Íœž1m Ulê䉦y•9µaÝj:ìëÔ›žŠ §>½ ÃhÔ ¿¯_C‡=º;øP•&Œ«R EõÕ×Ks@—vü€®KvŠN 2XeϪ쬂3¯2^&r ô“/RSSÝ=žæîÉ)œœ’ÌòÒ3ÀÝ6IqÑÌ6ŘÑ#Ù³5ªW§/7 G…S¸fâæ€æu²W©R…hïݹÉÛvf avΓ㣙ít•óRxpÍ3Ü] ‘K+Ö“[=KS8Øÿ…ƒüžS˜›™S?׬I‡/¼Ü™ÃçžO ÜhÚ  CïgOxŠh¡¨¾úz©lv./c锩‰‰ÊžUÙYeÞ¾yÅ‹ð¥i?ãUF`?˜C §¥§2‡‚¥ÁÝv%3B7&=²giQÏKP®\9qsÀ-\$ûúµ« (FOO¯YÓ&ΞR³LÁšS!TóY3§³ÆEäÒŠerc˜ŒÌÖ 3¡Q ÷E2‡) 1îJÖ´xUâeÔBY7©£—Êf¿~åbÛ6­ÉÖ3ï›qç|‘žÕ¨³òcÞd¤¦ÄGq ò£iÿõëWáa`)œ‘‘ÎòÒ3ÀÝ^D„Ò3…Ùýgöá38ÀG}Å;W<{blä›×–/]LiÌÍÌòf”µ‰È¥Å͵µû\M‹xu i/([ˆh¡Xç<¯±°° ³§Ž¡çê_nb‘žÕ¨³òc^§¿LŽ‹äJÓþ«WŒ9`)œžžÆòÒ3À÷ÐýKÓ²±q5öƤgxfS—–𱑡gOïêÐY}s ’Ý©O/²IqÑô—ÒØÚÚ¬9¹´¸9˜=s»ë>mÊ$ /]¼ë$íëÔ;<8€ @aø4ê®ï€LÉÔÉUj¡XgõõRÙìTs:Kkªçä‰ãÕ4uV~ÍAlZ É7‹2Ò™ås˜–ž––kè—žæè¼9 ˜ë~N}ؘ­›76lРB…òU«VíÖÕáÜé“ꛑìgNëо]…  Zµlyëúå‚5"—7ôX;kÆ4++K===ëÅ ç³ïä¤%ǯZ±Œ"Ë—/_·ŽÝîÛ ÃhÚ ;¶mnÔ°!¢:³Ÿ«‹h¡XgõõRÙìΞª[·]”ìû–Ô4uVþÌAJRl8—Œ—‰Ü yé`@~ˆ Ú¹qÅì‰.ùgÞ”‘TTLxp±• Òñ#%êG*^¥¥$Æ„qIMŠÉEgyé`@~سuÝí+gsr²?}úÈàïãõþý;5¡ÄlÆwï²o_;¿oûú˜ð ˜˜ ‰9HNŒÍ?0 ?,š1&'+óã‡÷,~ÏŸåd½UJÌÍ›“ý– „9€9š™ƒÔ¤„¨ü£¾9ˆ €ÇÂi£ß¿ËáâãíñöÍ+–¿.ÏÉÎ ”˜— d?#‚9€9ꘃŒ—Iñ‘!ùG#sÐsq-¸,ž1æ]vO÷×é©,ÙYoÁA‰yÙ©ÀÔ”$˜˜ ¡9Î?™ƒ^KkO¾gËÒYã²³2¹<÷|’þ2IM(1/;ss42é/ã"‚òFæ ÷ŠÚÓžÔ€eùìñY™¯¹<÷pKMŠc¹séXÖÛׂ‚ó²S00@3s’˜42N«ìfy5€eåÜ ¼ÿ¾ííþ(9.Š%+ó! (1/;ss42i) 1aùG#sÐwM¸¬ž?éÍ«4.^O&D‡© %æe§a`€fæ 9>&Ô?ÿ¨o^§¥|xŸ—µ 'óþ¿žç“±áA,w.{û:]0@Pb^v*ææhf’â£Cüò¾;ùaãÒéi)‰Ü¨ôìñ=îË|NJÌÍKEQøîæhdR“â¢B|óÌÈ']w<¼}959!ýe"ƒÇã»ÏÕ„³©Gw.ŸrÝ ssÔ2qWÎ ö‰Ê7TȦ•óc`@^‰‹ =±ëÖ•³6-›Á°~ñT6¬nb*äøþ­‘¡~ _ææˆ“uìÀŽ;WÏF½ˆÌ”ýεs'ÿÜ€Vy&&<¨  uA|T8ûÿda`€8iIq>‡÷l¡û ËçæÊ~dÿößg)q‘hU µ“šæàeBt|d°'$.< !2˜Ô‡9ªEÿoÊÈùµm-aÓÊ*ÙºfÑñÄÇ„¿NO9HÜÄG…ìÚ¼úÚ…S±Ñq1Q:ÍöŸUÉ»œìGw®9²?§ð§h˜€–›ƒ¸ðZÄDGÈtKäæàÓ§O?ˆC†€ÖÞgÃ$nbÃfOt¡ÇiÝ3Ÿ>~üøþ=—œ¬,^ A)?¼Ï‘ 9(1 €d))wÌÜ|øðá]Ë3÷§vvvô—I”8sPæ«ñÈ犲øªU«b–(¤fT–æì©ã:v¨P¡‚±qµß Ä縃`øæàãZd3x<}jbbL­M)ÌÆ%tuPôƒYešµ«WNŸ:³M4#7C—Îdâ¢ÂÈŒ3ŠLÚwÌÏ|xÿŽ$ÜŸº™™šnÛ²9#í%ý¥0Å0§Ý3tjËÆ 5kÔ¨P¡¼½}½W/íڹͮvíòåË7nÔÐíá]^ LúêÕm™ïÝÉÃ`NŠ‹¦+ú>Wzʤ ¦&&FF†«W.—Ú$ÒŒê¤Iˆ‰0¨P]€;ˆÛ}0Ì$Ÿ“•I8:vÛ·g7&(L1ì¡Nšƒ¾N½ý_xÑä°lÉÂ*Uªôï×—=lÑ¢¹â`¦áDã0>:|Ñ‚yÍ›5,ÓØ¸ È:vµ—/YDC‘—€F©ËÐ!‚õ¡‘yøàĸ(¿çž#\†1‘‹ΧÇÚoÆÃ† 3z$?{挮òø¨°àÉÇëÞ”çfT'Íñ#;´o‡.ÀÄí¾|šƒÊ_…ùùóç¥K—Z[[ÛØØ,_¾œÅã‹Ý¼ÏÉÎÎ|M¼ÉHc,Ü4áÁìã"ïP___q0G„*&P„ÆðãuìО7K¤&ÅÑ ÷p{(˜ËÆÆzãúµ4>¹‘ôœãñäð±07gÂÖÖVÏž>Öímм5£Ê4ôPJ—‚­‡.òT «ž9puuíÒ¥Kb®PàСCâñÚ`²Þ¼R‰Nšuj®jƒý_Ð:”ãºOÏÝ•¥ÿëÖu:kbbüsÍš'f"é–ázÐÊ–-ËÄëéé¥$ÄHaïZÓfOsåâ9[[›;7¯¡ pñº¯0̃ƒÃƒ˜0ºuë&_ìæ€´{û:]%ÊÌÓÈÛ¶lb¶Ô¯úÄÑY3§[ZZ2;„·¯_aR^½tžÖ+V400 eÚÙÓ'tÛ„úòÞ Ö¸yí²Š_„HŽ?sò˜ù×gzàÜ&•È£iž›Q0 M&4,ïÞ¾.ÀT4«++«×¯_3áW¯^Y[[‹Ç»9ÈÉ~›ù*M%âæ`̨qQad‘™ÃÑ#‡³‡vµk3)éN¤ÃãG&ÆF^»|¡»c7Ý3ú;?yxž:¼Ÿ=qìÖuø°¡ì)¢­Z¶©*åuü ).šì©©‰ ¹lÉB*‡J£2ÝÞýµ¿3?g–.o\硹Ý!˜fͪ´.ßbBHù* s@æìÓ§OL˜†††âñÅo²2ïÞ Î›ŒTqsäÇ8ë™Ãàf£»:«R¥ŠA… ÷îÜLŒ‹*Ê;]ƒù ë¾† ÐúÔÊÊrʤ døØSmZ·"S(¶¿±owÝ:v”×Þ¾»t¢6\¾dó2Fýúöô|˾1iÂxcãjÕª­]½RǦ <4#·;Ó”QzbAàb»«šäÕÙ)JKŠ7ê®_»ÊÀÀ€õôôš5mráì)üH@—¾J.龃ÌW驉±*É¿9 ÈÖß¹ymùÒÅinfsÐasàêêJ3?ó¸o Æk9H{™M¤ÄG2nLþÍSŸ^d ’â¢é/EÚÚÚÀtÃTþ§°ß,Y²Ä:W–-[Æýî@0¾ØÍÁ›ŒÔ”ø(âîÕ“/Ü™0á÷ìá½kg^&Æ0‡ù7gNëо]…  Zµlyëúe˜€.­JúWɯÓ_&ÇFÑ!WNî÷÷tKˆ }þä¯Ë'ö¥¥$¥%Å3g%û‹¦˜©˜šôc¢Cü®œØG*_>¾—¢ScÙS0˜Ý6¯ÒR£ÃXÈ"Ü<„±Üx˜ÌŽ›ƒÔ¤„¨.Œ™ s€9Ðmsñ2)>2X%0˜ƒ¿ÿWrT¸î™ƒô”ĸð qbÃñ¿’0”&>*d÷–5çOüøñƒÎ™ƒZûˆp÷ÆÅ³Gäþ sÐrsð21&6*ôM«h0{¢‹Î@æ@%´.8qpOFjòëô˜€ÄÍÞ¤¿|—ùá}ö‡÷9#›'õ‹¬G`ÚlÌæms€9E c è'qs@PP” ÍÅ5ùˆ›ù$4ÔgÜ’~mÿ¬…´fGu õ7‰Ñá7ÏVùï#K '÷n¼qæàõÓêŒFºª©tz í)u¨ÂÃçtµµÝŠ;ýVÞwÖ6VüÕoô¶öã—ö7·/óótËÉ~ûþ]Ž@Šø>{|ýôAÑHW5•NO¡=¥ ճݰÚã.7•¨¯…Œ»\Ÿj(nNîÙø216-9^g uH)]ÒHW5•NO¡=¥ Nû!vÓW»L]1Xk¡Š›Zæ¤&Åé:©”Nj*žB{ê¼:†ÕûüéÓ絪¡Js@VXÇÐI¥tRSéôÚSçÕqÞà󇟴ª¡js£cè¤R:©©tz í©óê8ŽlüñÃûïßi-TC•æ %>ZÇÐI¥tRSéôÚSçÕé5ºé‡ïß¿{§µP Ušƒäø(C'•ÒIM¥ÓShOWÇil‹ïÞ½ËÉÖZ¨†ªÍA\¤Ž¡“J餦Òé)´§Î«ã<¾õûw9ÚüI2ÕP¥9HŠÐ1tR)ÔT:=…öÔyu~Ðî}NvÎÛL­…j¨Ò$Æ„ë:©”Nj*žB{ê¼:ƒ'u|—“•õ¦°ÉÊÌx›ž”‡ŒTCÕæ :L;Iˆ NõÉCFmVJ'5•NO¡=¥ NÞ*Jº:y®ð˜=s²Þ¾}“Qxdf¤x(Cucx“¡Qvª¡jsÌäë9nÌÈê¶6úúzFFF=»>vˆ9%ÿœ”ÊP3™8qáþ^ÃÿÇjçï®QvV)s3³ˆ ÞÙ Ÿgõíë¾ð(¼ú½¦e„¤Õ_YËçM urås<Ró–ôñPÄÃC«*<~VŸœ¬7o_§±D„M?¶fåË—¯V­šc·®Îæ&(b¨†*ÍA\DK—NFúäÁèPO·=;·¶mÝŠ9EÝÁM© 5“*¬R}zõX¿zïìÂy³‡ þM›ëŸMu þ‚5Ï›:êäÊçxÖÎv.éãAÓá¡ULšÓ/çmffF:ChP ‚Å øú¤§$ÇD„Ÿ=uʱ[76ú¼I{I×)y‚ÔduÊ¡ª4±,dÅ‚ý½¸1 Üg &Æíþ-Ç®]*WªT¡B…Î:<öH0ÙуûêÖµÓ××·µ±Þ¸~•bÉ\bÂüè¯2­åiÂ|ÅK``•º~ùÜÏ5kD‡ù³§"‚}¬,-üu]°þŒ ¼ï0*Ôoʤñ¦&&ýœzùyjƒ¦ŠõT¦`Xàóœ+V4073]´`Ž–ô”bƒ«©Ž`µ)׺ÕË)†â6¨óêù¼g&%µ’™©)µØàß„½(¡ãË—, Á_¶lY‘jk­:‚ÃóÐÁ¿U­R…6dŠòB­ð´y²ß¾É|•Æ0r„ËŠåKÙCé/“¦Mljjjdd´nÍjeɈWñ¡ËZR€j"S¹9x•ulvâ½"…0P U›ƒð–vm[;;õ¾töDX€77ž7)ç°nÚ§ŽýIÉ_¸=¢?'Ád&ÆÆûvm |îþ诡ƒ~å•É%Ú÷±ïÂ_( Lk:´o|Ø¥M"…0p•êܱýž[ØÃ­×õêá¨Nýyа‡sgMïÔ¡Ý3·»A¾Ï ì?bØ-Ñ”WOe N7º‡c×Ï4²é‹½þ¼WSÁjS®~N½<Ýî…øyÍ™9­É/EJV9ž»véôÜã!áй㔉cKèx`Ú„:]¼ÚZ«Žàð ÁLB]ãíþŒø¤ñcÄy¡Vxæ‚ßȼÉHe°´´ ògyÌ3«[W‡à@¿¸èˆ©“')K–èæ=ì?r7AF*ÕäÇìFA‡I§B6ô Ã˜ó«”•Ã@5TibÂüYü½ŸN™8®n;zF²±¶;j¸Ÿ×æ5)7%ºéèqB0™µ•åêå‹=ßU–—!Âí¢÷°Ë5 óW¦5ò[Ù‰ƒÎ/«Ôéã›üÒˆ=´¯W÷ò¹“êÔŸ§{HOG÷n]aÂÞO˜™™j‰¦"ÝÄUÐÒÂâñ½Løá_×ÙôÅ^ÿ2JD\ÁjS._O76±¾žžb!êgj%&üàÎ5+K‹:(@ö‘WVm­UG°¿,,Ì©S˜ðýÛWil‹òB­ðœEC²3_¿NKa •TZr{ÈŽgæÐÆÚÚûÙSö¬2¢ŽÍajBaªIvvvGè"éTøÞÑ”Æ{Ðâ¥Q Ušƒˆ@oE¼n_=G«ãöíZ31¤7ÁÙ‡Z4oZ©bEFGZ &»xú(=\W3ªQÝöÀîm‚×"öŽc´¦°2­é”ÿ–”ÆkÐÊÊaà)Õô—ÆÇí£À¡ý´iÕBÍúóaõôô¸“›Q4åÖS™‚zzåBý<™p¨ß36}±×Ÿ×àjª#Xme}')2¸ÍE½_BÇO_eÕÖZu;‘7˜ÙÞQ6È µÂó»d‘9HOa°07ôeäæ 7@UMKIà$öâz¹9H—›ƒÌÌÌ$ŽÐ¡Ü¤§„lîë=ìÿ^%G‹E5Ì›9øÒVÏŸ”/_^°;,-Ìwl^ïãñ ‡ï³GÊFk\þÜ»ÓÌÔTäZAGæ³"¨5ò]íà5ô?á¾nÝûwm¥õ/È´Ü·SÍúS‘úLØëÉ=6ÞÊÊòÉý›Ê.]¼šrë¯LA s³û·.3á{7/ñú«ë/>i+SG°Úy0"ãZ‰m.JÆË^RÆO_eÕÖZu;‘3Û;]¿@‡ê òBªð¢¥#ɼJKa6tÈò¥KØCª °¶¶özö”wVÉÏo½Ê]¤+EÊxßÌx™¨²ª¡Js@]ÌÒºesº)ÜÞ ñ}öøîµ‘.ƒ[µhÆœ2¬Z•Ö lÊjFF{wn |þ„ZÛ©WRS0™S¯î7¯œ zñÔuÏvcãjÜk)|ç0ýU¦5 ¹}8Ìï™x!O©0Ϻuì6oX]ß¾®Êú³F ëÏœ6ÉßÛÍíÞ^=º±ñsgNíܱý½—B|=®_þ‹ ç=6¾ØëÏÖD#u«Í+J°d5Ç3ã;xöèáйㄱ#ye–”ñÀkeÕÖZu;qÌH—.:x<¼MtêЖƶø /Ô /[>6+óÕ«ÔdÿÞV––‹ÌóõöLMŠOˆ‰<æ”Üäž;{VW‡.A~/b"B§LšÈæA™§[¼ TCÕæÀß“åØŸ{ztëbdhH«-K ‹ßôsp“95gÆ”J•*É6÷pÏŽM5ªÛP2k+Ëå‹ç±ñ¼dÛ6®­]ëgzÒ®cWûàÞÜk)C™Öêäeà)ElÙ°šê°õ÷ÕlŒ²ú³Ëg5¬oO¹l¬­V/[ÈÆ‡úzÌ›9•"õõõÉÊlß´N«4UÙAþ^zT051™;s i¡%õgk¨‘:‚Õæ%X²šã™ógO§¶ªh`ð«³S€—¯Ì’2x ¬ÚZ«Ž¢S‰"©;hŽªœ+`{GÙ /Ô ¯\9AþÕpj‹¿÷p—a–––Tãž=/œ;ÍœJIŒ4q<V’ukVqs‰žŸÄ’ž§fFª¡Js@ÏÚÉPÏ¿XÂ|Ý5Ê®Ji¡¦7/Ÿ­nkƒžÂxÐau4äù©ðšÕ“ßf¾Öh~Öšÿ½‡ÿýUrzb¤FÙ©†ªÍß3­Ãç©×°ÿ²Z‡>¨Qv-UJk4=b¨—Û_OîÝèܱݘÃÐSùº§Ny>*¼~í´¬ÌW/ •dß{LÝ=.iš—j¨Ò„úyh!Áw3Z]ß§i^­UJK4]²`6­R+UªÔ·wûè)Œ|ÝS'σ<ÏÞ´~fÖ›×…mˆˆãC7öÎCFª¡js@ë#­ÄoÛ`ß•óQ›•ÒIM¥ÓShO)¨“· oý}­Ò_&j-TC•æ ÄÇ]ÇÐI¥tRSéôÚSçÕÙ±i~VæëŒ”D­…j¨†9xªcè¤R:©©tz í©óêìÞ¼ˆÌAúË­…j¨Ò¿xªcè¤R:©©tz í©óêìÛº4[¾:HÐZ¨†j˜ƒ':†N*¥“šJ§§Ðž:¯ŽëöYoß°S«B5Ti‚ž»é:©”Nj*žB{ê¼:‡w®¡Õ6›ª¡jsàí¦cè¤R:©©tz í©óêÛµ>[»WTC•æ Ðû±Ž¡“J餦Òé)´§Î«CµÕrs@5Tm¼é:©”Nj*žB{ê¼:ºa¼é:©”Nj*žB{ê¼::b<ê:©”Nj*žB{ê¼:ºaäm¶Dbt¸Js ƒ@ ˆ®Ë‹ÇÕ1Yo2è0'÷nTǼ}“@‡QÇw 7¯Óè0jšƒÌWi@MÜnÏÉÊD; Ñ(Y7 šæàÍ«T†§Ï/»^X´ÿÜBÀàza1µ Û>Ó°Ü 4Å~ªk2RhöKH HI  ÔÔ&lû_f6N P  €b¿Õ4¯Ó_2ÐópRjàBm¶Á4,7¨@±ß€j›ƒ†\s\à”)S¦0Š-rÍA Ë×™-¨ €b¿Õ4¯Ò’hêKL *pÈjúB…Ú„m‚iXnLñBm¥=•Q†¦&®T‰Pm»Õ5©É rsXFH(^eñê$ ó?aDõê6úúzFÕ {öìzæÜŸê”VÄÈÍÁ×ö!¾ÌlœRÓ¾^½Œ—Il …ëÕ­+Ÿ¾„Ò«OldØä‰jÔ¨®¯¯_­Zµ>½z^¾p.Ÿe%âV,UâŽm###§Þ½|½=ÅÓ— @ñTÓd¤&1ÐÔŸìÏB·÷P• D’uqè0jô§ž7c||îÙ¿¹m»–ê”VÄP›°íC0 Ëa!5›5mzêøQ6æøÑCCñ‚éÕ§[W‡qcGûx?KMŽ 8躯}ûvù,³(o´b©{Ýô—‰¡ÁþsfÍhòË/ꤠġ™9x™È 7I~,òi<7í9Ìe`ÕªU—áé9Ë “ì‰Ç Çî+W®T¡B….í}üðÊáR¾|ùÐÅxnzÞ …‰Œ‰1uúXSSƒ~νBÂÝ )(äæàkû_f6N Õðëþ6­[±1-[4?üçùL’{øÂ˽gî•+W6¨PføÐ ?Š3jä®ÛØ,lßJ1¼’+T(®ì¢l€+LdjRܬÓÌLM©­~à&XHa#Þh‚‘‘¡AÔÅQaÁl$Ř›™Q Wå-›6T¯nKc©q£Fîßaâ“⢆ T±bE só•Ë—*»÷01.Š:…mÛ´vÝ¿‡÷áeia¡~Þ=uÂÞ¾Õ‡jµcëæbimo@5Í{HS_\¢ ~&0qòH‡®^øÝ{î{—æùISFñ0Ô­[ûôÙýáQÏ‚BÜÆwðkoÁd íÚ·rîßëòÕ£”žwJ1ýï›–usìÄ„çÍŸÚ©s[Ï緃Þ ÜoĨAŠ… Ô&Ü_dVð©Ú4KØÕ®}ëúe:¼rñ…)†â™õêÕ½tþLbldtxð¤ ã8€"“â¢Ûµmóç½òÿm½…“ã£y%wìÐþ×ýo_¿By/ʋٶeSîŽLxñÂù]:øxÇF†2xÌè‘ÅòSŠâ¦,rô¨Ë—.f#—/Y4yâxn üÚß9Ð÷9ÙÊE æ5oÖ”‰Ÿ6eRï^=ÉÚdE.Á@ÉæÍ™Õ¾][ Ÿ=}¢nÝ:ÔkÌ©.Ø:ð QÖ°¦&&‡ ãâ÷Ü“òjùO\‰gs›èÃB·°°4èv™ ?x|ÙÒÊœ—@‘ÐHSSc‘dÁ§LS·ž-%ll¬ÆŽwñ~$˜þÄé}× {ÂÚÚZß|‰ {ûÞ577UV‡A#s@·nÞØ«g tsèB3³²/!&‚ž-™pp€OÍ5fΘF)¬˜˜‰é,=vR[ÙÚÚ)¡GeÁéôÂÙS¿4nDssHϨO±W¡§åd<Ü’²) 1¦¿5ªW§9–g"BÙöÔ××gÂVV–Ï=Ÿ2a/7e—àJµjFOÝgN‘Y9°w<Ý[[[QÉŠõTÖ°66Öׯ%3)”PsÅ@S_dŒ‹|ÍžÐÓ+ù” ‡F<Ñ××ã%`8wÁµeË&•*Udn±²eË &ãí~çîé!C;tl¥˜þöÝSµjÕxüäCWçÞÈìU j¶}¦a¹1,Túbaa¾o÷úKa6ž¸~ù|ëV-+UªÄÖœÍ;wö ŠY¹l‰`É,Éq‘nþ>lH玸ex|ÿNíZµ¼=ÜØš!ym%^~!¡²Ñ”Evuè¼ÏN P{þÚ¿ï,//{¨§§—΄¢ÃÄ/A„ú,˜;»c‡vÌᑃûëØÕ¦8÷[¿f¥àµ”5ì­k—z8v316®Y³Æ±Ã®ÅÒÚÞ€jššdhꋈö`‘?}å,,Ìî=8Ç„ÿºw–y ,-Íwü±ÆÇÿnx”»oÀ=ö,/™ ÁË—/ÏKÿÌûFm»šgÎ঴²¶xâqUeµ Û>òÙ8·a¹1,Tm&°dá|š.–.šÏ‹·²´Ü·{gXoRlDxïöuk+«CöR÷Ç÷ çX¡|y^á/¸sƒ.*XÃÂFÓFãFÖ«[wýê•:¶W<ËËËNž0®WÏîA>^DÇ®*/è³hþœ† ê³1ûví [7®gcŒ ÝîßQÙ°xt÷—ã‡]MLŒ‹¥µ¼Õ4I±á 4õ…E>a¡;‚ øÝÿmSåÊ• Ð!?{îÄJ•+²ÉöìÛP½†ž^9kkËå+f³ñl€ËÑã;»÷èldT•Ò[Z™S±OŸ]å¥çmð2‘!áçΟlccIOàuëÕÞ¾s•báˆüKí¯íC0 Ëa‘|-èÀžš5jèééÙØX¯]½œ‰4pÀæßײ‰W-_2tð@^ çNëݳG5##Êkme9lÈo~Þî¼ÂymÅD&D‡.^8ÏÖÖ¦¼¾¾}½ºûvm¬aa#ÞhŠ5ç¶ä–ëÊ•+wêØ!Åöä58{ê?p€³™™)ÍÛ¤»øu+UªäйÓãû·Ù³öþQ»ÖÏq‘!l Ù ü*vïÛh¦¯¯W¯n“ÇKk xªkbÂäæ â1à"7_Û‡ø2³qb€JбÑݽY£zuMsõpìF;:èÒ ¨¦9HŒc ©/$ì1à"ÿRûkûLÃrc€JоÑ&Œìëåãù¤«Cç‰ãƨŸ1>2dÓú5uëØQtéTÓ$D…2ÐÔúp¡6aÛ‡`–TRô¶jùãÊ•+ è×7,ÀGýŒeÊ”©nk{íâYôбPmsÂpàübÿ ¿‚Bj ×ó‹Ùö!¾Îl!@}Ðhû ¨¦9ˆ f¸ïv’f?ü´¿ÿÚùÅžœbÛ‡`–T‚F Øo@uÍADP“/3š@‰ºÕ4qáAt5ÍAlx F]s@‡QÇœ>°€n£æê@ º-09€@ Ì@` s ©Üºz~öDæMuëê4 ‚¡s ÛB£+''[$ANv6¥AC¡Ñ ZR3~~~ýúõ377·³³;räYùŸ¢2=WÂÂÂúöík–+ CîÙÔÔÔzõêq˼}ûvïÞ½MLLlmmÇŽ›’’¢X&¥oÑ¢ÅçÏŸÙ 7oÞœ-‡[[kkë!C†DEE ¶=o¨lI•i[†+T½¥K—RMlll–/_ÎÖ\Óxž$%%Íš5«AƒFFF”²ÿþ·nÝÒ´ò ùo4e#JY¼ø(9Ê3##cøðáT`5Ö®]«¬ž5Ò E3´ eè.³··¿téRVVVllì¤I“Ø1/x eé¹Ò¶m[º×^åʪU«ÚµkÇ=K³Ù¦M›¸åÓÍNsZff&ÝÎt–npÁ›´cǎׯ_gc®\¹B1Ü›”½y©œ•+W¶oß¾°‡Ÿˆ9puuíÒ¥Kb®PàСCy‹çJBB‚uëÖEGG¿ÿ>--íÆÎÎΚ¶@q™âÅG‘øÈQÖ˜#GŽœ0aBz®Œ7îèÑ£…:Ò 0%ËŒ=Zð _ÙMª,=WèiíÝ»w_z99¦¦¦ì©àààFQ¤²òÉÊ ÖçÂ… ݺuccè6¿xñ¢âMÊ^W°œ"3<`Â`k®iÓ:šVÓܳtoúûû÷êÕkÁ‚ê¤g÷4êׯÏl®R€ìLüÝ»w;uêÄìÊ N¤¾¾¾ 6Ü%fÒÿù矃 ¢€³³óÁƒ¹åð¶ mll‹ÑT­Z•æ&Lj·¼Ås…æÌ>p¯ÎÝoW¿ŠñžUQÊâ•"AáeI6…VX¹2iÒ$jÏBi˜ƒ’eè9Šû¼D«iÅb“’’¸±*Ó;99Ñ#»ëK‡L|«V­ž³Q éÁRС{«ƒ<´@±ß³Ü¥,^Ù(RÅ‘£¬1SSS‡jjjJ‹\jjÏBi˜ƒ’e¹Ó»¥¥¥b±)))t©ŸÞØØ˜»ëËî¬VV6˹sçììì¼½½UN¼›7o¦‡º-[¶ˆL†ÌílbbRŒæ 0|´Sô䡊ýžåŽ(eñÊFOGŽ:yäÈ‘1cÆêHƒÀ”,s@7»|¦ÙfôèÑLü¨Q£>|ø9`ÀJ#žž{›´k׎}'„ð:tè >‘îܹ“žî‚ƒƒó0ñ Þ¤t]š6Û´iSôæ€quu¥I‰y¹…Ü7ˆ4ŠçJLL M}ëÖ­‹ŠŠ¢®ÉÌ̼sçNZ XîYe#JY¼È(b5U6r”5æ”)Sâãã³³³¯\¹BCCC u¤A`J–9 Y³fM5ÌÌÌ\\\Ø'ÿ .´nÝšžŽêÔ©³`ÁºƒÄÓsoº={õêeš+´ŽVyÓ)®h¢ËÃMÊŠ¹¹¹³³³àueýÝâ[ôLàóçÏK–,±Î•eË–q¿/Ð(ž'±±±4a’Q ®©^½úÀïÞ½«i Ë=«lD)‹EʶñÙ‘£¬1éa†šŽùÁÇÇ'Ï…×Î00Åk¤&ò¯ ³U|9*¾‚D£A0´`t\n]½@£Kä7RèìíkÑPh4†Ì@` s@ ˜À@ DRæàÃûö€îsæÌ˜0`À€9s Ÿæ :̘0`À€9sæÌ˜0`À€9sæÌ˜(.J}‘SìYÿ^ êÛÿ}iúKaÁ–Ô¤¸ùsf–.]ÚÂÂ|û–MÜb¿ùæ›*U*ïܶ¥ØÍAxpý òòpCa„–NX™QP'²GwljÆ%ÆFÒßž=º ư̛3³¾½ý£{w’ã£ÝÝöuêÍ-–ŒÅ™“Ç~úé§â5Ô2aaaòôééHMM•T˜$=W$¨;…)!MÝ)Lº?{öLšºS˜t—ø½O³ŸF怦ëÿûßíÚ¶yáéN1zåÊù¿ ý¥°` KÕªUž>º¯ìZŒ9035-öÕ @¤'­‚|Æmo_Âÿú׿h§ÀËÄØo¿ýV0†å»ï¾£HÅý(ö°téÒG(^süêÕ+ÉŽ‡W¹õ¡>Ô— ú4ûijˆ„˜šº)P®\YÞZ@1†¥J•ÊO*^‚ ¤%Ç_Í~ššƒÈР©“'Ö±«-÷8vc=Œa™9}j³¦MÈ"ÐáÙÓG‚æ@|éééÒ]-æ Ô‡úP_‚ê+úJýSxñ$?üðCófM™ç|_ïgööõh¥PßÞÞï¹§` YéS'WªTñ»ï¾³²²Ü½sïŠìëFð@ H‘Z|wßÁ?÷¡>Ô‡úÒT_™ï@²æ¾¨õ¡¾4ÕWæ;¬9€ïêC}¨/Mõ•}w å©À"‘¢E€ï¾ƒîB}¨õ¥©>|ððö¡>Ô‡úÒT¾øxû‡PêC}iªß|"ƒï¾…ýC¨õ¡¾4Õ‡ï¾Þþ!Ô‡úP_šêÃwßoÿêC}¨/Mõá;€ï@dðÀw °õ¡>Ô—¦úðÀwÀÛ?„úPêKS}øà;àíB}¨õ¥©>|ð@ ˆ ¾øö¡>Ô‡úÒT¾øxû‡PêC}iªß|¼ýC¨õ¡¾4ՇムÁwßÂþ!Ô‡úP_šêÃwßoÿêC}¨/Mõá;€ï€·õ¡>Ô—¦úðÀw@ 2øà;PØ?„úPêKS}øà;àíB}¨õ¥©>|ððö¡>Ô‡úÒT¾ø Dß| û‡PêC}iª¯è;(õU§Ê}{þ°²²,]ºtêÕÏœ<&“š7cÚ”Š+~óÍ7¼BèÔü9³Œ )½……ùö-›¸W¤ôUªTÞ¹m |Å»õ¡>Ô—¦úÊ|‚æÀ±«Ã£{wc#7nX«W®œ`ÌÜÙ3iª§È´äx^öysfÖ··§SÉñÑînû:õæ^‹Œ”Ÿ~ú©Ø}îîî”>""âÆ!!!’ “îéééÒÔ¤»———4u§0é~âÄ iêNaÒ]â÷¾2ß 9`yáénhXU0†þ;ü§`®ªU«<}t_Ùµs`fj ßhï@Äù=¯]ëçÃîŒùöÛoGpùñÇÉ.rÝÇÍøÝwß½LŒUÜbK—.}äàø°} õ¡>Ô×߸9¸yí²‘¡!w‡Ÿ£W®­ã¢è¯¾ž7o•*•=ž…úPêk¹ïà÷õkËëëŸ:~T$¦gîd’â¢é/âfŸ9}j³¦MÈ"ÐáÙÓG‚æ@|xõêC}¨/Aõ}¥þ)¼Çx®ÄF†*ÆøxýÒ¸QéÒ¥é9ÿø‘ƒÜ’É LŸ:¹R¥Šß}÷••åîÛxŰ¯Áw@ EjðÝ|ÿÜ?„úPêKS}üf|¼ýC¨õ¡¾4ÕÇoÁwÀÛ?„úPêKS}üf|"ƒï¾…ýC¨õ¡¾4Õ‡ï¾Þþ!Ô‡úP_šêÃwßoÿêC}¨/Mõá;€ï@dðÀw °õ¡>Ô—¦úðÀwÀÛ?„úPêKS}øà;àíB}¨õ¥©>|ð@ ˆ ¾øö¡>Ô‡úÒT¾øxû‡PêC}iªß|¼ýC¨õ¡¾4ՇムÁwßÂþ!Ô‡úP_šêÃwßoÿêC}¨/Mõá;€ï€·õ¡>Ô—¦úðÀw@ 2øà;PØ?„úPêKS}øà;àíB}¨õ¥©>|ððö¡>Ô‡úÒT¾ø Dßï Ìç2eee¥ éõ¡>Ô—¦úð(ú^ļH“¥IÒêC}¨/Mõá;€ïÛ§PêC}øà;€@ øðÝ¢àÕk¨õ%«>|øî€+xõêC}ɪ¯è;8~ä ©‰É÷ß—nÚä— ÿSŠ#Lš=»vX˜›•.]ºFõêgNãfW<•š7cÚ”Š+~óÍ7L ®ûö˜ûí·ÆÕªQ˜›ìݽ“=\²h{Q¦TH•*•wnÛRx¾wwwJqãÆI…I÷ôôtiêNaÒÝËËKšºS˜t?qâ„4u§0é.ñ{_ÑwP^_ÿØá?ã¢è¯SŸ^Ì<ÌKCñ/<Ýb"hê.W®¬ø©¹³gZX˜?ºw'-9žIóßÿþ÷ÄÑCÌ%þ÷¿ÿòÌAƒúöLÊäøh²)\sÀ²2?ýô|R¨¾½råh–NŠ‹¦¿úzzÌÔ‡ú…ê;à:Œ ¹1 14s÷îÞijb¢˜—{ŠYn0[CÌrƒžíÙÍ"s3Sž9 ¿;u:dP÷n]¹[UL€ÌÄÅs§MŒñÝA¡¬ñæ9Ô‡úRU_ð»šrÝܵ²²\0w6wžœ:yb»Ú¦…CH /Íùû÷îªP¾<7¯â©ž=º³»Oåõõ)†ìfQÙ²eÍÁå g)põÒyeæ¾)`‹ 0223§OMMŠcc~øá‡æÍšzÔ—¦úøî¾Þþ!Ô‡úP_šêã7‹à;àíB}¨õ¥©>~³¾‘á7‹à;PØ?„úPêKS}øà;àíB}¨õ¥©>|ððö¡>Ô‡úÒT¾ø Dß| û‡PêC}iªß|¼ýC¨õ¡¾4Õ‡ï¾Þþ!Ô‡úP_šêÃwßÈà;€ï@aÿêC}¨/Mõá;€ï€·õ¡>Ô—¦úðÀwÀÛ?„úPêKS}øà;€@ |ð(ìB}¨õ¥©>|ððö¡>Ô‡úÒT¾øxû‡PêC}iªß|"ƒï¾…ýC¨õ¡¾4Õ‡ï¾Þþ!Ô‡úP_šêÃw è;•*õ7FFRÛ?Äî1Ô‡úÒT¾1ß»»¬n]ì(B IXøD|þþ2kk©íb÷êC}iªߘï€Û,Âö)Ô‡ú’U¾±ï22dÿûŸŽ‚þá+É'Ôb%z±ŒÍs¨/aõá;ó¼/ûî;ìøOŸd ÊfÌ98È*W–egL±åÊÉRSe¤„ZøÄ¿;øþ{YNŽ®õúÁƒ²ÿüG¶r¥œÇyû‡yß>52’•ðµ6vÅÔOJ’íÜ©/^ ÷K¢úð¨øî lY]{⥵€±±ìÞ½‚ß>51‘……•ôíSlž ŸûüY¾¯hj*>\¥JÉV¬@ï—Dõ}©Iq3¦M©X±â7ß|SªT)Š)Å‘råÊÊgÔ#MML¾ÿ¾tÓ&¿ù¿àfWLÌ@e2¥þ/¼Ô·§ìô—¼ì{wïd—,ZÀæbʤZU©Ryç¶-Eô›E%ÿ‰—/t«vï^(Û§5k–ÐÇ‚Q_ö DÔß¿_þÒõ‡ªK™3G¶t)z¿$ª¯è;˜;{¦……ù£{wÒ’ãy§®_¾0eÒ ”××?vøÏĸ(úëÔ§—à¼Ê&&n߸j``ÀNì=º;Nœ0.16’þöìÑgÈF0—NŽ®Q½:×0ÖêÌÉc?ýôSáùBBB(}DDÄ7ÞYXÈ|}™07¾¤†ÓÒ>–+÷hïÞÂ(?ÇÖVæé©;m…ð×p”—×»²e£OŸV+ýŠ£F¡ÝJbXq244¬J“¼à<Ù®m›@_o è•+Gi’â¢é¯¾žžxbšömmlΟ9ÉNì”YSÐ_ óÌÁðaC¹î£ðÖÍ¿Oš8^И™š‘ïÀÞ^öä‰î<Ìœ)_ÎÒöi“&²û÷á;ÐAõûõ“Mš¤n)«VɦMCïë†ïàÛo¿5ÂåÇ$»ÀLË W/g®ûöT­Z…ÒŒîòÝwß)NªÜÄ”fÙ’Eì|Nüë_ÿ¢Y/cér¥¶ºs¾QÿãG¹'ˆpu•U«&ËÊR·”mÛd£F¡÷U =gÞ¸¡=$:¤è;`žü™ î“ófMïÞ¾ÁŸ{424TœT¹‰+S®\Y‘ÕýíÜ©ÃÐ!ƒºwëÊ5"L€ÌÄÅs§MŒ‹Èwй³ì¹ۇ “¿\ZxÛ§ÔV/Âw #êïÞ-w ›šÊ_®;wNƒRvì_¢÷årë–¼yÛ´Ñ>´h¡è;èÙ£;»T^_Ÿ‰¼tþÌ/q“Ñ´ìöக•傹³y%(&æÎçrßc7Öw@aÅ4—/œ¥-1”™ƒBõü£×œe‡é­îë+«PAV¨£½[7Ù™32HaÈÕ«_^ .-’OVnny©*Ý/t×@DäógùÛ}Ú÷œ©8øxÑd^ºtiz§‡&²É/ØÇ{}ÈÀÀ`æô©Ì¶;i+&V4¾ÞÏìíëÑ%êÛÛû=÷L£î/èºÛ·l*"ß‹‹ì?tavì(ûý÷ÂÝ>-bÓéî.7@uëuê|þé§‚üF»©\YþÈM‹»Â$gâDBž3Gþ*QÞäÈ™“|bró¦¬víá;ÀwÿØ?œ0A¶aƒ.<[ZZÊ?².ÔíÓß~Ëû¢©.ææ²©SeH¬þÛE¾Õ¿xQ¾mߢ–Õ«'ÿ§%³÷é‘§ V$~~š©ß ßAÉ‘%@h¨üý"‘ÝãöíeW®¨}%ZH Zðæ =ýËànßþiéÆG}ühÀÅ¥ÜË’õÐzëøq²ç)xÄÇkRV±ÿKÙC‡ä¿,ÿ}bAÉΖýðƒX^Íþ¡Í‰²ž= ø­szZÓÓ“ÿk®|û­ÒÏw._–ÿ·.HÞdË¥¿Bš—Ÿ!R\B3i%º/†—ÿ `þ%÷½o¥gW¯þò …\à;ÐyßÁÎü ¸Rº´üÓceÛ§FF²ÈHÍÖ!lèñôë—riib›É5ÊïÕ$ë; [°y³°úyùÕ®o¾)žï­hˆèëËKtï÷é#;z´ÊY²DþÓSÊdî\þ'¨ðHÁwû¾Ò³ôèÍ}Ž·}Z¦ŒüSWr÷‰?–5hP@UøPV¥Š| “+´ž51QšÖÏOfc“ÿµˆVìïÙ#ðäÆ~H®þP_Z´#%¨þر²M›4,ŽÌvFF14ÜÔ©ùq lïÓ2VñÃO‘rÑÌa§\Ö¯—¿(®LŒ ¾ƒÂðÐmÕ¶­Œ·Ë@ñE¿7¹p¡lþ|¥geááJ·OE6g$waP`!Ñ|bk+;p€ððÕ©£4yl¬üÔ|Š–ì$ÿ­,Ái„Ìw^~åïT*›¾ÿ^î/T_|ÏAX4{ŒÐPh&UôvóçgÿÏ`Û¬hÁwlÔyA®`{ßß_̦sÆ5_èiŠž© {[`ð`ùSO}ø Üwðûïò¯[, ƒÐÐbxbZ³FéÙŸ–y{+½íþßÿÓäJOŸÊìíóe^¿–YYýý«ÎÿÜξqCÖºµÒ¬oÞÈþóYÐÕª%ÿõnA¡ EXÞdôhá ŠÖ\dDöæÎÕðJFF²Â[dQm~üQàa«{wgýkÔ>ŠïØtî,7£E,·nÉZµ>5}º˜³ØÚZnJò/â„öê%÷õñ "|í;Ù²«][þªˈò_¢S&¼ÿoÌÝ>ùœYXr-¯¯ü¡^c‰Ž–O÷]»Ê¿aSòCÜdOi ‹ˆfkmÝ=ÎΖ[áœuêÔ—aÃd»vi¬¾f¿[ÅHµjšøœ4ùGÄ__-à‰¥¥ðÒ‰V*”©ˆ{_äŽ Ķq*VÔðÍ^%¢ø›\i×Nþ³÷<õá;Pô8;¿>\&ÂÀbÿ"^ä=±fÍdýUÔÓ‹ø›!¼hÉÝ>ùœYX‚‚dyù&õógù*¥R%¹qŠ‹ËÛâ—¤\9ÙË—%Æwàê*üéPŸ>b_q-X÷ŸèprRá£T?/ÿúX³7Ò4ÙŽ§q²w¯²óåËËß”Ÿ~RíÍ(ØÞ_¿^6i’ð©cÇ佬Lèa @~"þöm¹KH™4l(û¾•¾ƒ ÞÒÌ#:‘_ò9R~ J—.²óç‹ÚÐEEþ _ß¾òÇÁíÓgÏÄöêo'Y©Ré3W®(£áÇ“M›Ê¯¤ê»¡+ä«l15Íï^\Qú~üQæà ü‘ȵ´4 BÞ¤S'Ù¥K«à€æ?QK“öóçÙX©©r×Ñ„ r÷›rùî;¥ÿ≠”²MÑBê}‘¡»wåO†‚B«B‘;äÉù×xʤzuùJ ¾ƒüûij"OãÅò—›7—ݹ#öÄ(ò/yß,«züš:õÕ¨Ûþ«á÷“ëÖÉU¯òó;;¹ +)bh˜—ýõë×Å(âÂÛTShA!ò([W‘=ä/¯ó§0޼~-û¿ÿSZY^Í>¦Ë· $Û·Oø­»-,„OÑê¦B…‚©€ŸŸØ¶­àðƒï ¾ƒ忆(²ý¢ìiœÝÊù•ÿh—¬Šló<Ÿ?Q°k—ÒE+þ<-i\R|y{30PÞ¡Êö0Å?Æym@Dý¼üê-÷îÝ+°–¢G¨ªUÙ÷•ID„Ø.%ݰ*ÿUxÁö~»v²kׄOef*}í!wõ`* ¾m«8üà;ÈÛw®®²_Uz––´T¶~\¹²€gêÓÿþ·ÀJËÿöi~ÌÝñÊæ:‚ÖV´þ‘nÝdgΈM"ï3_M)ª?fŒ˜¥›š–ŠÊì—¸ñ¢ìšÿ¬Ž|3AÙå äË,11‘kªiï‹oA+]üö›ðÛu‚lÙ"Ÿð•µò¿þ%ÿE•ˆüT£,÷ë*Iðõï^½d={¼ï€*ãå¥ôìO? ÿ.¯ø†;Ÿò~•‰â—‚ðäí»ƒóçÅž—D^ZºTþ>yÁJÁþ~dþ·Oócè^ÌÏ·ŽŽòWZ·£ììäï ¾μ#¬þ°ab³úõëb¯P±Êi Öˆ3²d‰ŠÑ¥¯/Sö‹O"½ÿè‘Üí¨™ÌŸ/ÿwÉ‚“¯ =zhökkBrë–¬eK±¡%bލ§ÒÒ Øw@ÖYd”Fã!n´Ö­å¯ˆ¼/ÿÍõ7Öà;È›ï€UD~AÄ¡¹i“üÏ‚­øg#¬Ð#=xäMÄ?4S)´6Wæ¬ÞµKìT[[¥ÿxY³Ÿøþ§ic¬LaqFÈl‘ñ‘ÿßÞ™€5q­}ë¥zûuQdSÜpÑ**h]Zk­ö»Q´¶·v±Z—öVŪu©ÕºQWQѺ à† ‚"ŠbiÝꊊ,²'ì ŠŠÈ÷Æéo:É 1 !dþïó{òœœÌ$ysNÎÿœóΜӨQ3.*¬¾ln¬ùFôwÖ,Ö±x±ØàñéSÁ·lŒ¤i-Œÿo/¿ü·%hX“ËU÷»;Ð v ¾‚ÈÕnµ±°¸6ÕÉ乯 ˜Q{.zåHm»p«²ûÆñ/ÏVßDBÛµ!ââQ³ ÔW/}åUÐ ÓvìPô·53’Ñ­[5©üîîŠ J Öš6U\“¥l ŠÛ=•K± bÙÙŠ[E4èƒ>¬˜ÐЭév%OLŸj,u³£,{¦²ûÊ—g«oC†ÞA\ÛËGE‰ímWX¨¸/CƒÒ—É G¾­YS=k–†çR“>mš&•_›»õ`Bw‡?_?@Eé#v Aì@d]hñ>Xd¤æW ™&×¾àìñ‹Úÿü†› ®_¯¸´\ÿöïÿu©¿²û4 |¡-¥¸F岿>Dœ±øxÅúB––¦¬hPúu¾›š¶`"6§ñ°”ú0ãÇ?&x Ï?»£ÎÍM1Ie°fe¥øO>ÍgÞ¼jgg¥Øfký󟪖,([E‡— pgŒÅïÕÕ¿i¼žå?òÝÕ‰lBcj6êpzy Џö›õðLy3#®ixòDq{—ýïlm¯Ðø*nÒ@¡ëµ^zIPÓ«Ÿ/!E­«ÁÚ¸qÕýû+F©<¨R¹Ê1bš­YÔ¼¹êÕRSÅaV9eÇZX˜`$4  VÆÈjÎëM˜)\ýÛüùŠ Uºÿꫪ/TÇDnW¬qÁ ìéSEÛ%tñê¹sŠ–A³ÒoØP,*ª7KIQ dH±:é*4ø¬sç FŒ(7î! ôgŸ=rsûÿôó]c õ\76o¦ºQ$tL£FÏÊÊ å§}Ze{øÛé“VVVl;ì6j¤ûŒi¹²tzí6Šr.˜×±c‡‹g£Šó³U¾O#x9}5'+Z~3³¦¼ÃHt˜·ÍÏÎ$½àÊ£D¤ ¯½öš¤öJ4HqÓ¥&Xt;èØQ±H—mÛ¦¸cUhúWË 4³'÷(»/>õW£ÑéBknP¾ÐúfÚØ*.#aIHаô#"^`Á î­¾Üõ6¾¢þvkuÎJ¥û"÷ÂèpõQƒP³ßÅÞþè‘`¶nff–C z¤4%Zµj¸/@¤Q—ƒ¿>Hžáç»Ã¡KÞa“¿ž¸×ß—Ò›½7ÌtŸ®RÚ·k'©½’ÇܸD·×6è$v ¾Úýºu‚ëÀו±û;óÜ?{VìJþ­´Tl™ôädCœ=Öaå×lû Ò¡àêÄ}‘;åÅ/å2ŽØÁÔÉ“V,[ÂmÀ_zé%j„)Q˜+kذ!%èñ›)“7nLºÀ4Ý/*ÌÌO“&oœ>ÆË¾úg¯žŽ4@ ¡AÜ­hÞd™©©éþ=~»Wrm˜Èr4º½¶A'±q9X²Dlyð:1öŠ}žûâûIŸévÑ‘ÒàÁbk;”û©©‚÷k¼ðþPõ0vÀ„¸þffMy£z¤ÑuïéѼY3ÍFÌdQ;[[åÃ>ü×'Œå:‚{"“ ™ =lÛ¶­Áî•\ ö÷Ñx/õZ2êM‰ì;0{¶b¿Eƒ²ìlÅϨ<»Bƒ27·j˜fÖµ«`¯€·Ÿ!ÛÇկ¼¢ú%Åôêe\ý5&|ÜFº²±JSÎh·Q$yòLz´07Q9 HòX’ƒÝ»¶[ZX(~,„'’©Åô9¨½û⛟ˆìWWöè‘¢›7dHõ A•{· Ä7ÜAé‹XŸ>ŠY8•6p`Ý\B¦™ûBËÎDF*†9ÆTú"÷°ípìÍëNN½MMMœânESNÂíýû½E9ÔK?¸¯Ñæ .”s¼½<­­­_~ÙÔ±G÷c!‡ÔÔö¬¬¬|6m”Tì n§Ou+u²%œ>Ý—xésg„„®èÞ]l/CsŸFŽÓ¦©¸9ÔÙYQÕ©ôqßA½ˆÔíôé‹Ú;ïTÿþ»à«..u°a´>Ý—xé³&²3¸ö»ZëÓýÕ«U¯D={¶Ø®Öõ±ô±fQ½ˆÔ/ŸÖ~ KX½0‘a`ñÀêF°fbjLŸêP y™}î•lôîOž,¸•fñ ôkÛ}¬Y„Ø:Ó§/:Kpì˜à«vv5ßU¯Ý—xé³6s¦ê½› öî-”>bˆðæµw_bˆèÜÄåÀ@–DŽնýò‹bÑ9eKI[V—Š€ØbŸ?ÔÞ}q901\“ß8Ü—xé³¶e‹êõ½µ\ ¥_{î#v€ØoþP{÷§N­öñQýRi©bãv_â¥ÏÚîÝÕ_|¡"ÿìY½\¥Øb¼ùCíݧ>¡Ð}Ç99ŠÍqŒÛ}‰—>kAAÕ£G«È 3Е Púˆ v s‘#[õ &bBû¯íÛWýÉ'øy R;@ìàïó‡Ú»?}ºà¦oU¿öš‘»/ñÒgíÜ9Õ“BìÞs(}Cs±Äxó‡Ú»_T$¶¿¹!l³X«îK¼ôY»yS±«¦r Áã¬Y(}Ct±Äxó‡pîëÄÒÒT)ÓË ¥oˆî#v€Ø ƒU#v€ØÒü!܇ûp_šî#v€ØoþîÃ}¸/M÷;@ì€7÷á>Ü—¦ûˆ vƒÁ`Õˆ v 4÷á>Ü—¦ûˆ vÀ›?„ûpîKÓ}Ä;àÍÂ}¸÷¥é>bˆÀ`0X5bˆ(ÍÂ}¸÷¥é>bˆðæá>܇ûÒt±Äxó‡pîÃ}iºØb0 VØbJó‡pîÃ}iºØb¼ùC¸÷á¾4ÝGì±Þü!܇ûp_šî+ÇLþklÎÎí[;vhojjÚÕÁáHp åøîüµsçNÜsçÌbßÁßw§mÛ¶ 6lÛ¦ ¥¹ÁýöÓwíØÆ>]¶d1{ s|ƒ llZlÛ²©öbEEEÌ“’’‚4ÒH#-‘´P“Èm¨?;&&újNV5ÔffM)gä—‹g£reé^ë×633ãûÛé“VVVì;¼þúëAöæÊ3÷¼ñÆë¼7WþÜ>ÎNÅùÙ”ÎÏÎ$¹áÊ¢­Î““½öÚkµ'©I Ì0áÆµKH#4ÒÒI×( ÔžûùîpèÒ…›I2ѪUË¿&KïboôH0ût ÉAž<“ä [WæÍ©=å•W†¾?„Þ÷¹“¿ž¸×ß—Ò›½7ÌtŸ®RÚ·kW{r@H˜‰š&MÞ8}"ŒÍLŒ»Õ£û›ûvsœ:yÒŠeK¸ïpúäq ÐSz¤4{dRÂíéß}ëäÔ›÷AÑWÿìÕÓ‘44ˆ»Í›,"355Ý¿Çrú—‚™,jgkË<Œoݪ•ò~ƒ x¡êɳ“EÚ·ã½'µíÊŸûá¿>˜8aü(×ÜoÂ$H&ÂBÛ¶m«[9PgÄÇÜèãìôò˦ôHi):7â#)÷•£c’r_9()÷•㘒r_g¹?uø“ïÄRÓ½{×vK ÊÙà¹ÖÂÜüÐÁê )ØÉ¢¦M›p¯á™ý½{OÇÊg… ¡ÄÉãG…ä@ç±eùs5Ò}Æ´\Y:=ŽveôZÀ‹øHÊ}å蘤ÜWJ­òóZI¹/î¬Éßr¼½<­­­I>{t?rHùYú]•×±}G4lذMëÖ~¾;ØÓ5jôÎÛ¯]¾ Þ,+OQ«å³i£Îå€ΠÿEb|ŒbN,>F9\nd(G|$å¾rtL‚îsCtŸÛòHÊ}ãvV›Ø7œñÒK/åÉ)Q˜+#-3î*¡ñ‘”ûÊÑ1©¹Ï JÐ}®HÊ}ãvVËP2Î03k*‚rÄGRî+GǤæ>/(ÁÒçʤÜ7ngµ‘n8Ãm¤+;¥Fi©]B )÷•£c’r_9(ÁÊÿ·Ø”Ü7ngµ¹²ˆΈ½yÝÉ©7œœânEKM$å¾rtLRî+‡¥ì¾ÔJ߸Å}         ´—ƒÊ'ø¡Àˆ‘¥$@@@@@@@@@@ŒƒÂœÌœô$*5ÃDžš@_¾¤áÿ’Åy²yz¾,M+äiÙôV¨™rôª¹Y‰1×¶nðøiÖÔî“ôÌÆ•‹kdóš%ý~ÍÎJ}p¯À°µ@ž‘·ÏwËz…ÚàµrÑÞ›Rbè Q?äèìŒäíÞ«#Ž’e¦É³2ô µöÏj²Çå£"Žìß]QþÈIêÒôßv>2¼¢¼ìiåyôðÁ¹Èð@¿­yY)¨Ÿrô†<5ƤÕua 9¨ªªzZ) *Ÿ”ò/™/O£Ž}EÙÃ'åËiãҒ+e¥$ ~ÈÐga-pŸDõº’ƒª§OŸ>yÂ¥¢¬Œ—CБ^aòeië=Ò—$EÐz«¬äXÔO9’ƒÊÊÊÇ,ׯ^qtt¤Gn&Q_ä€Ô üa©öÐ[eBäHIžVÒx œáÚ•+¶¶m›4iB”fó‰ú#åe¥÷µr @jrPùä13a~õÊ¥öíÚmÙä]R\H”¦v:½¾ÈÁãò²GJ¸æç^<öØÑÐðãa™i)¼Wãco^þóö­ÅyÜ|È€ Mž›>O¬·rð×dûÈ‘®¾;w°“甦öi}‘ƒŠòGïs¹~õR`à¹\^TTt"<¬(?—})6æÆ‰USâ<Ý‚=çÆÇÞâž9I¿›øÃìï{ô°´´ ìíí\]†kÖ3fnnÞ­k×óææÊ3¤&-þkÜÌgÏž-_¾ÜÎÎÎÞÞÞÃÞŠç«)O*ÊË> JKŠ™ 7§ÞÈAÙÃÒ’".òÌ´ ÀýÛ¶úTTTŸŽ8Áä'ÄÅ„.øwµ§ê mïÎs8ÿûîY9ÐŒ»‰qÝß|“š¯Ý;·Ë3RdéwCÔX˜tJRü¤‰èé7S&Õ‹a…ÎG<9ð÷÷>|xîs£ÄÞ½{™ü€€•ùêË:séõEÊ•>¸WÀP”Ÿsãü¿åÈÒ7¬_GÅÏå¿›^н²à“êÍÕ×zU/2?5©Ûùß#٠ȀhÆ·ßL¡&Ô{ƒ§È1Û|6õ{«¯•¥eçζlÚ¨NSL#zÚ²eË¿n;ÍÏ^³êÒ ÅèÃcùRÊážèå¹–ò›6mÊ{«¢<¹Ç²%]hÄÑ¥‹ýŠe?qn8]»z%½DïÙ»w¯¿n5X9pqq9þ<“¦„«««x¾šr ¸ÌþÁ½QS˜_Ê—Fv4Hìãì|8èÀüy?têÔ‰~aª¿:ÁyòøÑAƒÞ±¶¶¶²²áòaÈá ÝÈÁÃ÷‹òò³e¡GEGGûùúîܹ“II‰‡CŽþ~æTèÂ/ª7[*´`i‹ˆ¯:nñ\%KOaO$ r ôg§F )>Fè€ žkè·Q#“nS·Æ´ï4ƒ•ËééÄ ãs²Òÿô#¥W¯ôàžøŸo¦ÐØDù­¨ý§ôÜ9³re鳿w§4©óÒúu«éé'Dߊøx샕ƒÎ;?xð€Iß¿ßÎÎN<_M9PžlWÉ ÉSÁû˜§ßNÌ>uìу[gîßC…~lÔHWÈAÙÃ%…y,—/œÛ³'àúõë1114¼Z²b…×ú>#žy[ýW Úo\»ònbü½‚\î‰9Ð êøÑ_»0W¦`žR_‘Ò7¯_V¢&5)aò×¹“E]èék—(‘’Diz[î‰Ôž«|+°j•w‹Ò4`^z³[7zsã*óôVôƒ•’Ūª*&M‰V­Z‰ç«+e©2ˆSZRôBrp71NÑ>gg2O©ÀŒÑ(ÍŒÝ*žŠÔ,6$$Jïs3éÍœ7÷‡€€€¥Ë–Îþñçuƒm*׿ÎhÁ‰‰½×xPMS~7È€h†½½ýÓnßjÛÍÍÍyzQc(¹Y³fÔþÏŸ÷Û\0oÂ5333¡ åOg&ˆè;0qj•_¬ 'Kj£ufŠŠóä/$ê<õ\»ÊÊÊŠ)è·8rH'r@ÊUÁEžq÷ྀïþó­ïö­žkVÍþ°éd“êÖG‡5\8ã›ôäxÞñ 9ÐŒ™3¦ÓÿzÙ’ÅB-ƒ£e˜7aºš5žÈͱ³ëÌŽ豞Žj)vððþ½¢\Yè\]wYzTd„Çò¥”Ù¡}{ÈÁƒ{…ùòtwnGÿv*ž€Èfd¤$õíÓ‡zÚË—þ|'öu¶©åþ÷¹±ƒ´ä;³¿w×@¨?ÉÄè㘋—F¸|¨Ž,˜7—Ì™5“Òô=™—Ö­YÅÄR“Jò•EÔò3WQ‚½‚H(_m9(.ÌÉ$ ²Ó™ 7GçrðñØ1¤yòLz¤Ì.]ìu$y²Tedi‰þ¾;ÈåµkVϘö­[›ö$‰®®Þ-mBWÿ’‘Ì;r ““•F£+++þ·iÓú­¾}'MœÀ°u‹7åXZZtîÜÉgóF 䀨ìíEAoÒ²eK×.¡‡ƒÕ‘ƒüìÌùsçÐçÒ³··[úó"öÊ¢âüìU¿¬ L ‹^=wló1¨û¸w<{ölÙ²evÏmÅŠÜûTæ«)ììÊ'ƒïÄ\egKâ®_8q¤07‹yªs98øÁ°¡–––Ta¿ûî™Sá:‘ƒûŹ™)<îÄDûïÚNþz®]´?áÖußÍ—;ö¸9p )‚×oìsŸž‘Ç=r @ÿ…U·w%+fWdéDfr‰àÝñÑ—r2îÞºü{xoqA^q^6ój}¹ïà~Q>}yZRè¡@ÆÙukVïÙ½#ónå§Þ¹í·móÚîÝÏuëösçe––‘{ý¸'BäHN¨ÑÏJeÈLŽ;äºwkøÁ]”]”+c_ª/rPR˜—žÄ’•’ð«ÏfÆÙMÖݹ}})õNÌΞ«{:þjg·¸ó™°#Ü!r¤&¼ÙR„È£û-àæ×9¸W˜+OKd¹sùÒÅ~»}Îÿáâ‘Ü—ˆÄØèÝ[6.ÿÅÞ[éHîK9’“ƒ¢¼œŒd.L™—Yoä  W–z‡…ùSÇCB‚÷Ÿ:•‘Ç}‰!9îflôez¤q7r @jrÀ›]¢¾ÈAqAvVJ¼ö@äèf¯ä¬ŒÔº’êNËSÅ¡Þr=Ø+™‘ƒ¼ìÌä8íÈÐ3ÙÉ;6­9´çéÓÊ:’E…!+%áÓa!ü*Ê´ÈÓ¼V.JOŠÍÐz“+a¯d9ú¤07K–q÷׫hŒ°À}’ž!9¨íÙYR”ÿà^!ÿ’Ù~[£N†¤%Ƥk°þG¨ŸrôIé½ÂÇå+Ÿ”S‰$åôõèKøÏXœ'O»s{ßÎMÔ±_ï±Pcèôý»}’c¯ÈÓQ9ä€úHqž,7+E–Ÿ•›©)t®,5!_ž†ß@@@@@@@@ð[ärÈ@9Ý»€£¾<.À(ayõåƒ)0J      jIôvY,ÊKo LQ”(JÈfr ·›æPdzkCP¦(J%ä@39¨61©U˜O1ÊRÈ“¥ÉRÄ‘§&”åê¹ 1©åB5¾25Ü¢¬å²4â¿§ÔÈ64iÒDŸ¥@u#,xï¼i…øÑ}JØáý•OÊ!Žá%ä@Âur O9ÐR>¨·@5¤¢¢¼ZÉîÝ»çëë[Q^F¨³¨lÅIÿ{#—Œl\2¦qÉ'Ï£xJ™Š— ’-JÓñŸZÏ]2b€u@RrÐD•iSÇT–™š4sÆô®æææmÚ´þhÌè°Ðúª?ÔgP®< hѢŅ èµÖõŠÓ‡/{¼s\Åú¡ëWlõøÈÜŠ]ŸÑKõK¨z÷îUœŸÍæPºW¯žÚ7R,Ê:•ƒºjÛ¹ BëÖ­Æ~4:æÆÕÚÖ ¬ÒÔXšÚÈ«Ëðïþó U§Â\ÙÝĸ¿]ƾ_{mHIII¿~ýlll|||詚õçþ'¯VE®£ãŸÝ=_µâ­ª¥½Ÿ%FÑÓª°ÅôR½“ƒ·ÜÇæîÛC9Úÿg¥X”R•¶#‘|'vÁ¼¹ú÷«9¨Û: q9È•¥O<©åsûfÊ$zÊë*0‡Ýо2Úm鵕¥å—áTaDj…¥¥…<#EüsUŽP¨Í™7wNûví¬¬¬>÷©,ý®Pýyøð![æÌ™C_ÌÛÛ›yªnýù¨ñÓ%=Ÿ]òWÔ™ß7WY¯¨K‘ž•_7¤—êìñ÷}oð»lΠAïì Ø-^|ß~3å×­›ÙS¶ùl¢¥Êe¦%ßigk›~7‘ͤœíÛS· 6y­wpèbaaÑï­¾ÎF±ÿñ _}immݱC‡_V,úîS:…ª %Þòž¿ï6?îVtÇŽÕ/îCœzÓ÷¡oå³y£á׉ËÁœY3GºŽ ö!)á6u˜ý½ÊêÑ»w¯ãGP%af¾üâ3‘Úû¿ ûü³q¿:Áˆ‹xmß²i£Û¨‘LzéÏ‹\†˜pû&U§¯'|õŸo§ª¬?þþþ}úôÉÌ̤_þâŋԑøôÓOÙê¤vw¢q¥»UÕ,ËgiW˜)Q5íÕÊ &ôR½“ƒ¢<¹cgN…ÓÓa¡”¦ö×VY|yòÌ¡ï¡?¥ýwï¤t~v&ŠÒ0們oåKÙLeK¾wŸÎÓejŠïÄÞÊÎL]²ø§wÞÈþÇ?3šwõ j”:ì§ç3ÃÀÃA½zõ¤ºÄ¼4eÒ×ÌwཉPq“„íÛã—+Ï ¡s ¿H\:uê}õO&}ýÊŸ;wªq0˜“•FÝ‘Ã2R’¨«@½KKË.]ì©ýa{5¼ã…êßï-¶/A]ˆk—/2i’'êÌÕª3ÎÎÎÆ k×®]zzº&õg‚ UãzÜìí5f´3ÃC-³Pép‹~än]»RaÑ#¥Q”†,×.] "(ÈÉ¢4=vup 6–'4d`KÙÜÜœIÓŸš†‡LúƵKBÁµ6mZ_¹xŽy‰dÅo×vJPCag×™ÞYù{ ·½½—çZ’ ‘É"ƒª—ƒfÍšÑ@ISc«¯¸©Û9ä½ÁÍ›7gjKÓ¦MÕ™B,ÎϦ:;­˜o¬ŠXE(ªÐéuõt²H1À—gÐ@ž†öôHiî¯-T|Ä¢… (gõJq7%T”†* ¡áBã8ÅhÎwÇŸ¦ .þõ¿üÕ¦íßÓ«§#½7x®QùYBÅýû™S4±µmûf·nÜØ–ÁÖŒ¨ÃÀŽè©Êâ¦ÕÃÌÔ$j²Ò’…j ÐhÂÒÒ‚w|òXªc‘áÜ#©/AC]5cOT…˜úC MêÏ'¯VÍPÔ™[G«¨_1Á„Šº4£>†’Ù úc²S l¾Pñ]<Eý½{è¶H½( XB¿ûî &6tþßÔ”úS«3:ø[ì@žaù—ƒaCßðÛEcFêQÄÇܘ1í»¡ïáOõyÇ6Þ‰+–ý<ÒuÄÍë—©séÂôAâ—"Prssã]™ þ•ie«ú–os+›Û¢l’‰‚¹-OWõ­šŠç«,¾ìÌTú›G„£4õÜú÷{K9@ Å¢4`9 œœz{y®eÇhêÈý©Ç~4:%)žP'v@݆åK~«o_6‡útÀÖ-Þl¯}*îÏÆ}J#G‘ÃAÚÙÚ~À•E“¿žhóÜ(Á6TH©ÙÃ÷í¡á:»t±§£¸?zäã±cÚ´iMÇSç“Þ–—¿¥(ONý[æÒgg'f\¬â¾•ò2¶¶äååq+½´p¦änC«QTß„¯¾dB kW¯œ4qвÎå@ù÷ä–¯Ïæfff4LP_hL7þËÏ­¬¬:´oOí6•ˆøç6oÞÜÕe8·µß°Û±G&l¡²}*nß4r¤+©XÈá ï¸+¹žÝÕ~x?Õ¡»Úé¥ð#*c‘ %©PÁµKºuíú¢gíÆ½ÜÔˆëä QR”Kuƒz bÿ¥%%ä€å{wÅ%aIñ1#]GÌš9Cý©ÛOCÈÞ½{±×šw€È0n9ð\»ª­m‹-¾øü3¡û …&¯º:8DEF zÔ’èa 4znCP¦(J%äàE7ÇÄþFY7P¦(J%ä{%ärÈ@ 9€ärÈ@                                    J‚wyÑ‘Œ’jíÅå *ìàµs§èHFLÔñ e9àN åf¦ž ÝOªAãÆµðgŽîÏÉJåɉ‰ÉûƒßF°¤ÉÝØk¤&Ï”à7©‘/KãÊÙ‡Cg&Çf§'áÇéŒ jÿMþn¤Äõs·.Eݹñ'ã†iöMŒ .0zxíÿÿ§£“! endstream endobj 29 0 obj << /Type /XObject /Subtype /Image /Width 517 /Height 568 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 621 /Filter /FlateDecode >> stream xÚíÒ1 À°ú7 ?`V ½ÖXüªC Èà\`<À…$ð€ ÈÈÈ€'Ôí° endstream endobj 26 0 obj << /Font << /F18 5 0 R /F34 8 0 R /F22 6 0 R /F17 4 0 R >> /XObject << /Im1 25 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 34 0 obj << /Length 1236 /Filter /FlateDecode >> stream xÚWKÛ6¾ûW=É@¬õ¤zkÚ&Ý¢‡u÷Òí–h›XIt)*»é¯ï ‡ô‚Í€E ç=ß ©÷ÛÕÝÆ#Æ’¦,³h»x“”eÕe4ym»èïx{”ëMžUq'¬ÀU Hj:õb ¤ÏëŒÇ²£}5Ò¶ Ç¨­Ü­7À á¿ŽõÓ;Ú|–LÔñ^÷½FMÏj<é$rú~ýÏö×»yzíì&MXVF›,O*–“³)«‰÷60XòœE)qýi…›"/¯C˜¼•âZ²æ çeü]«Ñ.È‹¤ª²À&ÆnIW–%õ…i«¹+x ¬€Ç7ö°æY,úYRtP 5‹Õ´Þ°ø«¯ÅÉ«$ÍÏq> ’Eçš:áUõç¶Î¹Ã­k_Ï}•Tis–‡E8OŠ­â[úELG@±ëåkÁX–9¿Öâä—k neUóæ|ùj¿ê*s‘É岤j²·8ô›>,¹rÛ½^®’Wõ³[´z;mÐjZ{«)Âì`PÐK SD¶VÀ QÔ¸×fVéq"ŠØÑ(š-½{Mu<©ÿ¼½¿ÙâñQ ì"^,»DþBë+òÛɃ۽útžfa†.̾+í8b{M2ÌB{<ó*CûFžŒœäˆÃÒºÀˆ®oGïÁˆÓÑ9‡¨Óêv\Þ“êÐ~ ëÁ­ª¸•}?¡MŠ&'ãAFáùe«ÇŽÖ_p=¤˜hÏGÕb­Žž¼ ½˜¬'©`ü¼éS…š0H1ù0jwDQ¦ý5йÒ)T!»„à⮬iÚà’jŠ$ö¬|±´ÕŠ‘H„ ¿oðLÃÅcZ¦ŸÖeéÆ+‘ž1<ð˽<)ÄØ##m RޝÑrÁñœ<ª¥3àCü+åƒD÷ó4Í“q¨Û å­S=¤{<]«‘ò"§Kæ&IÚZÌý—"x”È NÒp×.J`&;Ï#ÂáNŒÐ Ka),ª*RB/‚¦`îHuÄ^MÖÓ\Ás”Ï´ç. DÃä#I¾?õPºS€£çÑØvÀ1POÍôöÈòâAM³èi,§¿[ìv´ÇŠx:jcÛÙº\æ,þÉ¥óš¨P¸¸.ÄH7)÷‚ðw“¦Žw³ô ¦vjÏÊôØÁ«;ÙY“gÚ“‹ÎŠakÖ‰Ÿ¨üeí2q°]ÃpRô.ÒLžš°ÔY6¤A{¦Àpr’¦ ㋊†œ†8vξE@¢wK=9á5M%ÎcojšÅn æž'1Oä"öÝ…p ùÉu¼•µÆ¥’öz¢íDhç@ ƹLÂÇ¡ÝjÓ-Ì1Ÿö“eïz°ö×òíõc‡Aß}²Úx¢ýbP^6öDÙ` UîÅÜÛwtðÊ€l.§ÀìgJv‰¸OSDŒw݇]0º„¡ðÝ0ff_|#÷p¤À¸ )ÃFâE ÎÿðÐ'Fæk :(^XõlDV?oWxa€;GÄŠ4©à~I–æQ;¬þ]¥Ié¶ÃÓ«Œ»—²âxw?dÑOzõü‚ÂMи¹Rùþ˯§¬)’š±¨Î(uðì0ßi‰ endstream endobj 33 0 obj << /Type /Page /Contents 34 0 R /Resources 32 0 R /MediaBox [0 0 595.276 841.89] /Parent 35 0 R >> endobj 30 0 obj << /Type /XObject /Subtype /Image /Width 628 /Height 568 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 36 0 R /Length 55762 /Filter /FlateDecode >> stream xÚì½T[ÿ°û®õ}÷Þw}÷¿î é]±£¨ Ø+bEì½7Ôc;ö vÅ *ˆé]ºô^$ €(zÎñœ»g&`( ¡i€ß¬g±föì½³{&ûÉž™„ÿü§Å2l’â?b–Q3tÑÞ½qÃþHq(s‚¤‰Ô‰Š4úŸ6ÓÕ‘C¤ŒØk¼5Ü`½¿²)XyÙsµ§–è­ïK¹3ÊxsáZo]èYÆnï&²_Û¶°Á¶Oêu°©–}üÈ~†«ßé@Ï2f­üyŸ ®%Ǻ *Ž*‘ýÚ–»ê ¥"±ê QÛ=j{ðÐU¯õD9î2±ÄÙÙåÙšVét%á_ÿE #sæÚžÊ 2Ì˜Õ /óoÑî2¨8ªDök³{®k÷T‰±'rÔê×+^è5sôÑÄ‚³góOŸöÙ¿_4úúë¼¶½£¤±¿ÿÙ뇀Íñõˆœºî¼´Û’ð/Øk–Þ°±]wyäÆd…ÂóÌãk}tº *Ž*‘ýÚ¶0·ÒVÞ6ÚÎE_$ִÇC׬y{ä‘rôÉTò­[¡w›GZ_¿Þªô ÖûÝ¡üø·Íò=/lÁêÞ~õKšŒ9d²Þ¤cúËÄ·såÃ!ãMu ‡©td—Ñv .)'V¾Ñí2¨8ªDBmã6+J ³µÍ½ Ö¶ ‘‚vI¨ ±äž.+bgÐhÛú¢dŸ;÷véÒ;û–„oÝúÇÍñ(%ôÞÑ‚sçr¿Ómæž8‘}ð`à…í­ @ßౕw-îÒ¿sn7ØX}È̵ ñ ì¿Å·Ù<Ð_ödúõô°ò/ßñÄzãÞ1}Û‡æ× 2ØßÿøV–}Àþ‰Vç“eøõ[fæÁ×ÔrTì{]„«·éö GyŸÿB[<Ú­“Ï ñœKBšÜ:Åälãó­±¶-{aŸƒIÿ[F¨é2”·p¹ëì‰Ö3￯oýa ìÍÛ!p@gäR…' 'ìžêuTU"¡6ÓuŠÿŠYЮ.×Ö\¶mJ»µ!¬o ݺÃôRgQž°Û~nÔ«òNž,8þѽµyéÛ¶‰’¶m[öÑ£oOnUdŸoŸðð· ýñìÁÆÃfë·6°°ÄÀ©w¦›î˜|‡úY(P­‚óåßÉöÖÚónÏy[õý3;;%1*.“Š{ï_v°ÍÒ›KïÛnm±|«¬Ùby/\x å\ÒðsÞ:ûÑì•þNÜo«·ÈÉhSp2ñ¿_‚7MPuxIsÎáëôìÞ8åp(j…ZÁNº gëL:ÇiFZ+>úè°ôŽ~—AÅQ%j³BIœ[Ñ®îÔ†Ö[mJ¨ ±øšáÖí¾£mn´KΑ#™{ö ±fìÜÙÊ­Û·ç_¸pÿÆrqÅ@6Y훀«ékØf#ýIzãm fž4X|sc">ImŒ\9~ó3B¾äG‹GUÓ¦eb5kü “5Æv·ÍÆëŽ™e>ÛfÖ¶wL,ÇÅÚJÏê¶qoôßÊÇvã´ÌÒþ!Ìë±rìðÑû>ý‰Wwfú,=Ë[-Ü:ñèÊ0l:úWâ¡Ñ&«Ç_Á¦¼ÿÖ­1Ts´íRßz‘œû íÓAæl0LÍÀkÞ¬³pXÙe¸•â½€“ ÎvTU"¡¶‘ 1¢¿&JS›hñæ¥m=mkCX×'ܺÉuÌüFí²Ü~Ôåùó½ììR¶lÁ®oÝš¼e ZOÃÅšºu«³¥å‘m⊀lb}×…K\~2kälýÉöxâ=a"õÎôÉ?ݪ5rÁÄ-†–'Œ,Y?įßþû=×ãìáC{Ïú²p·†¬§i²rypÓltðD½ÉÇݪñÊnYé ;lC(ž³ÒyÞXí±kmýEf£æÛP{žc/ýgüéK1جµÊu©‰ºñ}³-¶-sZ]Ø€×ûg¦ã¼ÑêzãuÇ-6˜¸ÕÈ+ ÃÏTºýîÔì}F]G•H¨Íx¦ z_ ¿&JS›hñæ¥m=mkCÌ=dÐäV“ù†¸²yaÒ¶mH©ïíì\.|³v-¡ÚO›7;.Y"¹,È"gºs…Ï2=>4eæ~#›Û¼YÂg™nXiÛòœØ_ü`‘ùBƒ™GÛÞ´Z}zÈz¿|\¦¡ëLÕ ÍGlÝjªi²Ü.HäJïÔ‹?Ý:ÜrØÖh·®YÚ­Ûñöà× ¿5â—‘_Z®5f‘Á”#¶¢9÷X¹”ãQ1]×OÔÔ5Ñ»ÈÀ|½á¼pL™Æx–b»6”@;þš¥(¹¶Î¹UbmmÅ*A¯¢µ!æÎ[7¿6±:e(ǽÓ3Oœ]³æÎúõ›š\;i¬±n]ÈêÕ®›6I. 2‰‘í»·óœŒÛs‡k _8å|ºðY¦¿4†àó¿?R/:è/~ìŽ_éýQòøEd¦0áV»nv¥…[·ÅŠwëÔž¡;ÂÊ›Ú@»o­£7Qo¼­Áœ³¢n5Xø*C˜¥ŠRRF.£•P¨7® È8Ƴqí7¥]yýTXË̘¿f+vX[[Gw§¶æÆ´Ú”PbîÑ&·¾1YpÆPhŠzõÙ'vMöYµjÏI3„ÿºuŽ \Üaã³v­ÿ¹]’‹€,rÚhÞ®-N©´züÖëßué^7v™1V3œŒÝÁœqxæá¡…UßÁ©Ls^-¹8È& ŽN¶Ö>^C¨þeêú&ZÃgáßÇÙ…=¢0g£¾‰…¦Áð¦½c´Ç,2˜}Ð`Ü4M}c,QßT{Ôd l¯±¦‰µÁÜz#ðÌ“õ&î2œ¿][/8ÜÒ`ÆqÃésÔ±œ#´Ç.3°tÐ9âgN¢=–›t ðŸJÓ©=v±ÁôcxúÉ9ç,Õ ~NM‘6³à€²Ë°¹¸¿þ0IJ­2£â¨’_V›Ùj­¶‰´KBmØÙ¡É­&  %€æ­7ÏA+növ^{—¡gG[¿½{ÑŠÓë¬#G$™eÁ)Ù› '.5˜`-Ä|¥ÁŒƒ† ˆ ç çî6œ´ÌÀ̦iïƒyè½cohaÛ”²ÜÀœ(¾Ä`îiÃé« ‰Ì“v.8ah±L˜m†ƒ¡ånCaN;˳†3Dr ÛsÒp²]SK–Xž¶A4§Õɶ?[ÛÌL8š€ì2lž¢óûSsuTU"ûµ!,O ݺõÉ¢‹†x½ÓæÁf+´²÷Ô¸8{û+g;µÎ;uŠØ›±¿äâÀ@fØ|Eg¯SsuTU"ûµ!æŸÑÿùýÖˆ¸xpFÂæÍ¯wÙ õ§»—ß8èz«ßž=hsÿ%‹¬ýû%2í]Û‚ÔePqì;¤2_ÂêœÐ­Û¼L¬¯Jà€õ„‹3g:î²Ùunü»U«NÚM>fm}ÝÖí²?;îÖ±9’‹œ!Ó•ºI_©mc“[}L¬¯ÐM\èøw™è„[Û>s@×@b<ÑìßÿðÙ5<¢Y£ÅYIH¬àVè]·r™t Én­æ2蹕@§èÀ­B²[«8•ý fŠ“¹òXÇNoTØ#•÷x {Ù÷ä\C‰¤ºä¥²ž=GneWŠ…•ç: µ¤qÈM‰|²ûJ ”f¸7¬LRÙ^æÑLE«§d¦hbiä.CÒÈcŸÊsýo:ö.‹ÛS/ÇHq2ÃUˆÖ™=Q9³§[(r°ˆEeð”­Ná,ék¨Èºf¦8d§WZ.¥¤”ûûŽ,@Ÿ@²[ùlºXX¹¯fÊ“4Ô•LŽ'ÒˆDZ‰ÛbMU=%Ì­¥’Êö2ÅÏç«(Íz’Sþ3±Ìg³®Üø ñì9FòmÌ­½Ps‚,9…Ù7£¢£¼î§@ÒÝâWØ2[‹^!¦†ÒȆ*ó\©xQ µôs:p+‹.fî« ZÖé ?UŠ¥0²^XjÙ¾{œ<îV"5áÕ¾¹#aÓ%íqË.ärP"-öœ‰Ò¸£·Ž-©¥H’×2ßî’ÄÂ2í6P¶|](,[ê±LCws YR3ÚƒWä¶LM~ÊídNS Õs…–ü$§´r~%®Âóñl,ò§»§`W:I Úcm¯¦THhCé§ëk¦À¦å$y=‹u×cKiXÑ EÖi¾+ÔI-³ëx{ÚíQD+×Q;Xr*6îåƒâ¿CŸ4xOp%^¿éíg D’3qˆfµmVVdÎKT"þ°vP›Ä x(ÿþù£ñŽS2´Øñ"]lµ{ìX2AGn¥‰…™ƒÜª½ÎÕcÁÐ]t“å-æœ ‰¤>í´_&›Y’v‘Ö Ëyå|j îµáK½V,©íSà·FKnÂ… º°©î6jJ3ïäWÒšÌÇF N¹ÞX¬ER±~™MÍUï¨x6ñÍ#‡ãn¥HÎ&emb‚bgÜšª ±òm.W¤åâ*¡µ{ìdƒŽÜZ!F6áV%øÀp½Õoƒ.MК÷8™~ w+塬×!µ^FdTDŸ3Qšp%‘MTE Øm8hÑÛlóZ¾ð%JÜq¯Ij†8P«†† g0©y÷g(©/yWXŽ¥Ó“psŲ°<áç¦(“†L·ÝvÊÙ#­´\ؘöÛ@-ò9¹|‚žbs$ªK|KZV(ºŽÃ%û2QÐ_õ´€^!©CD[.Z‰¸Žêlo`Kô5Õ&í|–K#êW)žh°øæãn}E‘œMÊÚÄEó_§#?Å%·\´åb+i÷ØÈ¹µ\,Íne’ãÒ0™l¨½ðu>•-t+šè•Óü×jËO~œMi]]Í®¡Ñߤøï6T]ø6_A^Ëf#¿YªŽ¼V(©bA­N¼ûcÉ'' í5h2…§Ó?áæŠa 7s=o;îµ›nH" ÙäSH×NÞSk5å)ÇÜ’óŠØŒòŠ«µÕm|JZVغò4·Uz &ûBÉT¢6±"Šh%â:ª³½,9…YWC£Ããcã J)íñÍ+ ß®¯2ï%Er6)kT“[©¢™%õXÛcוó ç‘ìV.£\,•˜[µÖyW0Ê §MI$u»×¥•å¬4Ü­!Å(+ýæTyÕEOÓÙ­Ê–GŸ­dv5‘El–ùï2T]ð6Kp©<ån*‘Ÿ•rÉ\N{“¡¤fˆ‡™pfœ¼þ¦{Ç'Èëohª„öé2×¹fËÌìÜGs•ÕWzˆk=|Ï¥iÏó¨xþ²Œ«ãI*6Þä–¶¨œœ|u†ªêŒë äæWÛ!¢ˆV"®£:ÛØÁ’S±yC‘x Ä7¯(læÖ2ÉÙ¤¬MLPX~o³9"™¥é±ŸÇ®Kç @Ó‘[©b©ÌÂÝêUm–”d–RÊP:+í*îÖ",=Ë{£iдÃ.~)© É¡®N‡vÞŽ-æ–ÄG×Q•ptÍå2ò7é«Xœ‰-¥pJ?>^‰&$:›ü $5C´ø›åIJhR³ç#¥917W4ö°M¤ã¡s¢ò2cCoÛéË>K×V¦Ó,í•Ï’˜ JEÜ­eº$’*rk‹ EÖ)å!ÆÈkÛ=Š/§Óq4ŠØiÑl‘ ÅvT'»;X„[[¦·ª_ló ›ÜJíÄaíìѧgy®Óße NK‹‹ötvvObŠ©Ḏ£È¸µ’*z“[[¦³Rq· S( o/«IÜ 4š´ô°gf)—Ú4ºyJñÑõM.V<çíÑÙ†Jòʆ7_¾`¥®»É¯@R3$Q–{wš<‰4êXxesbn®³ÑÌJjeÜ•uS†iÊá_-2mǽ¨ :U|ŠSî­5ÓRRÕÔ2aÙÙ‹Kt4l¼‹[T(²^š‰&¶­¾ƒCÄÛn‡ˆ6[´BñÕ9è¸[­ßPZ¥·ª_lóp·Î}Y&9›”µ‰ŠSýlϬa*XveC‹Ï“Åõ˜¸c Hv+§’@§èÀ­t ¢#·–Ð)$»•M/ StàVZ)B²[Y´R:En­( SHvk|ˆB²[?EøBýâÃ}Ð?Ä*aÞúõK}ã—ÏÀ/õ6ñú OäºU4Ы4»ú\và³,z9“FaÐʺ *Ž*AUAÀÉÁ­àV@U•\èïõæÅ#§gnuTUR^R€*„^p+ŒóàÖ ‹N ôqÏLMlüÒðç÷o]ÏHIò}‡*„^p+ŒóàÖ “FASNdƆúÚn‚*AU¡ ¡W@¶àµ=ˆD")ÍØù"­¼yÚK·‚[É0heÏÜBÏî»U‚ªBB¯€,ÁÈ¿7GEaìÞçaiñž—¬4H#ÄФÌÓ~:¸Ü HçÖÆ†zA7A•€[@æ`%œM2ÜÌ$ž]̾=EAcõ‡R©òˆI·‚[©Üú­±¡NÐMP%àV5jÈÏæÈ+Ûx6ýŒ3Æa„Üȱ\)òpĤ·‚[)Üúý[ã纚nòÜ ²?ýâx9½aÍ÷O³XÈio `J‘‡&&=Ü nÀ­n·‚[p+pM·öy·~ý\[ÝMP%àVÑg™vµ|É·TªhÈôõCŠ¢=lrèî¹¥#a‡;n~Ç1Ë!ŠØO}Íüãñƒ•Ò¸o­€ç»ÃßîOprÜwL¥«B í1 ¸dÐY­^ÚqÅ8ìTGÚ] ¯äIŒ±ÇÝÚøµ^P%Jq&S‡ÀdŠo2Y “Al¶Ê@•€[ÜÚ[;5¤s2œÍ[ê ¯hÄ;`òÊïlži¬Š——S32µ²]Ìù9Ž=ñêΦ‰:-‡ßNŒðRŒÕ-šÚfë&©5Ôe·ÖTÚƶÔVxÒñGÁŸ/Á¯¾Ë ž[ÁŽÞ7/6þx‹ÍÁi©Ñd›#LW±z˜Áç³è!öÆxo[½È¯n_g囼J|ÂÎ`Gíżâ,§ŸQòz¹©óׄÇàW xtzYE5·¢9³ÅzÖ„aÚò„÷&;eVŠ~Å»µ^âK·ÓTqnmë¦f·v¬¡.ßo0ãÏÁ7念Iô~|Ö¬·Ù«H8ygÆ¿yþ©‚ÅþhO\žàZ‰]fVfÄ–°Øìæy÷#t(Y•!öCÛ\íRvÔ|2®µÎ›\Ãg³¢#uÍ­Œ‚; ™ú•³¼’€ ÚR¸5‰!>FAﻕI§"‡ÖÕÕn%6Ѻ@PCl‚[ÜÚåû­Òé® ‹€j¨¢¦f‘éÂ']KÝcS¿A+>”õ[%6¾Ý±ºe¢71¥ÖP×ÝÊgŸYâ³aÕ%nùÕœLkâ–¯¦éì‹æN†Ý>žò´)àd6?ˤ 7b”±IaVËg™äõ†i÷Y¦á³.ϧ)Ž´\º`‚Zgžej¹—¶Ý€¸²êÀ±ÍÓ´„·µ;p+_BŒ=îÖÏuUlz ¸Lìšp­€˜¨›5‚šÜ­h³u~6Unp«Tn•~H—έñ5°£v&ɘN³Z¼hÞxMâyœ+)ôžr« ³cµØg™Ú¸Ij uíh:°CŸ˜‘^Èd³kèIoŽ.57À¯+”õÇÌ\}äIFeÓ³ÜÇÑ.⠻ƈyÇ~~çE¦ÄsΪC¦­»Ðê;8­º”Ÿ÷úðÜÁØmRí ë/\Z¢ÞE· ¸ÅŽ6#±»éJÆ–œOŒ—Ê­|ñ1ö´[¿|®ã³é¢ÔÕðE¿ÐÚv³U~Äp+ôX4j€÷ÛœÐVJPfT„M§öœ[¥Ò¥s«ø“Ÿó|ß³¡šÄå`9m«ƒ/S8|v¹µ³cu»ßÁi×MRk~OXÖhrk-ŸEíª«æ‰;â-ó#P%àV}‚|=2S¿4üùý›” Ì) Á<»îV ÷¯$@ŸË¾[»¸úhŠ\ÙP'è¨*n·r+UÑM:åV6Ào¡kÿV’ø'’Õ\p+¸Ú­õµnaürÄýë+”Þj¥í?ºúú¹Ü n¤v«€Ç,ï&¨’N¹5ÌÛ­û¢è,íþ„8¥·ZiûƒáàVp+ ½[ê\Fy7i·@qkÛ¯´#Pz«•¶_`·‚[Nº•ÚMÀ­ÐgÜÚö+íl:¦Ô–+m¿Àn·pk€[Ií&¨’NßoõàW#î«(½ÕJÛ/€[Á­@gÜZí¤tT‰ôn­æ²Ñ›€_O×± ¨·‚[N¹•SIé&r+¿ñû­õ5|£\ú«R(3*ßo·R¤QÐû¥®š‡&žzY—AÅQ%¨*T!ô*È2ÁÞ%F‡°+J¤ƒ£Ì¨ü.¸äëÑÙ7š¸·^ï;VÓ/Ž ›°é]û=aw6n·ÒPÅa”—ø{½éÔ­Ý·ž¿×[TªzÂHn·à³h²É¤Q´².ƒŠ£JPUПn·‚[€Þsk5‡Á©,g ¼ßmF!£À«É¥ õ{Ï¢SëjxàV §ÜŠ&nOï] ö{Ïf1¸v¿©³Ãzû­ñkNFrTð‡†zÁr+§ è¬õèA$IÁhÆÎiåð~ ¯òk4éÝÊ¢QÐŒ‰õßþµnýò¹N2H¯höJüàÆÀp+#ÿÞ…±{Ÿ‡¥Å{^²Ò 8Cƒw(}‘_= IïV6rbÿV4ÑëŸn­¯¥^PÝ*åA9[Y çF“ w3‰e³oOQÐXý¡Tl~5åÁ橆 $ìS¡¶©Ý &ž^™òúÀ¼‘ØgE’öøåWBŠªðü5(ý Õhu,]ÉpÊ.·l>¼ýè/¸•pkC}m3ÙYvvËÐ_ÑÄæÖò³9òÊ6ž%ÂfŒÃ¹‘'b¹â¾¥’ym’¢Áú!Yù9y‰þo½Íc±Übÿ-ƒÕÌvº„$äeF¿?5[CmþÓ<†€[ä»IŸ¤muîmdVvJ‚ÏÃûÞYàVúÍ€nÅÝÚØP/ ÈÎJ·´œga1 ýEëÍé(Ï€r+?ýâx9½aM·$8Y,ä´70ÅäçDïª:ãq^‹G©«òïÏ4òT"M˜Âþtq¬ê´‡9üÜ;Ó4W½/®w=ýq@·bnýÖØP'@dg¦ÏŸoùöµkƒþ¢u”BìByÀ­NE=Úqª2IaÈ »gч6 %2C6é’Z/£NÆ•‡lÔU˜ö¢ˆoyúå€Ö ·þÉ <·q¡ÅpM55µéËÿü©«¿«n¯›d€ÒµF/:æMmì ýw»õû·ÆÏu5ˆ}ö{¼ß{ë´ŽRˆõïÌ­½„‚Ÿ®äŸ{÷­˜aH"oõ/c2C6è(LyZÀl•“ n _hÝqkÅûóW»ÞY3¸…[ÿª|½TWsêqŸ¬’‚wW V3?—õEBºl¸µ¶Q[Í'VšiNhnÞúßÕòÖ¿o©4e«‹ŸY*k¬ö£Ta—JT­_æW·ÌPׄè×Z÷¯ 7f9ŒVqëŸä[“ÔFMû"­ë|ÍÁÛcëŦ˄[¿~®­’ ÊÓ¾[éÁ;ô°+cŽ>¾d7J•DR¹ôZdaáûCó‡(’HÊߎ(Ã?çðÊïlži¬Š_HS32µ²]Ì‘ÝïàäÝÅY·žÿþòMÒpâ‘õŠÄs‹f®y”ß²å츫G/> ML/.H‰¼»R_~Ìù$º€[ì·Å4h污™ÙéQïîÝ{'‰&àùlÔ#i/pôˆÊÎIIð}xß že ÿ h=îÖª>,ÑÐYQ'Üý½ðйºùÕ¢obÒ¿Ë‚[¿Ö ª$ƒòHvk‹Eu¨èeyãl>›l¶¥8r†ÕbË)ctäH£R˜2ëV¶€“xfñ(ìisyƒi;š¾jM Û¨E29“Îj‘™›rkôášrX„*Æ3w?N`ñˆk/éïŽ[›já1hðd»ã> ü‘õ¤WûæÇ?h(NÙý¾ƒ@ÿÐzÜ­–?œ®>òHÚצ{¬L·yêÆöIubÒ¿ô·ßF©,|0?¤!;½©ìÜ—ó•° W²9ìJoL´{Èi,ŸNÍÎ/Ùt+л{Ü­ õµÕ†dPÉnv8šÃg³Â¶â[†öQèCQEÂ!clkÄÑ$&›Ÿ}gŽ¢p&«¤;jºín§À<>Ü ní‡×„êÕœJÉ <’Ýjz1 ‰’µÛ.û\¹5þà|J‹¹UÀgÒbŸœÙb=kÂ0my±“2+Á­àV©že:Öò™¥˜z±é2àÖϵ5UlºdPžnºµŠššE¦ /u[¬Œ]¯_ñ¡ Ü nýù5Öºòüœœ4ÏmCÕ&œ ÉÌÉ-b4ü@Ú¤»-ÕÕœvÂ7«´0úÞÊÁjfÂïàˆIÿýn­¯­æ³h³‚Xi¦9åé¦[Ñ®Á$yÓiV‹Í¯‰Ï[Ç_I¡ƒ[À­ÍVª \¢Öb²÷S.]~ü­µõQŠÆ¨G½~þv„˜ôßíÖºš*>“†H ¡d눒œ´´¸°*v%ZGyºéV~Îó} ̆j—ƒå´M¬¾LáÀýVpküÍCäM£Á ’ãB}Jó384JafRlˆWM·šÃD»ÄºµwޏÜÚ§Ý*¨æqå•Ôâ¸ï(÷Ø`$VN‡A¤£<àVÜ*­[«xÜJj3•”¢ÄH4c­bW6'¢<àVÜ*¥[kø" ŸEGbMAyÀ­¸UJ·Vó8lZ™dPp+гneÑ(§î`³ýÑ­l6­TzY—íþò!¸èA·r*©Ïî]þð÷ßõ3·²*J$Ã,''džGh¨€[€žrk5‡A§;_A³×û·ö[;ÍXüª¹ìºj.¸è)·¢•ºš¸}ý\ןø\+UD(pþ/;"àV€âVÜ €[Á­€lºø•núôH.Ù­”ø•@Ÿôƒ‘\²[€›F özùúá5×û—.€ºu ›N‘ìVney\¨Wл§.}Elðû˜ÏþN¿v@/èÒ‘Œ7µêÛGYÉ1 ŸÿüÖøç÷o@çøÖˆº.+)&Ì÷d·&„û¤Ç‡±i¥Ø? ïË ö£(Òã¢ÜûA8ý>Øu¼ KHD2Þ`¢yn®66Ô7~ùü¥¾è_¾6Ô£Ù«d·¢1ÌŠ’JJQyqNyqv_&‡A)bVQDý"œ~ì€:^Ð¥$"o0Ö<×û—Ñä ÙP¢n”ìÖ@.ƒÚ_F¶ Šh` Ôý Øu¼ KHD2ÞàÌ­ß¿»åÖïߤr+³¼ßŒ-(ü¬i?v@/èÒ‘Œ7Ü n…Ü @—‚[Á­àV8«!X8^Ð¥àVp+¸Ü ÁBpV@DàVÜ c5¸·BƒÁ­àV8«!X8^Ð¥àV™qkã—zÐePJåÖÊrjQvÿÅ‚"ê7áôû`Ôñ‚. Éxƒû[j«>W1Á­]ƒRIÉM K?v@/èÒ‘Œ7¸kÍën­pÝGv´·vÂòNšþÒ³:?ìÊ8%“%!ØþB®¿ÃHÅñçCK{¯ªÞ?[úÁYÑ×#’ñw­y»µ:ýòX¥‰Îyu]SOMþýIÊã®fÖöŽ×ä¤ì ÿWæšÿð’<û[‹£ïýa5Z[ž„Í¡Öûß%eRóƒÇ*=ÜÁ0"e6)(‹÷ÎZÿ¿Qï•ÞëòYí4UQyîíôÑ É~›õIÃ÷…çÈ[{$Ø©¤vÃݾ)}%jaÜ£©rÊ ]ò~fHz·L]nâåÔ‚^p«”§ëork?8+~ÕI"Û ÆÈ*ŠzpÂÎb˜†ÖýŠÚ&3Wžr *,ü=Íëu·ÖRÃÎl?õ¡¤¾7® xÙÛI(j‚Ïlj—«úê*XôßZëÿÖÚþ·vŽ-¶‰Ñ®vkŽ÷Á‘$…1k®½pòö}zùÄæmc2~µ[ Ò³¶þͽGÉŒíÚY~o¶²ÒÔ;ñ™?3d¼Z§#7ö¤˜ñ𷸵‡‚ñó òE¸^›£B¹ÛÕßôû’ÕWB·þò³"“œ›Ù·Îó_çÖžjpQvQÐñ*¤Aæ«ÏÝ{îïçèþÐéøº¹ã¬ÝÒ~OózÙ­ÕµÕÕ}â²ÀæóØû=Øñû³ÕßnÏùvsÆ·G6ß}~{¾íêY·–F:˜’4W¿mu?ÑÕRñçg^­åÞ™©ç—M¦ŽmÊ뚯<œ‘Õ^¶äˆk«,ôð9°–Éâ3s~éS””6ƒä-.…5й/m4å'\ù˜Ô^û[Ž–YîÛô•f?Il’²‹ºÎ:dl=;èÑŽÃáQŽY|Æ=® {Ëÿæ`[ÈÈÌ1 “Qjûa¢O¼IÏZ+£tí ›.ž¯¦µ ôßBnN»ÍÆ…hzÄéì’Qj(]sü&çrWÎjaUc\<8ÇHÛ3iÛ½Pr[·ö•³gÌn‡ÓŒTIr£} ·Ûr™HŒ[ËRÝ/Ø™jcóB•asv<‹I“tªÿÊç‡\ž('?þHëke™D?SP?ïš=;MIJúæ›ïG–öróZ¸µŽ™ùdÛ4Câ€êŒ[á”[%t«Ù…77W›j`]g±Û-¿ÀËÉtÞ0s¤žYʦ;)¬šf?vã¹ÆƒHrcOûÜn¾&ŒïšpêÁ)›ÑZŠ$ùŸU ê˃mF¨ ªt'ï¾ÇFCgs8CÂÃKèïM1 1Ÿí¬[ëVüÏțȆÿ”%ü¸hþã¼é?äh´ù#ð ÚÕ³n¥$9[*‘Lì_eæKþ„ŸìxäöKϘè°(÷‹F*mzß&[iä)3E½•×ÞÄÆE&½z|ýABn÷åÑ_q½G|TëäÀ’è¾\SnœC\žð]ù|á ¥iW’ ĵ_ ·ĽYc0hÜ'w¿„H¯§ªšå›)Á¶u«˜0 "œç¨(ŒÙøðCH‚ŸósdM4àüþ:pkûá´ßlÌ $’ƈg]‚ƒß¹ì«¨2ûabfWÎj¢*¥ÁË_ÅDx}xªšÜ¨#©-Ζ>tVÃ1Ý÷2¢¸ £ =ºÝ–ËnDíºµ ò•i°íuwÿX¿{X¨Fí É{ªÿÊ—EŸ3#)νKiúç¶J—¤5ûØcÏØè à—W®¿ˆ(é忉ºµ.ÿ¶…¢áÆ'Q%ÅÅi¡ïžzWBD]5fƒ“_JF¬çsEÕ…o©h6ÊJ¹{éY@\~a~vÄ£c”†ìàÕ7åWšx< PPËç3²îµp+z'Ît /­­cç?]¢¥†W%(|¹pâxû·Ÿr‹“Þ™ª‰.έõlJñÅ„[ÿm³n¥¿sàĹvέËþû÷¹1ÿ$»b>¹ÿ#ê6æÙÈ[mù_hWOßoMùxy±1vG@wÌ´…›^òŠM¥ttõ,÷¹•æà-Ù­³ûn¢bq;Vª‹Ne™±¹§Í‰Ó¦ÝÞÃnÜ»ì&¸Ù©¥Àc­>i¤Cö!¶ìÓ-KË{ÑebÛß±[Ëâ.OUv8Hø©˜špr´ŠÅõÈB¶[Û³ôã3ƒ^É V>Û“4Ѐóû6l¶w{°½kÂÍá´ßlÜ ¶.9Ä-­Ô‡‹Ô´V¾I’þšðϳ¯Jy®“ðÆ=*5N^ãÛB‘³¥/DÏ,{F¸I\ËKd6¢öÜŠÒòZ«\ •D7•Ó^ï‘,îTÿ• .ô\§O¼Ï/µis½ð´Ö݀Ɠ˜  êËžÆQ~aŠºµ&ñà0ÕYÏÈUm® “4×ú±ëðM†÷2 Ma­ÅÇö[¦5ô@"¯)ÿúNÛg™ð];#øÄ.VÀ-]TU]¡“…Âà?bYDUÕ ‡†’´Úu« $5gËÿ›¹æ?„[ÿúë¯æ+á´I¸µÌi Úd^ë̼õ¿íWùqPùŸòT¢Ñʽÿóצÿ ]½ñœpYFȇ'—ÎÚ¯œ;Lž¤0þ¨o2¥õ(”™îvhé8ÝŸ×ÔЧšŒ6ƒU–·Ã$%’‚ÑëõG¯>Í{ã¯4Þ7{óÿA=Cœ6íöÚ•iÚ,z}¬K¶çîÁ¤aû¼‹‹2“oLQR[ø*%K|û;vkÇJí6cÿˆ?|‹e!ØÖnm?Ì÷åÚJÓŸ¥6I}`©Œ˜ÿí!àæÂÔÓ^¾Ä]Bá¦y«˜£Ön³‰kÂgƒ…—ײÞnÕWÿ4Q¢[ÅÔU¥`r¼ù¾jò‡ º ×Òrž-}é¬ .q7E-®åY2Q{nÅNiùI÷>55&ëí=ù‰W#óÄê¿°Á­ÜJÉŽüèüjŸ I OÜW`-Oìø¡ˆl’Bã׆º3îÂ4e’‚ñŒå»Î=ôÍap±Dnò…1Šf72ª…yÂ÷ ²ö¦ÖÕ°©çWšëÿ| ZX)Ì?ázº0?/ëîDeÓK)Õª”Ìof6UaWÅݨ£4ϳœ'lF…Ç"í!ÂMhïˆÑ:б±±±VdA›(í¢>ß…òdoøÚÖ äÖMÿA2m×­’Ë¢”Æ­Ìrri^Z;¤½ÝoLRYp?+Ûÿü¥±'ýŠðtrü­ƒ”'í»Ÿ@ÎMËq[ª¥få–’VÚ2FvtØ3G‡­‹'ë“HF«ÜSÛ}¡—ÝDï¡uq½‡våßYƒòdmø¿Ûo-ŠE$’ò)dÿP’á&ÿ”ÀËæ ZvO²%µ?ð-ùbíOwÛª¯4ëaŒ°žd4ñÑ^û&>÷µ–¼Ùí˜öùýÁ"âÜ—ªÉM8›˜#6L,¥iO>5Iº3OYc¥[Üï!7êá9å³[…c~!I|8í7;ÓçøHÅqgŠ…g²Û}•yObZ/éÎj¬*“£>Mgu‚Ïz]…I—S2ž-}è¬hÕ3âZ.»µs’­t7®©%i®›õäÍ/…äH8ÕUƒÉ§ÍHŠsîD–ˆd <¸t`å #Éx[•#âí,Q!.ö¦ÊÜ–¨©L;ù>³ŒVSÍc…¬×Q· ¨äµÎßÖ­mª’Þ­FàÍf·644pE´I¸µôîòì-ÿSË¥u­Ëþû×–ÿõOvàGØU¦×ˆ›Ä5áÞukNØmsiêõ´¬€ ¦JcN| †—¯ÍFJ“î'çCrì™1$ÂM-²‰BŽ»6KIÍöeœ¸Ã]øÚ¡ù´i·÷Ю¼« ²6ÿŸ’¬øN ,EÁ‡ÆÈ鮽¶oœ¼îÆ·ñÛ/âÖÌ÷‡†+MºJÆ+)Žp¿ÈQç,äUæ;…“Å·á7+:ŠŠ ³8Üa¼¼þöw D‘|¯-ƒI­œß‚D·Š=jí6[*·JwVcU‘”çÜLÉi2²©¼Þ†Wy"gK:+ZõŒ¸–ËnDí¹µ8â”™œÖꗱ·|ÈQS9íuoâ¥9Õ{½ÁÙþÌåäÆ ÍhÇ­X?+¨Û>ùXÒ‘[{°yH ß¾~ië Aé Ke5â„È‹;`¬4ÂÏmkØù·ÌHª]tkuÎ͉ Fû? UÈ;0”¤%έ^N$áVA›…p+/;¢¶ŠÝ ±bóÖÿùñ~æÓÿh»é?hóìû}h—䲨;åVrÔ¥¥³l_ºãéó>ÌçéÝ}3µHò“ÏúåE?·TU›{.ècDZb\ÁNjӕµlï奿ž·Ö&‘T‰Q®E¶ŸãöÇ®½ó øíç}ÑZWnÄÑ€$ G¼8Ò8mÚí=üäZ’›"ùôkg`ɸ8Aޤ„>coñO'Nl1íuk^œç]eóCÁi©%i>NKÑgtlÞZšóÑuµIÕbŸ“kTD@¤çý+{6^ø”/#ÁŠÎ[ņ|{–ŠÂ˜ |â|oãx 'þ÷‡ yÞ*&œö›-[¥<«q·’”Ûžñ1ÒÛõÐT5Òˆƒ>‰-Ζ¾sV´î1-—݈ð“DaŠƒ§×[!‚ïÍW# Yvý­oŒ¯óìY¦ÝAébOõ_|ò>š¢DR3_uöŽËßw¯ï\Þ»xÕ%¸¨—›‡¹µQèVnµc—ž‡%g•¥}¼¿J_~Œc Sœk ÍQÑYó:·º†ËN½¿\—DÔE·ÖñržZ R¿÷u|VaâkâY¦!Ì:Å=ÄÕ9¥6–°ùß_¯š5>^òõ¨Ú×­ÿÁ8ª†m^5C»:pkcçÜZ’êycëüICÔå‰ÛMFf+N9?Vÿ†`S³&Áñ‚·@Œ¨[§ºŒ‚.7Oø,Óïv+=Ð~š~)œ¤f²ø˜o!Súâå¯ö•ÝYöÛßÙg™dŠ‚ûò¯Ìïl©>:V÷ƒ`Ôñ‚. Éxƒ»Ö<­µÕ\ Ëôi·v5V÷ƒ`Á­Ð¥ý/"o0¸Ü  ¸€.·‚[Á­pVC°p¼ KÁ­2îÖÆ/ µU Ë ”Ò­%¹©ýâ¬î7áôû`Ôñ‚. Éxƒ…óVPd7~Þ oCB€³"0n…yk7Ý óVE!p+D náÖFpk7¯ KëÖâ~ô6,Hn-îûn-·B—ö³ˆd¼Á¸[? ª8@—An…QB·BDÐàׄ¿4€»Ã·/0o…QB·BDÐà6óÖ&]æ­0ŠBàVˆÜμÙ ¤™·º»ÜDy€ȱû°éÉnÅ¿Güùs ¦ŠWÍçTñØý#ŠÅ‹¢nËéÉ@¿äØMÂ|ßtèÖ†úZ*¹ÐßëÍ‹GNÏÜêß Q¤å%UF«¾B)¤$tBoPÍap*ËY4 [Æ@MB «þ%@?ÇbÓJ^?¼Ú¡[kª¸>‰_þüþ­ƒbÌHIò}Ç¢S[õJ ý ¡z^¬\FiAÎ#§K§î8±ë/ÃÓÍåÍó’qù0Ôï=ꄺŒH ‡^ÖáýV”¡šÏA4Þ¢ ì@EŠâeÒ(­º ¥ œ~× ­(ÌË zîúò†ÓMZA›(±'aeùÓ{ׂýÞ³Y .‡ýË@êìð3ƷƯ9ÉQÁê0\гn­â±Ÿ=¸õç÷F4 P¤(^­¬Uw¡”Óâ:áçÉà½ótüìYH\ZF!…Áæ"Ð ÚD‰hÊ ÍIÈ¢QÐŒ‰õß_»nýò¹N2H¯höúõs ôŠ[¿56Ô (RIný ®Šò³oß½íõ ù44½Ü-ºìa(ùQ(ùutÚD‰hÊ€²uü4rbÿV4‘ü=n­¯¥^PÝ*åA9Á­ô’[¿kü\W3ø.Ñ­¢ýHö]㪆@+¢5ð8Œv×ûA'3VäÍÌ"êæ+¡6§Wž Lg"Ò˜RËÏ£D´ e@Ù:œ½þ^·Š^ÏÎʰ³[†þŠ&‚[ø½nTóŽ;¾@Ž[w¾†úª€VDk “ êëjêêªÑßÒ’¢~æÖwžîhZŠìIã}áÕ}ã×}[{14"‡šÅ^}!”-hdÕ4–óP” e–a·þ¼¼Ÿ•ni9ÏÂbú‹ÖE¯ƒ[èM·~ý\[-ºû”Û' ª¸’svºŠà3–F $IuY³UñS/ŽQšè”#“E*Ñ­?ûa§Ç0$VÌ­ÃDkHMý„ôT[ÃGÓÓ>õFoô0ÌËÕu6…UvØ …yYŸ=c°¹hrŠÄºîRèúËañ…¼yÜðlvPk¥cÈŠóÁŒê¯6§P6”Yò£M¿Ó­M—÷³3ÓçÏ·|ûÚµŠÇAÑ:Ji¾6n —ÝZÕŠz?/¯Èñš«ÍÖ[+ºvŽØ}Áÿà©Ç‚*NÛÌ-”½Mj^tMm<É| E¸…·Í÷øå•2*+’+— ?wk¶¸J¤p«0gb±·ðšp±·h ‘‘¡Ÿëk«Q'Ô×F u©ûXL/§u+À. t+½ÃN ‰K M+_åÂÇÝ[À‹Îã¢ykH&Ë?•éT¹üæÖ¥g‚P6”é„[¿$ïªÖrÑZQ‡v¤.š:xgbC÷ÜÚ| bŸýï÷žÍsv´ŽRšçïàVzÕ­õH¦"ÔÖðCãl6ßp¸~êqœÃãÄc÷߉[çðáS.5UœVù[€9ENaîݸ´äôOaž—–è‘æ>Ɉ-ˆÝk¤bõŽÙÎ.^5Ÿ'éµZÑäÖ1:tk‡/áããYÿ¹ŽËe¢¿Øz‡ý0ûVD|L¢¸, «NúpzÜ­ÃèvÂs×—…·è24E]s!4,›–ÅÉd¦c7[½’*=hn±¶g‚ž„S^E•¢Ì¨H'Üúã ³(7G¸dE]™¦¦³Ò÷wëí.IÂ]¹E• ?ºïÖÚDm5ŸXi¦9Ü @ﺵñk½ ª™º~Ffî¢W݉<ñ0þðݘ·cÜMÜs'qåáw[ì¯"‰æoMMÙÛYr*¶¾,b“›prIo{­³3Þœ?R ›Ái_q5¼L€eþ9­ÃJñ0?Ž;ríÀãA$¹±g“ªÛ–Â^…žþhë4C|n¬cºüv·ª/kæèv}ÕX ,÷¤¯²ªEÚ†"•äÖ–ýÐ.¯\Ÿ6|©g0+Ðß—®O;ÑMÔäÝ·RS³z˜]ƒm²2®LVÖYáNæ7=tyϬaºjJÊÓ÷½ÎÆÏLwZ?c¤©þäNI >VžüÉ{Ö£µIò"ÁÖRƒ/.¡‚òëNÞuÏÙ¹5”Þa'ÜpºÉ`s„?¤0üRh¢Š”ê›ÂðIª|ŸHw§¹Æ”?¢>/»TrÝ·eFEºxMø¯JW+M£Í‚þ%ܪ¿&ª¾ç® ·{)¦íE p+½éÖ/õ~3U\æ‰ó.{/¾»hëüå‡=³åBÔš¾ —ŒýÁfTˆæoMM)îZ¯¢xKRš÷$OP]¸m°šùîgáÉ…9qÞgæh¨Y=/äÔ è1» ±y+QS‰¤d~Ì/¯ªšÃ©, h¯TMÎÍIІ…ç&¹?yWÈk*«i²þ–ORêGÃfŠª ^—r›Û†"•èÖŸýXÔtM¸È[4º;÷¾6~-§•¢¿wï;KÛ-à=^ 1hîƒ?Ùq’’Î÷"Asà f¡%«Øc³±’éÙ$êŸ$ç .~Ñ9ùÙ™av˜( ÙÊnί>ã\hQMMeÎ-5<ت‚WÖjr£¶¿ŒÍ,ˆa?aú±1”Öa'n½\ü6®Â'¹Ò7™á›\‰V¼>Uz&Ò߯c“Ö'áeW| O¼É¹ì•×·þI}0C}¨}¡Sâš°–ºšššæˆÙÛï%òÿê®[¥ø˜„ò€[øeneÒ©sV]Üu#j×µ‹×8øù¼G˜Y_›o»?(àC)¹ †ÏîÈ)¢÷Ugžü@åóEfu&™)ÌÆO¹lª:ýqAm{nÕ\çG(I\)nÜaª3]05‹¼4Qv£ߤ½·U×ÞBë‚[wz4='ì1Lô%n;Ýøþý[Iiú‹Ö;ÓhÑ:ŽŸûÂFCuÊέ¦ŠzëÜ©Õ?¯¾Ò›A¯Ê:CÉpw·eµL_[-ã}ñla~ý¡bÃoµ– ¶&ï¶…‚þÎ0áçNÄNÃæ×•Ø /\_fQ_G—{—¿ðDÀ-ÿâ!¥Ï")O#(BËœÉ7üŠ.{.<áá}Á›JV1õE§® ÿ\¾]5W}<ã«p³Ü÷¾‹OtJFêÇw—–SÓ˜{—üÜ @ßvë׆º*Ne3EyY³ÖßÛz=vÝ™0ç»Oò³ÓÓ“ì6 Ézæf¥:ë†8rþ5‡Q.Zê'ì<×™r ³®‡ÇFFû=8`¡¢dqæ­’´A§õ£=¤QÑ,NiäK·r¢xeÜyÅñ—?qðM±¥Ê#ÏOU&) ™¾lû點TzsÙ W“¸DUåA» -ò(jnŠT‚[Eûa‡ÇPâ9a´"Ýmçÿø;¯( ýEëí÷€h?̼Cðñc.•Fìåfß[ J"é¬ö,¦w1#¬¡,j—ÂÔŬ ò‡Ó+Ìô~ZYúBäW2»–Ü*XzàzÅYnä¦f”¼š¯¬µ>€Üa'„‡E&fÄæÒ9P8Ÿ­O"ŸÞ *¹\r/û‹Ö­OR9 ‹OÄçÑ#?e„wêY¦æ¥1ëôµ ó¿µgƆÔc£ÕÆžÉnìŽ[êk«9 É <àV~™[‘@§¬¼gs:Òt½—««'“VF!¤%Åäd‡|T_äo¼-]{æ#”(Á)*K<*‰dÜœ¡¨bõ8£ùòSžäÑÚiëV%óBeÐÅ–ª¬b$yݹ`¿|º!‰d¼å™Öª,®Õ…]rkL®û×A´Ò·6÷CKheÞ›Œ°û§S®%QDܪ0æ\»©[·é"·æ?·QS™zümJa)—]IX££¾¤Ù­mƒ¥¬×Qžû®¤éµJß,R•Ê­…yYO_`V”r*©è/R¼ëø‹Qɦ%“V<(ÈN-õV.î÷ áfÁ‡5Z$‡Ä”ÛSåU?Ïâµ.R‚¹už[9±IÅ”q=™‹or³Ä•ú /ÿÉ«sOŸ·Ž9Õ­yëçÚ ‡’å·Ð{nýò¹–Ϧ5S˜›±~§£Î;#G¬ñÝÚ-6.9&.éÀ9÷±;“ÌCw—m´¿‰²‰–ú +çî”ò¦ÆÇÃHzÛý’}6M?ò, 5#)%üõûœJùlræVW*‘ŸsÎDÉìz‡Ødæ¶[ª2úâaÇGAqI9ñaÎËõåMÎ&”µ.[ˆë¦ ¹m(R nmÕ­@mü† øl.¹ýÅ®n~kDéúAaæ•àÈh!¡‰YÅ\fÎû úЦGcËiœ¼§+´•,£ÂÀI$%ã7|Ó3£½OÍD}"º„“}g–ŠÎª©lv-ÁÉN—„Üê[F,#ÍeºÖ¢›Éå¼òØK´H˜[‹:ìþ›‡Î÷œŠ©´í×ÃÖ\YéâŸÊHc¬r A‰h™J¿vój`€¯äT×®[ðVëiY{°ÿnNú’åtüªkP|Z&v¿uÅ05õÙÎÅÝ»ßZ_[Íg¡C@C ‰•fšSPp+½ëV‘Á‡J.p}õf¬ÕYãM‘&¤Ž°Ï²5gèÎâ1'X/óÇ:ð'Ø>zíꎲµµ„0s^ÍS±q/oN©L¼i!?h‘K15éí‘Ec5‰›†F¶GÞç Ž±w+‘™Ö¤Œæâí”b&\[?u˜¦þÍ!Ów>ˆ¦3Û”¥âºqÿÙÎŽÝÚ”3&çðšpÎ"%/+i´®¾¶ª†ÜŠþ¢u”‚ÒÅ÷Cë;ź›}³Þ®ÖWwú#ÏV^äº\GÉÌ1¶„hüøc7ÏÅ¿Y¤k±Ë%‘‰å)I½¿ÎLKIUSwÈ»s—–êh,ñ-•,§ÀëÌÂaj*ê:ƒÇ­p89oöz¿¢;¡ùÊð{N1ŸÒ¸|~›QÊK(ä$rÐJ1‡c“ÒX]ß¼ðð|³mǶÔä„θõo¶‡–î*¾ÈX¿=Ü4s´þ³Ú£-wÝïþsÂu5U|t>0i{wïôxíJ¬#Ð:J!ÖQp+½êV«¢­4#%áü%gS« FÇ/št‘6ùÇür͈ƒUãm9^¹2 l¢¥úºµ9ç÷¡ÄsÂh¥91·I¯h!V”ÒcÍ£Eã®üÄþM@PÍe2h”wïß>õ"5+—J£óø|ZIËÊ}þêù«WÏ^½|zõÆ¥°Èà¨èÈí;·¦‰ÑëoüÍCäM£‘ci9ïÅÓGô²âç.Ð:J!v[è]·Ö×ò˜Íp奅Ÿâ>Þ½ûhɇQ nê/ 0XnbóhÉzÇ»÷£](Ê&ZªO€"•äV‘~@J>'ŒÜ*RCn&¦Wj9kfjO6¯wëµOìßÔ ˆ ¹•Ç¢³èÔôÔOþ>/_=»åtñìù“wï^‡úÅEGF„­^»ò„ñË×.HÐëot« š‡ÎO‚¤øèyóæZXLBÑzs:Ên 7Ý*à1ËEáTR*J 2’ãƒý½Ý^>}òð.­ M”ˆv¡ ­Šô P¤Ýú³¢³_ׄÑJ«Jr3Sp±¦ôpó„nMdÿ¦N ÜZÅap™˜[éÔ ¹\˜[“™“™š‘ú)õSü§¸häÖ¡¯Ý^®Z³âø‰£ÍzMOM”!·Vñ¸•Ôf’â>.³]‚þŠ&¢<àVzÏ­ õ.ƒ:hèÖÒ ÝJÌ[9Œ FEYE¹Œ\@.È)ÌÍÊËJÏÎHÉLKJKNLŠA†õtݬ×ÐàýöÊŽ[kø" ³¼´U Ên ÝZ'ý<ßA‘JrëÀèq ªW>»Í^Ù•åȰ4 ¹¼´˜ZRD€Mf rÐLIÖÇëÒë‘c_º¾Ø¸y½ì¸µšÇaÓÊ$ƒò€[èM·Öp*)©D·Ö äNÕ+aØ*IMc‘gh…Íj+ËKÑ”¶(/+8àÃÎÛÖ®_íãíÙªrêà6‹ñ;ÜŠÌ^*ô©â²Ý_>·Ðãn­æs^óÙ 4…aÒ( ZYÿň"Eñ¶Ûc¤$wÐ#n…¾p+€[Ü ¸À­np+¸À­np+¸À­np+àV·}š¶Çúà—½ÜÚP_ ôEÀ­àVà—¹õS„o|ˆÐSˆN^¤s«è‹Hp+: ¾~©oüòè>hPE;çÖ:БìVtü ,°ÀKO,]pë纠/n…X`·àVXúÓòÏ?ÿˆ[pëçÚj±ðS/ŽQšè”#GU¹÷&*›^Nïbq@"àVX~¥Fëêê*++‹ŠŠRSScbbüüü\\\nݺuõêÕ³gÏž?þÚµkÎÎή®®AAA ™™™%%%çëׯà\X¤[«ÄÂOÁÝúÿ³w&p9lÿËÅ]l÷ò”VD\{)mJû¢dkUT´ïȾ'¤lYC¥i!Ú÷½”zZTOû¾=Ýÿwž©þnä×Bõä|^ßW¯™3g¶3=óžÏ™sÎÄW~#Ï7¢"Ë×ZÝòiZUÿVGñÍ@lEúÑjmmMMM}úôéùóçµ´´äåååäädhRVVÖÖÖ600044477755=xð žžžººº¢¢¢´´4äÌÛ¶mƒ W¯^ ,,,¤R©¨T‘~¶ÖT•õl­øFž£´œRZÓŸQô*[‘~œòòò”””xxx¤¤¤ôõõoݺõêÕ«¨¨(p£``ËÊÊêêêš››[ZZÀ–4a¢±±ìmiiinnnJJJxxø‹/.oذ——WSSH]YY‰Jiä³µ² r´£úú¹Ó¦€¦±¬T8WRVSг•ûÈÝÓÛV0B:óZm—¸r<aô…‚‹i™Ù×íºV@Á7BËÏe|Ê`ÂYS¦®°t;‡× GUt.Zeé`!¹”iú”?ÿSe•ÙÞ‡$ý ›b]§}é‚$Ë®—䎣BÑs ¶"}Ç*_ø dLKK –sÕªU:::ÀÁšššï² €/ _½zõîÝ»½¼¼Èd2XcTþH#”­€EJEÂÙµÓçîtôOLKI þÐéQj)…Ä)Sf/ÛqÎ#,òµ«÷ô™[îe•ÔT’Ã.Ú9{%$ÇÇú]ÑZ6c¾îKØbGþ<¦^IeåÅÅyÑö8[#+º1z™VQ‘Ÿà$ÅD¢mª,éæ–YÓVí»—úî®ßl@ø®—yÄQ¡øF ¶"}/µµµ!µµµßµk×7²²²~ÐKÒ¦¦&Ø×¹s礥¥åååíííÁ£K€4RÙJ 1X8SÈ9µø?7pg«xTÐfóžÈ20ïòí¾Â§²L ôB?uæWõ*"Qâ/ý—­ìZ/‹‰E^ÊL,°©Š¤sk§Í3"›* >À9… ±±iÐTQQqòäÉ5kÖ€Q}ýúuyyù 4="lìãÇeeeEDD`¢¡¡] ¤‘ÄÖ²â|<>æÿkÊ´ùršÖ—ÇäñÄüÃ˦¯>VÒ‘ç¹ÎÜY®ieŹžÖŠÜlÓ§tj¦ŒgvGþUÇßù #.ðüµâÈÛâŽMÍà>ÞmSdï,36<ÈÌï8ŒÌ»[þfÚáÑ1‹¢ç@lE ªªªnß¾ÍÏÏ¿{÷n0ªCu~~~bbbRRRïÞ½W‹® ÒHa+¹# “ÃÜ.ÚíW˜;eÊ‚=ž¹eùÁDž3DZˆ3Å]SKSoJ‘þæ7»‘šYò‰LöVaaöÌ&wÏ_Nckhq1¹§M‘½UYfˆ<Èì<†¶¦ÿÿQ¡è![‘¢‚‚33³-[¶Ü½{·®®nlraa!xgaaa''§êêjtuF[)ŸÈÝ¢$Ùiã_ŒÛž¦SÈÁ‡Àlž/&u± pßü·Róhù?ÆZ=e¦ôÓäîù ÂÏsãlýô‰ÜӦУNðü9w¿_&±ëüÀý ¦ÌÞñ,ýË£BÑ-[‘ú­ŒŒ %%%•ôôôaÒš«¯¯¯ˆˆˆ……ªF l-ʃÈ}Ôè°ãóà°”øP¿ ì.³ ý@É{CbX1-%ÇâÔâ8{á¿Y¶ÝŠüT”›÷ö‚<뜭YyÝóçÓØz8äSQ^O›¢äG\›9Kûö«°ø ›†ë§LaÚá•NŠob+Rÿ¿aÃð‰õõõÃÐM«ªªjjj–––¢+…DçlÍ…(|{jÿÂÙSñw§ÏоD.Ì¥äÑ€ø¾˜–‡’ãMb2¥(#òòvn¦3g³Î_-è˜ £ÔÓ¬/òç‡ÑØ îyS¹Åɬ¶pþ;fâÑ8sLl›ºO:qT(¾ˆ­HýPnn®¬¬ìùóç‡mÕkaa¡ššš••ê‹D×l--Ì>Qlºt:×éˆìauTÃ3[‘úªªª*===##£ÚÚaýï‘‘‘!##sçÎÔû‰žÙúqH#'ÛïÂå‡/ãcâœòþ5ƒÿxLÞÇ¡>*:ÄV¤> 8åè訡¡QQQ1ü6**jÓ¦MÉÉÉèÂ!Ñ)[K r†4²³Ü÷òÏý‹Ö“‡´Düà£ØÌ¡>$úÄV¤>éÓ§O²²²AAAƒ€/¤ž={ö¥££3iÒ$ …¢§§H…̾4õiTCØìÖ­[áÁ]A$ºc«¿Çôˆ­H½—££ãž={ú±"°ZRRB̳°°tÁ.??_DDDXXøÑ£G'Nôññ!ÒkkkõõõgÍš–³ßï[‰íËÈÈDDD +ˆDwlE…F§BlEê[wïÞÝ?¶îÚµ‹J¥³jjj]Þ³¥¥EYYyñâÅ7oÞ=ztNN‘ù/]º4nÜ8@*b+b+b+ÒÈS{{ûãÇ¥¥¥ûW'Üexauð­IIIí4åååiݰalÒ¤IÏž=#Òkjjôôôº|kAAA?ö°–””„Ý¡‹ˆ„ØŠ„ØŠ4Ü”žž¾zõêòòò°ôþýûÙ³g¯Y³æÎ;îîîRRR€Ôû÷ïgee‰ŠŠv/_¾üâÅ H744lhhxòäÉĉ­­­ûÚN888XAAB¡ +ˆ„ØŠ„ØŠ4ÜÔÒÒ"..îïï?@¶¶µµ]ºtiéÒ¥¿ýöÛøñã988LMMkkk©Tê«W¯„„„&Ož|PTTœ2eʨQ£úZ9lggwèÐ!Ô ± ±ixêæÍ›zzz}ýøxxxxffæç)`+põêUp¯èª!Ñ/[CCC§ü/Až÷Ú’uaóú#×,¥W²“ÖMoªŽsÖYÈ@"‘ظøtü@¨_I¯y¥ÂDê§^x=ºŒˆ­H?J%%%ÒÒÒǯªª†x…CÊÏÏWVV>|øðàV é»ûV@';;û—í)ý ¶’HÌ"G‚Šš©­õÕùªóH\ºw³>&ûßÂFâ;™Üøï¿mÅO¿šŽ|+b+Ò *!!ARRÒÖÖv¸}ÈÜtFFÆöíÛ P¿¤‘ÁÖ¯b´W`íd+ÇÞÚ\+ù–(#ç¾j♸壣 âõ=¥#¶"¶" 2ÂbcceeewìØ6–¨†r» G!""bllŒçGIlíÓÞ‚µƒ­L]p¬×ãœ-îNéüµ6Ę,™-vÿSMémˆ­ˆ­Hƒ®ÚÚZ ˜  àƒ†ÖÀwNž<ÉÍÍ}ûöí> .„DlíBêñãÇ{ Ö¶2 ß ·þ?[%¾dhméTÄVÄV¤¡P}}ý76oÞ¬££Ö×®¯ß ñ=’——ß¶mÛ›7oè¢bkÿÚ M›z Ö/ØÚš[”qáþÐšŽ…]uÂ=¤ÿÛJ¾!Ì"p5±±iÕÚÚš““sìØ±Õ«Wkkk'$$´µµýèZbbû ¾¾¾RRRBBBwîÜ!j§ÑAÁl%hû°×ÿ²µ£ÍÒêý÷#³sS^žÿo[¦/Óÿ­òß>gžò½äO”òʺVt[‘WµÜÜ\nnîíÛ·»ºº¦¥¥ÁMà»Ã6X^^{õêUQQQAAAggg€,ºH? [û¦nlÅûÚÄ:ïæÄ;Õ°®–?ü"¿å›éíu —UV± >8ˆ­HCKØÌÌÌsçÎ)++KJJ8pàöíÛ‰‰‰ß…}eee!!!W®\Ù³g„„„††ÆÃ‡‘WEBlEBlEúÔÖÖ$¬å®]»–-[¶~ýz---àldd$,j¥©&ê"Ò!Csssaaa``àùóçUTTV¯^ÍÇǧ§§çáᑞž^SSƒ¨Š„ØŠ„ØŠô³yØ––///^^^www0³k×®]ºtéºuëÄÅÅ—:::411±¶¶¶´´„ @§¦¦¦’’’¨¨èªU«–/_.$$¤«« \¶··ß¸q#P! ± ±éç8Ð÷ïßoذáÉ“']´­­­ÍÊÊzóæ xÏ[·n]¸páøñãGް^aâÔ©S@á;wîøøø„‡‡çååu ZXYY Ý·ol/b+b+ÒO¨âââ-[¶:¿WÇ@3p¬ë•+WuEBlEBlEúÙT^^®ªªjjjZSSó}·¿fÍOOÏÖVÔ! ± ±égQee¥……ŶmÛJJJ~Äöïß¿¿aÀ,r¯Hˆ­Hˆ­H?ƒZZZœœœ„……~Ð.À »ÁWWW£GÁl­@¢O!¶"}_‘ äåå ý¡¦±¢¢¢Mcc#*v$ÄV$ÄV¤¬ÔÔT‘ ÂËД”AAÁ»wHˆ­Hˆ­H#Õ±–––îÚµëàÁƒƒ3!ìÑÓÓ“/** ½xEBlEBlEyžZZZ*(( æÉ›ššìíí%$$Èd2ºHˆ­Hˆ­H#Lnnn¢¢¢ÑÑуl!åjjjuuuè* !¶ åû¨Ì] á_€ØŠØŠ4ºÙääd>>>!yõ™››+ àèèØÖÖ†.b+½±µ4õ‘¹ŠØš…Œ$‰ï\|)b+€5;;{ëÖ­'OžÂÈŒŒäççþü9Â+b+½±µ$á¶¹¡ÍyÇ“ ó[‘hª¯¯×××WWW///ÂÃhjjrvvÞ´i€]$ÄÖ/^Lù_‚<=ã.æÄf>Ûk6 <L$ÆùÂûï%•Ж”åÛ« r2àŸyå’±x’B$W”åøŸP\ÅŠæUDÏñª|[‹â˜J¯bÇ?;Ÿ癀Jû, 6\€؊„k;ÑR—"‰J¥íñTUUikkkhh ¯Hˆ­^ÙØØBCC»Fh(¤ ¬l%‘æn²óÏ*-/Š»¡ÄÁ.{?«¬‚’~Oi.i…†c@Lüû'6b¬¤µ‡ÞU@ú…9 Üû]B“ÞÞ;À(³µì£ÎRv7¢“ß»ÛIÌ›#s+‚ØŠ~Hß`kll,O@@À09¤êêê­[·ÚÚÚN' $¤a^'ü%^{ÖN¶.Úÿª°£Ž÷ù.N ¿JÒeaÆÏóʉ¥ñçøêÒÒíóÏ'²¾Ò_Lâ¶RÒolbã>QÜùf5ö$/ëÆéeˆ­HH=(77WNNîøñãCîX?Wdd¤¨¨èÓ§OÑ‹W$ÄÖnxí-X;ë„×Û'u8Ì¢7–°Ë{’ ´0ŠÝùPމà ýEœÓÉÚœL®;WÏ}"Í‚ûÖÂ@NRwqéb-b+ÒÔÔÔtøðaee墢¢au`---·nÝô£%[»ð Á½k'[.}ÎV69Ï<[7}ÉÖ|mNi÷¼ÎÕó<åYilÅóo¼•QÖ›}"¶"¡Ú`oooàW||ü0<¼ææf™¡m^…„4LØÚÕ´©·`í™­”ä+ÂŒœZ/ÈÝë„„˜WÙ„wøÑâH;n¢N8Õi##›Âƒ¬2ÄVÄV¤ÿ¥äädá\ï TO}äÈ‘ÚZô?Œ„ØJ{ZX؇Ü=°µ£-—–ó«ØÄ0·ÏÛ2¹ÈÍåPpŒ.*//н®<ŸDckEÙGo%$ö-V÷ƒb““bC<­®Du¯¦äÅ¿ûöõ­] H\FOÞ¼}‘RP†ØŠôS9V …²{÷ncc㦦¦á|¨±±±ðàéé‰^¼"!¶öY=±ïƒóÆ^M`‰ÖGÚüIrGJöË£ \sXçr.åßiwB’½³NqÒ%^Ú«V¶¥ÂÛ{fto'œûH⿯d9è}L'ÄV¤> xzôèQYYÙÁ4¸¢R©nnnk×®MLLD ± ±iØ*$$DXX844tXµ îIuuu‡RRRB/^‘[‘[‘†gm0JBBÂÞÞ~˜×.â˜ÏŸ?ßÜÜŒ."b+b+Ò°Ree¥®®®¦¦&Ý}ˆ<==]HHèñãÇèÅ+b+b+ÒкT`hWÿP˜vqqKKK£»siiiqrr‚ƒïjÎ 8KÕÚHˆ­Hˆ­H#‰­`ôL0M&“ÁúÝ»wîLk—éÖÒÒÚ»w/q:ÅÅÅÇŽKLLDƒK !¶"!¶" šêëëåääÆŽ+))ª¤¤dggGG¯Y¿ŠW ‰'Nøøø,\¸ðk×®¡Zb$ÄV$ÄV¤ASZZð:oÞ¼åË—·± û!Ž™3gŽ=zÔ¨QªªªuuuèZ# g¶ºÆíEAØŠôÕ ágÏžMš4 ëÔôéÓ€DtZ‰ ‡]VV¶sçÎñãÇwÔ¬Y³Š‹‹ÑåFÎlõÏ>„‚±é«ÂúúúØõË/¿HKKçææÒÝé´µµ½zõjÉ’%cÆŒùüŒÀºººº¢Ë„ØŠ±iTZZúÏ?ÿz>'Ñ„ è´pkkëÓ§O¿ÊVeeet¹‘†7[mQÐc ¶"}©°°°±cÇv1hôèÑ“&M:zôh^^ö[innNNNVTT„óúü™ƒƒ£¤¤]q¤aËV¿l[ôˆ­H_J__xJÐç?þØ´iSddä8¯¦¦¦»wïrsswØ?ÿüU #!¶—HRÛ2‡UÆÝ±i„©½½½¶¶vÉ’%D•é¬Y³À®æçç˜~ à»vïÞýûï¿Ã9d8@×}‹F8[?ØüD‘¸g«›yïò[\³â^½„™öݦ…"ë½Í^›sAl©ˆìµ}žç󃃃ÿúë/€ø;??¿úúú‘W> ÅÁÁ™™ì¹°°pNNNO¥å×Ct/:$$ÄÖAf«Ói ë».zi;óü“OÑaÏBK÷ÓgE¶>EG^|:öªÄþ-åFL…{RÕ‹Ôê€ìÚ÷ ‰¥Mª[Š›©õˆ¹Hß‹­`Äè)Òôt¹¹LÔ¥Ìa"1p,Vr<àC[ä¿÷ ê?óp¹Xbã±wVÄ*¾±º2¸ùœ¿D鬜(­ø¢ƒ#ú+—°á¦tÎÚµz&/¾¹kŸ—›3p¨½´&EØJwP€¿•••ñññžžž—.]277ß¹s§M²²²òòòŠŠŠÛ¶mÛ½{·®®®‘‘PÕÚÚúСCÇi²±±Y X´wïÞ;v())Á*rrr222âââðŸ<{ölKKK@óóçÏSSSÁºŽ XN³¾µ"·>:¦ÒíUÉ…ë‰|zì¸ôÏÉ”u6)œ† ëÄþª3Z#ëehÅŒÝ7Ñ4‰É.mŹLaÇlÙ{yZ^EÖ¡”ëÉÕ~ŸÓ[©¨Âi lµ¦§HÛ¯Ë ,\¦ífô<ËÜÅž{סH«—™†‡d™IËøL=ößñÝ¡.ÂDâÞì”b é¶RÌ \‚Ö>÷^(«ð2‘HÀV³—™&gÕç²ò [yì¿¢sÂb;;—U˜UOû}‘ B“i‰àÅ„áRˆ­ÃT*ÌiccãÛ·o/\¸°k×...®-[¶hjj4|бuØBØ÷áÃ ŠŠ ßæÍ›g«ˆ‹QOluÂ7yűØÎô8Õ ¬4¶âù—X„õ”>ÑÛ7²2 \;èƒØŠôEÝ/™L>tèXT°‡gΜ ÍÍÍn=DàPëêê²³³ýüü€­„¡vtt¤P(Dó㡨ømoko-nÌ|Vhs,m•aÂß4‹:ŒúÕØ;Þ<‰õ|¦pxù½ú¶ ¢ù1ú- ¶þ—­æô):4¶‚o¥Í&ªÓØjè*ÍÍÀ*ãjDd{´•‹UÞÝØ;DŠ›™CÍׄH÷òß´”l5ò~+»–‘iƒ£O¯wí¹M„™a½ãŸáQˆ­ÃA@%///MM͵kׇ‡‡777ÓËÁú}||ÔÔÔxyyÍÌÌÞ¼yS]]=hHUµ|J¨|v5[Z;vÜðçifvŒIÒl÷㜺ˆfj=úE ¶v݇}2Ìé)’q¶®:¾ÿ1›ÐÁVŸ4}kfÒòu¦îº·^¨¨‰Ì&q‹]M4‡tË­Ìs¤dœ̽uLeYHÀÖÇF>iOîa'±-Û}UýFÈþë^ªF†B†þ&ÿÙW‚ÆÞ}›Moìºè©~î–ŒêF+—å;³aRˆ­C«†††ÀÀÀ={öHJJž8q"..Ž~|ûö­‰‰ÉÆõõõãããá+ê­Ôæ¸J/Çl9ýø©šôIÕní ¬’9< Ì ’à™ý:[il5£§HÞKcë¾gÄl‚­aÚ;FÍ`û¹ø‹ÓÙÿl9bB¬ò,r—–Ô;£U+ˆ×®¬sxÄŽ¿7ùϾ’´l_²x-ËÒÍ&>½‡MQ ¶aÍjyy¹®®.77÷±cÇrrrè}t ¢®8))ÉÐÐNêôéÓ555?¨’ÿf\ÓÇ{yZ¦‰³5螪ÿ Ø_mR8C(N-ÔFTEŒØJglEØ:¤ è<|øP@@ÀÌÌl$(H¬7øVUUÕÍ›7‡„„|ß&Íx ê¶j@ióHBê¯bÇ]ÊÚ’Qóµ%þÉÙênŠ‚±uðU__äÈàŽ‹‹Ëɶ¬¬ìÒ¥K6l¸uëÖ÷ꪃ?–´”xZî›4ÂìêW llåS„WÄVˆ­HßFCuuµ¾¾¾´´ô༑ZR_¼x!""råÊ•ï‚×ê–b—Ü]:±¿ŽxªvØóŠs µ Õÿ¬l5AAØ:˜ª¬¬444TQQ’¡z ¼½½ëêêz¿JMMMRR’ŸŸ_@@@¿÷›žžxuvvnhhXUpÕ\õ¡bœÔ=Lüzò«¾Â¤ïa›.cböØÖ[˜êkL=ºŸ»6L˜ù®ì&r¯?'[Ÿ¥™  Ç@l4µµµÝ¿_QQX3$ððáC ò²²z¿Š±±ñòåËýõWFFÆìúÕ«W’’’AAAý6_mí­%çuâ†Ì±² aÓô!ÿ¼-ØlÌlôXì™ØÃD/`;ƒ1©»x%­Ä lGPÇ"õhLÅwÆ6Úc›1%o<(lÛ ¿Ó·Fcë̱¿áV65‘„-TÀv½ýÖÞU^âùÙ„:ñ£|½&jú5!¶"!¶"x ìúÐ[¿ÙÊÌÌ|úôéwïÞž6mÚ©S§`tòäÉÊÊʯ_¿~öìÙÆgÏž {ËÀÀÜ ¸qã+++ÁV0¼bbb€`p²ááá... ,PTTüj «ïÅVØì—››»¨¨¨¯ë¦W¿à°K[I+± gq‹Ê´›È€IÜÄ-'ûFlüdlµÞâˆßûcŽWð¹ÿ¨àéËÔðü‹UpìlòþþÆ&Œm¼€O/݉ý: ã³ìq×»B±Uû°q“p_<À›Îe •6e£b+b+°l¯l„`«¹¹9ÑÚ¶®®Žmûöí0½nÝ:üüü¥§311éééÁ´~øðá_Ú˜„vvv[Ÿ?,¶¶¶ö¦ÉËËK[[{êÔ©?~üquÂøpúmmË—/ŽŽîëŠï(·ø¶”`+Г˜•tÁ]ªÈLÑ è ¼š—¨ï°ÃªØ%¾ì¢UÇ*þ‰«ƒ­‹”ð¶I@aÑ xŸÄ¦sb³×ôÖ•Z¸)^¶S‹øÝ]Éõqè…ØŠ„ØŠD¢‚‚ÂÀÙjooßU§ÊÎÎNl\§¬¬,Ñ;ÙÔ‹»€W`"1ì?•J½}û6ÁÖÇ3fMX§`ú«Íœ¾c0áŠ+bccûºâû2—ïÂVåΖºrnø,`QÞ‡¬À‘ÿa*}¿»ã'aœò˜Z$žXdYßÁÖ9±/5cá×^³¾ÆVjc¦â8ÞˆW&ð,lS’ëãѯ ± ±‰ÀÓëׯÁZ¼NøÒ¥K])]láååÍÈÈ€Â.ÀΞ=ÛØØøÐ¡Cà[ |®™™ÁÖ—/_þùçŸç΋ŒŒŒ¥)**êÝ»w_íú넳³³W¯^]ZZÚ×u3jÞh|:a¿îlU|†ý:[¬ŠLÀ+0”×›0ÛtïAÃ"€¯émæÒ¶.QÅ&2b¢çñ¯ÒpKÞÁ'º¿cõÇ)â5É7¿Ñßa0ÿó™"”¦ôƒBl±Ê÷Q™»@ÿ±©—ªªª ûlS¼hÑ¢ñãÇÿþûï+W®¼uëÑN  v„ k×®ÕÕÕíꃓœœ¼wï^@0¬2nÜ8˜€M}é(aÝ*?ûÔ=ös°–””())¬û±z3µÞ£ÀL3fÌwg+xRÙÇØ|)¼åð¨1x=0« þ6Ò•¼ñöÃã&á‰Àß ÿ¿«ð)Œ‰oÂ4j4öËoØÔ9x än{ûk÷zãióþGsâo‡q")¹ÚýŽ[[»‘5õ–â ~éÕ$ÄÖŸS।¤ú×ŵµµ5..îsü¥¤¤­ðñrrr’’’òòòºF*†ôŒŒŒÄÄD2™\VV[è‚;@™@LÀ?×»ˆû¯ú÷l”wrrÒÖÖ†öÍäú¸#©Ëû ¦íxµmWk¢=ïñÙo:Ú/Á„¼;&ó“{‚ç$Þ½ªGáB ÄŽ ¼ZXÞ£cu°ŸXÐ Þý®ûÁÞâ5ÆŸä‡möûãé.¹j-ÔFô;Blý¡zñâÅ”ÿ%ÈÓãú%1'Ö0óÙ^³Qàá`"1ÎÞ/©„¶¤,/Ø^]“ÿ+—ŒÅ“"¹¢,Çÿ„â*VHæÑs¼*ßÅÖ¢ø¦Ò«Øñ¯³Îçßy& ‡òµ–&9É,Ý|>ø‰3bëO* —ÏÖ­[ûÚP–Þß5ƒ¼¼¼ÄÄÄ"""ú=æaû¿í¡eÎúñSžQú?«dŽÊæBô#Bl¼²±±…††v?øÐPHÿX;ØJ"ÍÝdçŸUZ^wC‰ƒ]ö~V^m«4—´BÃ1 &þý1VÒÚCï‹ðêÜ; s¸÷»„&&½½w€P:gkÙG¥ìnD'%¾w·“˜7GæVÚt-‰¿¼ué–‹±%d/ÄÖŸYàÚŽ9"//ß¿šU:}¢€Ÿ¤°°ðãÇø)œfjÃãüƒZ1¿ül`µLž[éAm§¢_bëPáµW`ídë¢ý¯ ;êxŸïâàÔð+ $]f\ ñ<¯œ0›ñçøêÒÒíóÏ'²¾Ò_Lâ¶RÒolbã>QÜéNcOò²n¼‘^öŸÇ^Ø´XÜ>0bëO¯êêj;;» 6„……øoÌ555¹¹¹ñññ=|øè 4Ї“ÖRW²žnÜ?XÍ’Xb*Ü[©Íè·ƒØ:Txí-X;ë„×Û'u8Ì¢7–°Ë{’ ´0ŠÝùPÞ‘­(HÿFçtr€6'“„ëÇÎÕsŸH³à¾µ0P‡“Ô]ÜGºXKìêŒè" ‡xZÝ2b+íÍ©³³3??ÿÕ«WËËËGª]%“ÉÇŽ|þüù@:}á^ëýŠO›$ÎñTÕŽw$uiv]úÉ ¶!^?Þ[°v²UàÒçle“óÌ£±uÓ—lÍ÷׿d‘vÏë\=ÏSž•ÆV<ÿÆ[eߨUî# Ò—uJ£ ¶þ¼jllâHJJîÝ»7""â»|7|ø,ê³gÏTUU£¢¢¾#X;NÚ›#ÊO[­3v„‚uÔ¾¸?îäªåÕÇ´£ª`ÄÖ!Åëÿh¼Ô;¶R’¯3rj½ Wt¯vb^eÞáG‹#í¸‰:áT§Œl ²¾W 9)"¼S¯/of$ ˆHÈ¥ ßús œ]~~¾Íš5kŒ Iýnê3Ï ‰‰‰ëׯwrr*))ùQ¥×ÞVÒ˜å^`l?m„V;v¼Uò¼¨ŠGõm•týÿ€4ØŠ¿-,ìCîØÚÑ–‰KËùUlb˜Ûçm™\äær(8F•—Å^WžO¢±µ¢ì£·Îû«ûA±ÉI±!žŽÖFW¢Š{Ü/ªFú‚Giiiûöíããã³´´|ûömMM ½ÜQ»Žž(J`` ¦¦&//¯••U?_êŸÈõq7?ªš'±jÆŒ¦wªî,˯øTm+}K±•.û·öÄV¼Î{5$Zió'É}p(Ù/*pÍa˹”§Ý IöÎ>8ÅIOl”x9h5½lK…·öÌ  ¶"õµ588ØÚÚzóæÍ;wî¼uëVAA½à5##ãܹsrrrâââçÏŸä6ZMmu5oÜò -’Ùé‘°pÌ{cÇÍ(9÷©1µFlEã £1‘¾#¤êëë³²²¥¤¤Ö¬Ycfföúõë²²²¦¦¦¶¶¶abf‰ÏÙ444€3ussÓÐÐàææ†çÇüøñ»4î/ak R‚J/M[¹/n¢v,tÕщýõ@üôkÙr‰U>Ímí-È®"¶"¶"¶"ý¨—‰T*¸?+++QQQ!!!===''§ÜÜ\àï@vZUU•™™ùæÍuuu~~~iiip¬ÙÙÃë‹¢@¨uO ÍÏfš'±‚%$Z “FJðW/~òáÔ%—?H—^+oÊE/U[[[‘g•••÷îÝ#‘H‹/–‘‘Ùºu«ªªª ˜ÄØØX€ÝF<˜Ó÷ïß»¸¸˜››+**JHH(++ÃôÝ»wãââ¾úݜ᣺ֲŒš7Á”k÷óöO_½/îw¢vðyJìÔ8‘äðA Yþ°°!©…Úˆ¨ŠØŠØŠØŠ4È`mllôññ433KKK#“É111>´´´”’’Z½z5777Ànÿþýöööžžž………ÜšššÚÚZp¸À>ØHS§ši"¦i‚ uuu¹ºº8þñãÇ·o߸OŸ>­©© ®yÕªUkÖ¬Ù¶mÛ¡C‡ž={–œœ\TTkÑÚÛ© mÕe͹yõ±ïË\’÷H_cð羸? ÀÕj~oK«3F7ö7Úö''2\þ°Õ»èpB¥÷§Æ´ê–O-Ô„TÄVÄVÄVôsåå噘˜ðóóL¿š—””äááqöìYàà–-[¸¼¼¼ÀD€/q×®]ÚÚÚºººúúú°Accc˜€Y--­;w*(( EDDxh‚uõôô|}}³²²FXß[BMmuäúøØJßOÇoçµåLÿ±4®Ã©‹-Sæ™$2ˆŸN#ïx­˜±ÀJ0žŠ^ØÎ7ø˜ù0«;N'îW½¸É† ›%±Z'Ï?’ºìD:ϹL¡«ÙÒ®d½ Ò˩Քæmí-èŸ ±±±uÈÕÚÚ$-- Xì}›[ÈFOX¼g@@ØÌGݹsçÆNNNàmùøøäää®]»³7oÞ„EOž<küêÕ«°°0 u~~>xÞþ}¦‡®Emo«k-§4åp³jCSªýã*=#Êï¿+»Bq .u|Sze㎥'k—^…ÙPÊu°ÀQ®‰U>i5¯³ëÞ5¤V64¶Õ"OŠ„ØŠ„Ø:¬*Aµµµ/^\»ví… àê|Çu}}=ØÏ?ÿŠÔ'ÉÈÈ<}ú•Ò ³ ±u˜¨¥¥%!!AMMmëÖ­à"¿û8ˆ­ˆ­Hˆ­Hˆ­?Xoܸ!""baaQXøC>Ӊ؊؊„ØŠ„Øú“ˆJ¥–””˜›› ¹¹¹ÕÔÔü !¶"¶"!¶"!¶Žl/R===·lÙ¢ªªúƒì*b+b+b+bëÏ#€©­­­¨¨¨““SEEÅÞb+b+b+=©%ëÂ:fáä;:yí›Ýó8÷½¯Cl ÿ2--ïß¿WTTLIIœ1x[[‘[[[G¤ÚÛÛóóóÏœ9ÃÃÃsùò庺ºAÛ5b+b+bëOÃVjKKïúé#¶Ò¿ÚÚÚ‚‚‚à­ªª1ÈbClElEBlýQç:å òôì:êÓØ´” ÿT+'ÿž›š;Ø*xÁûªÿ\söæÇ%Ý[4Õ‡é-d‘÷«îò½Êlˆ­ô!`haa¡ƒƒÃºuëNœ8Öu8bë¯)b+bkïñú?/õ,*ÅS–…C3´®'¶6%ج`ÞêYNX•Ö¼ëÂ$¶¯°µ­ðÞæÙì*^¥ÝàÚJ¾¹™çDjG]qsú™5¨N˜D¥RÁ¥nÛ¶MNNîõë×ÃäÀ[‘oEBlÌNï37&;Ù9<}ŸF..þuWk1#ßùŒ–žØÚöé‘ëBMÛë3ìYD"±…­ÿR+ƒ,%Í‘<ê“Oþ÷êÎ1«ÛÍÿ¶}z²mÞ|•;™ ííì\@BlöT­­­½víϱcÇòòò†Õ§<[[‘[‡§š³nïÛÂÍÁ€¿e])iò¸÷oOlý÷ߦìGz ˜Ùæÿ³BXóÂ5µ…_c+¾]²ï UþùÄ;Ùå÷œzU‚/l+wN…{.ë¼…ËÕÏ^ƒúà ãÿæf???ðªpŽŽŽ†ÈFlˆP0b+bë ‹B¡œ>}ZHHþþè!÷[‘oEBlEBlÙjii‰ŠŠ’•••ˆŒŒòÆÀˆ­ˆ­Hˆ­Hˆ­ô+*•š——wüøñuëÖ]¾|¹¶v¸bë@„ê„‘[‘[ôm¶­­Íßß_^^~ûöíaaaà^‡ÿa#¶"ߊ„ØŠ„Ø:líjeeå©S§xxxÎ;7´C-!¶"¶"!¶"!¶Ò»Oîîî’’’`WÓÓÓéîà[RYØŠ„ØŠ„ØúÝ•ŸŸoii)""âààPVVFˆ­È·"Ñ[]ãö¢ Ç@lý¶[566úùù‰‰‰©ªª¦¤¤455ÑÑ)äææjkkëдdÉ’õë×ëééíÝ»ž†É`ŒÃY111P\û÷sæÌÙ²e Lhii=zt0¿kô3³Õ?û z ÄÖo¨µµ`zàÀ!!¡û÷ïŸ {¯OŸ>122b_žªªªÐ½îÛJHHX¶lY·¢5j”¬¬,*$ÄVˆ­ÿÓŸ~™ÒÜÜìââ²iÓ&°*ÉÉÉT*•O­¡¡áàÁƒ€ƒÏé0~üxggç¶¶6t¯ûŸ¥§¬¬Ü­ô`Ö××Ò`±Õ=b+ &000##£‹ª’››»oß>‡ÒuÝ)œŽ§§çÔ©S?§ÃÂ… £££Ñ®7ºwïÞ„ >/=TŽ4hlõ˶EAñ“³Ð¶xñb^^^¢……B¹r劰°°‘‘L€s„ç„7v¡aôèÑ***àÈЮ7ªªªš9sæç¦ÕÀÀ€.z4#!¶¢øV$©m™Ã*ãnØú#À uÛ¶m£i²µµˆˆPSS“””tssëÓ7’†³¦¦¦¿üò A‡‰'Þ¸qÝåz¯Ï«…'Mšäîî>lG¶Dlý`ƒâ‡D✭næ½_ÅËOQYl þY¦Ä6]MþV柖­p{¤R©žžž]5~Ó¦M[´h‘™™YAAÁHz g0cÆ â4‡í†§ž>}:fÌ¢ôÖ­[Gw]›‘[Q œ­ÏƒåÙWî’:òHëªÇîÃçUn¥ ¶~8111œœœŸ¿J›;wnxxøÈ;ÙÆÆF...¢JS]]Ýâú¤œœœÕ«WCé÷755EÂHƒÉÖ—lP|=Òôt¹¹LÔ¥Ìa"1p,Vr<àC[ä¿÷ ê?óðÂ2-–Øx챊o¬†® 3$Ï_¢tVN”ÆV|QŠÁý•KØpG:gíZ=“Ýö•ezJ™…U|ÛÃÌÞÞOËV …”?~|·555#ï|mll¬£GFm\ûªúúz###(=øÝùøø A\¶Z£øz¤í×å.Óv3zžeîbÏ=‡ëP¤ÕËLÃC²Ì¤e|¦ûïøîPa"qovJ±†t[)f.Akƒ{/”Ux™H$`«ÙËL“³êsYù„­<öß Ñ9a±‚Ë*Ìê?ûJV—å`\cºUAd.+ÓlŽµÜš÷>ÿæá g¶¶·SÛÚ[[©Í-ÔFZ44Së!`‚HE²õuËT*õÊ•+¿ÿþû—?'Mštüøqz¯&j¼[[[›››iŠŠŠ7nÜ‚ ²³³a¶©© AȆÞ~µôÀŸB)¥÷èÑ£¿ÿþ¼iié祇Š ±uhÙ:_SÓ‹˜Mܳu«ô³çoeyYe\M}iéσ¥V1°)x˜ÓÒÙÝ͈սž - ±[_„)ò±Í× °èØlºÞ>&Þ‹†¾ŸíË7rÛ:š©?¶ÛÑWÃZg#‰SËÏb¸±µëŽDLPÛ© mUåÍy… É9uá©Õq•QÞ•Ý ,9ÿüÓQÏB˧…ænFÈznÆ0 ‰/> ,¹Ù s\åSXV‡”7“aƒÔž™›••5kÖ¬Ïû-w–,Y"))yúôéôôt:êÍ ?~LNN ó÷÷÷òòܸqãÂ… Gµ°°077×ÕÕ:uêÂ… 8³VVVÇŽ»téÒíÛ·ŸÏ´@ñõHÑÝ»šqÕ±ýÞÄl¢Æ¶˜6¸{¸ñÍe\jÑ™-QCi!Úónn|ó˜–ŽîLÙ.ÄÌ"ýÄØÃ©»–šíõúl_>á kI$féí2h)IZ;–’8÷k>íùð†Ê·6¶ÕäÖGÅT¸ùŸv%ïsÎQº˜µñdúZ›NÄ™:±¿jƌֈÁzY'î7£„Y6) a#öYb×s¶¹’÷Ÿ‹©pÏ­ij«ëºÑ8vïÞM¼|„¿¬¬¬ªªªpŸ²TUU ÿû!!À4::zêÔ)===…M›6‰‹‹ËÈÈ())mß¾}×®]{÷î566¶±± œg«ˆ‹QOluÂ7yűØÎô8Õ ¬4¶âù—X„™k_q;7±’þ1ÔînÆAk“ÌN·!e+ÜÍZ©Mõ­àL“ª_¸˜œÏ±Hf7Jœe?moì˜Q½Çh_b0va˜0Ë2yî…¬ …fIåþ¶F“¦þÁÂÆLqssËÏϯ®®¶•ÀÄ€ÆÓ¼¼ŸÓÚÚ[†'Ráöž––7jKKK@›°°08,`«««kzzúà n ‡ð½sç À$** ¶HñòåK@ fxÞÄà°Áq?yòÄÂÂ,¹ˆˆ”ÞáÇÁ‰Cé ÝÓááá7nÜ€Òw¼qãFx¢üêÕ+(=À4ª7Flý6[}2ÌQ|=’q¶®:¾ÿ1›ÐÁVŸ4}kfÒòu¦îº·^¨¨‰Ì&q‹]M4‡tË­Ìs¤dœ̽uLeYHÀÖÇF>iOîa'±-Û}UýFÈþë^ªF†B†þ&ÿÝÙÛkææHžÞã¨qHÿ&NM_“oÞbkm+%ºâÉC²î©t^pŽ€Ô>Õñþ¸PÂÔ"1ÚÁŒ:?ýTúºGùú1nu­eǪŸ>}zøð¡ººº„„„’’ÒñãÇÁs%$$ ípp`à颣£ïß¿O |™Á³gφUËjð·n݂҃';v@éÁÂS ”ÞЂ œoDDăŒŒŒdeeáâ‚qö÷÷ó‹‹ØÚ3[ÍP|=’÷ÒØºï1› FcëA˜öŽQ3ؾp.þâtö?[DŽ„˜«<‹Ü¥%5•…yîâ…âæ›ØX¥Ò6µÏÎhÕ âµ+ë±ãïMºï.ÍðÊI^îù´,+Wî¹­çõÍÃûŽl…ûCC[u^}Œg¡…E»~üÔaÂÓoøh8TËä¹^…Öyõ±mCs£ S]] äÒÓÓ[»v­””ÔÝ»wÁa•••µ¶¶7OÝÔÔTZZwñâE111!!!;;»ÔÔÔ¡â•J­¨¨ Ö¯Y³lþ½{÷²³³áa`¶æmll,))‰?zô(j .dff9ý‘[Q|¯ [Ûÿm'n¶5­”¤j_§…ýq“è©_m¥7ùöÇ)Õ~à»ó.W\\ìêêº{÷n¸ÍÚØØDEEÑÑ+¹ææf???âÓðõõÌ¡ìªùùù=ƒ/,, ¥—””DG„Ó %—^PPðàÁƒ!!!‚„ØÚuöN7EA1pß xMª~qý£²aÂßôˆÔ/[@%κñq{zMñäðCÕÐзVeeeð€ôû1; ldd¤­­-ØXMMM0àƒ`·Á>?~üXNNJÏÙÙ9++‹N;&ÿPJOTT¬w\\þ !¶¢8[ÛÚ[K3ï“÷ÄO£S¯úVOþv%ï/iÌ¢¶ÿÛ58S`ÁöíÛׯ_ýúu …2Üê~ûWW .òäÉ“kÖ¬155%“É?‚Ä×uß***6lË_ZZ:†€†ÒËÈȰ´´äææ>vìœ",b«wº zŒþ±•hü®ìÖáÔÅ#ŒªÝj‰¤.‹®x 'û}ÑPUUuëÖ-AAÁC‡ް·l@„¤¤$ M›6ùûû÷&XðLrøða˜a·_øgHLLTTT”——÷óóCŸ°ÿÉÙú,Í=FÿØÚØVXrÖñaœHz]r©±í»½«««o"..þèÑ£<°PÏÙÙYDDäÚµkß±«Î§OŸŒŒŒ¶nÝúòåËüÚâââS§NÁÓ×ãÇ^n¶£ Çè[kZJçØ?ùg+zñSÜòê[ÚD,IYY™––Ö¶mÛÒÒÒFü=³µµõÍ›7à^Ïœ93ð¹Pzd2yÇŽêêê01â›ÔÂsWhh(???˜tÔ„ø§e«kÜ^ô}b+^ÜÞüˆ¬§;n¨z§ Ãäžô6ÿžpLÑ Û|>‰œÁ¶ÞÂö„õs×{cÇ?/²à@åååzzz»wïÌ–´]ÊÍÍ}øðaÿú¢FEEÁº999ýX7++ ðzåÊ•VCéikkCÂóÉà×Ó¾}ûÖÏϯOGûð¿ê_ÛïØØØÍ›7;;;#÷ŠØŠb¤²”PõL7î·6Jáÿµ|\ýUº½Í/u#­Ä~›ŽMfÂVëc;CúÙ~ø@üô¤ªýþYÁ½ÑÅÅEYYX3$¿k¸½CéõcïEEEk×®…uoݺտ]KIIöÛ|󫦦3$¥'##³bÅŠ>=tûÄRÿ:×À‰ûúú ¥¤¤ 6ý„lõÏ>„‚£÷lmÿ·½¤1óTƺ!¬›í+[·ÞÆ8å0Ñó¸ÕÝ숱‹b¿NÄOö»iÓ¨3¥Múm·lÙòþýû¡jüÙ?¶655YXXlݺu l@¸ººîر£M€È¡¡¡@ç?Õ]±l½qãFV§ú}Ý¡ôîܹ³}ûvÔõ±ÅÈck+µùy‘ÝÞØñý¯ÑÆ6_ÁkhUü1±K˜ð)LÒÛý¾c‘z&}Ûpgß–k˜ê+<‘¨×…tH„UÿÃÖA˜ÄM|‘ÈLòNÞo€Š6j Æ} ÿpß7Þ·øD[{k?è`nnnkkÛïlss3À1###==ÝÝÝýéÓ§]”$F#|ûö­›››‡‡GDDDW)H÷÷÷òäIddä½{÷>g+p ÑãÇ}||rrr¾z` ,, ÂÖi#ëîܹÓÓÓ³ë¶Ú¢ Çè=[Ë›ÉöYb¬ þ{)6™ã”Ç&LÁFŦ°àXìx‘j‡M›‡ýÇßïc ¤±m/ð±ÁÓçc£ÆâU»Kwv²5å"%lÒl|;cÆcSÙ0>+<ÿ—@'¶°^gý6·±YÂáƒxMKI_SŸ>}âççONNî÷¯¸çNôè?~üo¿ý¶iÓ&â(T__Ÿ}ܸq¿þú+''çùóç‹€SSÓ¿ÿþû—_~Yºt) `+aÁDO›6m̘1S¦LÙ¼y3ùK¼VWWƒ]:uê¬5@¶‚î`]ûñt§))) 8ë÷®¡@àømllØØØ 4 L`ŠŠž:dee§OŸE1iÒ$!!¡×¯_C:@ŠR&Nœ¨¨¨HøVXtñâÅåË—ÿñǰ©Ù³g«©©}ù›`+”¹ÁÙ³g‰bHéAáÃU®««C„ú©Øê—m‹‚£÷lýX9ð‘—€­¿üŽ3Qê&|ûsö×?•·Àٙ˰1™‡ØÒ]ØøÉØ?ʘ’7ž8™Ût“¸Ž± u°X yþ˜‰qé`2®¸{·ç,äùr§l°IŒxæ‰ ¿M‡SîwH˜^Ô˜Ú×ß%piŽB°•••õÊ•+ 'Nœ=z”ðQ]]0\’’"‘H/^¼C:kÖ,ÀqXXØ£GæÌ™C°5;;ÂÅÅ.p.xÉ’%°Vyyy7Ó VQLL,//œÝÀÙšŸŸ¿zõê‚‚‚¾Z~pÍpxéÊJ°Kcbbää䘘˜BBBà”eddµPª‰‰‰àCçÍ›W*33SGG篿þ:~ü8ä·´´üóÏ? ¶¾zõ ŠÞ¼y¸·³³ƒÙK—.uÛctt4pöKáJÁls ¥ž†êe=bkß"ImËVw ÄÖÿÉÖŒš7ü<XH`댅Øö€Ž—§Kwcc'àÓkŒñ  dGeïŒ}#Ní·°_~ÃH¤Ë=é`+øSð¶ŒÜ¿-&t:†ñša£ÁÖe¿Ë506löZœ­ å1eߊ˜WÛ×ßÔ;w”””ò«$ØjaaAtfÿ L%Lóòò 9á·ôýû÷àÆNxÛææf1ÁV`.Üö]]]>|xÿþýÝ»w»5NII>{ö ¦¿ [áÑ캾®xóæM`Ù@Æ­"ØNÌ‚I—êááñáÀæáÇ»zàBLž<žLà1fÛ¶mЋ‹‹¡„‰:a(XFFF¢ô L–-[&**úeM…››[UU…BÌ€o€õ@J؇õs±õƒ ]F✭næ½ÊœnxÊŠo= ܰÙV)ŠŸ ·¢×ïŒÞ³5³6xà]o€­³VtÔÓB¬ÔÆk€ap9z,¶§ÓQ:Á´mÅñ&¾›¯v yWh'[#p’~©Uûzì¼³#3;n"¶þÐ@k"÷­À/yyù³ÕÞÞ¾«j‘]AA&,XwÝ®.MMM°°«§§ ¨&ôöíÛ[?~ dESWÑÁt7Odff†KMM  hƒ<àvîý>8BÀSllžLàt2ÁÖ®ÇÔÔT˜—šžž>vìØ{÷îuÕTƒK%°;uêT8q¢ªŽ\RR’ð­ðŒD×çÿx\\\ß~_ÌÏÏÏÇÇ7¸:`±R1Ž„Ø:LÙš¨®¸‘{»ò­‹Î›’Hü’·Ó~¶æÕǘ$Íþ.líšíb+Ÿ^W,怷\*ù`L¼ØTv¼…Ò„)تý8L¸›ÿß·NeÃÝ([yLá)&ïŽ7yêæIak;ƒñuËðl/œÇp@§`’ÈXܘÑ×ßTpp0Ü]â¼¶~^÷ØÅV111nn$PàíÛ·€Tsss;;»Y³fG#>`wàÀ‚­3fÌÜÀ*às“““![·aŽ ;5sæLXpómˆ|[°/ž~ôN ‘(-- [ÁKvc+Xu8;°¢•••ÄjÈù×_.Z´H\\a+ý÷BtNX¬`gç² ³êy×VW2±¬:k=sòè=[©ímoJ¯êÇOý¾¼ª¸3þþ Ö<)IÜÀy°Ñãð‘xMÿ¿ÎÎÜí2¬Â_ÈÂF&ü‰±`âÿmËÈfÅßÌŽŸ„ÍZŽ÷ñé÷ÐLñÓB)ÎÔöþô£qppÐÖÖî÷Ðß`k]]ÝÅ‹©&L˜8q"PÒÃÃÜxXGGG66¶_ýUXXØØØ¸«·ÀÍŸ?V?~}dT„Ú»X[àÖúõwó¯ ÿáÓk‡5á?:ÑÇoÍå2{÷îUSSkÍ ÂQܺukêÔ©­|ø;‹Å¢ ¸¸¸OA¯üÏèìì<}út:+ÃsÒ?U·Ú´Iì¾° Gô÷m‰^Ás+孼Ɉe<·®u»¯)ÙKBë¢9¿Ø ¿™ãzIh_µpó×´ÔË’?ÿº·Ê(r«¹Ûƒß¥DÅŽ˜¹¿qs\±ªõ›¬¸/Ⱥ­>òÇ þñu¿èÐÿùŒ¹jv…oîˈޟŽX­"ÅüòÖrX­ÿ窬¬Ü³g¬¬ì;wÚ}}Ø3gÎL™2åúõë­kãEçM›6QÒ²ÇÊ‘XËË˨ö<==Û÷‡…[ßàV÷x›¶Š«áïP>ŠëÖñ;Loð'ÃÜê»jƒ–¸ÈèÉVW=ç-•ï-"©|8†毛)Þ_CË!ÜÆ-b…Õï}DÈ­—ÌÝc×üµ¤ŸHß_^vÂßôøu=óµ²k½-ÿ¹-ãµ3ÅEú5vZ~ÐMŸî+ÎGÚ´ágÿðѲg£sê9a%××E ÔoïÙ+}À?cF†—¸µ¬ÿÒë®]ž:uJFFfß¾}ùùùíò7„’¬äää7*))QÞÚ†ÏG«ªª²··Ÿ6my§   ý%°üOijjª  Ð‚¡6@ûr«õlj(#ž[Mnð'×òܺ†^»/5›?l÷ÂiïáÓå·ø[ò¹¸È@c Dñ#†©Ù¨Në+¡yi-oU&[ÍÇá_v•è?AGyÇ#˦Ûr{¢3¹ù%ÙÁÞ–í³·E´Ì­|âËîy6k÷‘síS¬Æ¡_Kž\ñä}\Dó÷÷×ÕÕ3gÎÝ»wÛYVBŸîܹs***FFFÑÑÑmþàQª.MMÍùóç?yò¤=é•ß%˜jONNÎÒÒ266ƒóíáuë;µ 7ùà”×<Ì?i!¶"¤k{²*}œõQœª¨+¬¯ç¼§_ÑÜÜÜ]»vMš4ÉÄÄ$11±²²R¨HùkôôôäååI­øÍ¯ÓÒÒ¶oß>qâD›øøx‹%ÔµG™>YÕÏÏÎdeeÝÝÝËËË!V¸Õ-Î !ŒÑ𼵑üêd—L›­±côƒ; »U C:o‹ç𹮏6óÃø(!!ÁÜÜ\FF†þúøø”””Ý/*y!''ÇÍÍmñâÅÓ¦MÛ¶mÛk뎌Œ444$­_¿þáǤ'᪽ztžpéÒ%ª=JWíììÚe[7€[áÖwuë ÞÓ]3«¢<³·oùÕ ¸“ÐI–v˜v{[ìXŸÜ}YU1ôq>ä\MM ¥{;vìPUUÕÑÑ9|øpã­”‚¯†˜˜’éôéÓgΜyäÈ‘èèè6é¶ôöP¾OµÇï㤫«{êÔ©ììl¡pUTDDÕž²²2÷cÇŽ%%%¡?0ÜúO·Z"„1ZÓ&ü*ÃV×d†»Ù%©® ÿÉ8äKÁ·ªIè—´«öIj%î´óìúÚ%©êêêôôt'''ÄĉÍÌÌnܸAsÊËËéGX@dA»Q[[KÉõóçÏOŸ>½`Á‚ &Pæèáá‘••õ­Ú”ªªªäää3gΨ««Oš4iÕªU·nÝ¢lšj¯Í/ø¶²öøYPíikkÓ622º{÷.eú‚s”à¸õF¬%B£­òÖæ„õììªXÊ&ÍÜ3Â8”/YéTܧԯÿŒy(IÝ7Ï>‡O;,PM¬‘‘‘Û·o×ÐР\Œ~{:äííÍJè£üüÒ.FEEyzzîÚµkÑ¢ErrróæÍ;xð  Oò ¦ÚSSS£|jÏÁÁäõá¯h7n‹j¯¨¨(,,ÌÍÍjoîܹòòòô—Rì´´4øn}£[-ÂïÉ­¿-,vYZeèÓ"çkVûW…}Ço€ýð>åotuxÏý J.6ÁÅWÒ+êÙåûoÈïröìYú)&Shii™››ÓœÀÀÀ¦ã¾'ŸRÞçïïôèÑ•+WΘ1CEE…Õ­[·^½z•<Ûⱑ? ¤³€€'''ª1:K¡¿ëÖ­£Ú£Z¥ºm”ZëíöïUQ²œ™™IN·³³366&ÑOŸ>ÎI¶mÛF†‹‹öÎWàøõb¨B㽺µé/O §ª¼./¿úYxÉ ¬­“fXEˆ¯ ïiþ½IèWÁÚV¦´BÊLiåk°Žìsø™¦GöÖð÷üê”òº|Ú™Vްôsƪªª¼¼<úA¦ŸeÊÈfÏž-%%5~üx²íòåËwîÜyîܹ;wîÄÇÇÓï9 1??ŸÒL’/¤¬¬Œ²ÝŠŠŠJå Ulܸ‘jORRò·ß~SRR200ؼy3ÙöÞ½{ Mk¯¤¤„ªˆ_]¯«=ª ~íQúîååuìØ1ÚP½7nêÔ©´ [[[??¿ÔÔÔÆÏÁ2pë[ºµ'Æ­¯øÅ{Q_Ë©Îa%D—Þò˳¿”¾úxò»DÕÝñÒÛcÇoŠùÅ&²¯yøÏ+ú‡v3 ù¼iÿ(ýàÏh’fÒ[T€ŠýÙoSô/;bÛ?Õ.IõxòÜKéküòÆ”ÞÎe%ÖqÚác¹È¶111îîî\½z5ùBUU•~ÏIˆ”]jjjÒ==½¥K—êëëñ ÜÓÔÔ”ÿšŒ¼dÉ’ùóçS*§®®N–¡e§M›FéMöîÝ{Æ ·oß~öìY»ˆ\I'T{Tƒ¦ê¢³~íQ5òkÎ.¨öÈŒT]+V¬0åÁ¯½eË–Ñù-;kÖ,ª®Æe)µ§¥(5>~ü8e¬$ÓxÀ­àtë«ò N»´¸&#››Rñ4±ü~L©wh±kPÑ¥'…ç Ï>.8ó°À‘‚^Ð$ͤ·ÂŠ]I TøyÅÓlV\qm&‹]öžîHdøO?OOOŽŽ~úô©¿¿¿··7%¹W®\¹xñ"eµ”š9òprr¢IgggJâH.>>><¦¤8++«‚‡‰‰I‹ŸY#Däææ’Ož<Éb±( ¥Ü“j/00rXª½ëׯSí]¸p¡±öN:ÕX{×®]£Ú»sçÎǃ‚‚(çÍÎΦªCN àV Pn‚Crr²¼¼<Dpzض9•••”~Ò q·¸|€,˜ò2EEŘ˜˜vùëêê(•••}öì7€[Ü > eee+W®444l×[ëëëŸ?®¬¬|æÌ\p«‘î>oÀåÞp+hǤ§§ËËË;::¶³–ášššU«V™™™•””à(¸UhÝšyÇxXÓgç \r3n€¯¯ïÔ©SÚMJT)]¥s†ÔÔT_· »[Å•x?hàITFÜ „ªªª7.^¼ø}SñÁ¦³…7nàà¸õßxzzöø/¨Ìk—Ï Þ9Q|ʦ£u& ,gê™Ë{§ õÞe2C{qŸá:NëËÑüÙEÉÞ;g— ÙCåW9¬ÝèÖ¬°óVšãûñæ*½p÷íäüW¹µ¯ŽkÚ„°Á¿4©®®~èÐ!ao¦ÏRPP@ç ëÖ­Cß`·¾A¯}ûö½ÿ~ó¿Ÿæ¿I¬ n ²Õ;1¯0+ô„î ~¿ŸK,(ÊsÒ 2fù‘ÛÁa.oT–‘Úü(«ˆæŸÑéßKÒôôýˆÈN«¥I¥ƒ¹n-Hq_1ªß´Õ'oEF<ººuÆÀþZޱù¯jãêZt˜Ì¢¿o%åí@ˆxôè‘””Ôƒ„ýñ²vvvÚÚÚh pë»êõ­ÄúÒ­¿˜ÞÉlhãõX4hèò[ù‘åD‡,÷H-äÍÎ Û+ÝkØ ŸLÞü_L¼Ó_ÊrÕ‘AäÖü¸*}%ÿ|’Ó°Ú¼¿&I(ˆûg“oN˜ÓîgÝ|üîÜ8¹As¨ˆ¨Ü®§9p+8޽½=YIXž|÷Jé áÞ½{ÞÀ­ï¤×·ëË6á©"Ȭ»«GöÓvM˼m8DTùLRaC±,¿UÃEåâÒn›q1ååâÏ/köáæ­™>+†Š4GrË“7˜3ãŽÙH‘_-ïgÁ­@ˆ(((˜7oÞÖ­[…±5•dšžž®¥¥µwï^ÜtàÖwÒëŽ;ÞV¬/Ý:Í®©[ûÎrMå¹UåßnM÷6ÚGójêËÅS]µ%xnå–WrŒ‡®I…Éç§÷Ÿ}= nÂ¥§   YYYWWW¡ÛùŠŠ ++«… –••áP¸õ]»6½­X_ïÖü¨Cr¢C <ÄפMØ^V|üÆ€†|4'p«$¿M8昒h_ó‰o/W^Þ:ÊÂy+2jkkååå)®³‚Û·o+**p8G·¾™™™ïPú5nmèË4ÎÀáNHÄã+Mû2ž5`Α ¬Â¬ãs‹ðÜZTâ¶b¤H¿éëÏù…DE†ø»Ù`~¨ÙÅÔÌ{;Vo>rÉÓ÷.÷z«ÖP‘^2âz+BX,–‰‰ÉêÕ«KKK…eŸ³³³謠]>ÐÀ­‚ÅëÜʽçî¥Ó†ˆðîÁÑ´¹ÕpNþ³›ÛtÆõ—0t”ô­;Õû½¼''òòFÝIƒx—ZûŽ’›ÿ§kü?»g?Ù;oêH ^ñ‘òKw£Ÿ0^è$vúôéGŽ©©©ü½-,,Ô××733нpë Œ'Ü^€[Á;Áf³/]º$''!àMÁuuu'OžTRRJJJÂp+€[ SYY¹aÆٳg ò^É­QQQtàêêÚŽŸ”àV·‚vCqq±®®îÎ;«ªªsé»­££³k×.‹…ãàV·¡ 00PFFæöíÛØù¶®®nÏž=3gÎÌÍÍÅ‘p+€[°P[[kggGþ´!Éõ>>>“'O Âap+€[pQXXhhh¸jÕ*jwMNNÖÐÐpppÀM7np+Fâãã§M›víÚ5¤—’Vkkë äççãè€vàVTš·‚Ö@JuwwWTT ýèze³Ùdyii阘 ÈàV·á…ÅbÙØØ,^¼øã¦Š$Sò;%Ñäz·¸{êš””4cÆ {{û¸ÅÅÅÖÖÖ{[p+Ü ·‚wR[@@€””Ôýû÷ù·äÐ_’Ý{} [%zl6ÛÎÎNCC#55­Ánp+h7=zTSS399™L÷èÑ#==½èèè÷´-²öÅ‹-,,222H¦>$³ß½{GÀ­í„ÚDÛÉâr'ÒÞï—Ëï.8ÔäQÜ –¢¢"òéÆGŽÙ±cG[[Û÷´-JŠi[´‰Y³fyzzª««Ó¶0¶!€[áV¸´38inøðá_ý5Ãc„ ï©Y8..î§Ÿ~¢M^»wï.++›™™‰CàV¸•ÿkT[ûvãÅÁ­@°©¯¯¦ü±K—.ÌKzöìùžš…Ïž=Û¡C‡Æ }ùå—ëׯOKKÃÅV·~„Ïuÿ~ÿ‚ʼþç£2îüj•QbÜ'±Š •^r2©¦Á­2¶n‡—K¤ùCÍ]RyÃÁTÇ0Q›À{°kïJ¦§"Ëë] 5~Ø\‚¥w »!”õ²¼‘ÿ„?ûâŒ~wÅÖ¼\[Ò龪rjÓ{Xû¸Am•–£Dí@ÉË˳°°ëرc£òFŒض:}úôW_}Õ¸‰N:9òäÉ“xœ€[G¯o)V.UѶª}DÄÆª-µÚsî^JEc¯˜Ì±ç ×[«‚­FõŸëCædç?Ø¿Tn¯™G¿%÷ÊÊO;úœ?Œxå³a"Í™øwlqÀÊabZîÅ/7]â¥Ýy+tÊÊÊÜÜÜ&OžÜ(>ÊdÏœ9Ó†¹dmmí¢E‹õݵkWJWÐIÀ­‚£×;v¼­XùÔ•Äù]8°A_m”ˆÈXó»Åœæ}™ªB¬Gõ›ãSÊ)pŸ?@Bå¯;‰UìúL†\|·¼yß§Ê€•C{«^ÊmÞ£©òñÊa}´o5¶¥•úÌí ·!€ÃáäææZYY‰ŠŠò ¸xñâÊÊʦeø£=TWWWUUUð )—ò(//§I*OI(iô߇‹‹;v,­öóÏ?8pà… ¨<ÚÜ*PzýÎKoøÉwý½Ï ýû¯skuøÆ1â3] ùÿòu©ÇåDú¾Â­ìL'ÕÞýæ]Ïkö R—vRA|ÂΘ†¶âš¸ÝÑ& „‡ššOOO…N:‰‰‰=~ü8((ÈÏÏïúõëçÎ;qâ„­­í–-[þøãÕ«W›™™ëë똚šÒäÚµk×­[·sç΃::::;;{xxпjxxø¡C‡èß¶{÷FDDà“ÙøÄÝú‚7lÚÛfEÛjïò(6-''åéYƒ¢SöÅ׾έìlg ‰aúnYµ/ê+Î/ùED¤ß+Üú‚Sì·z”Hõm®ÁÏÒÓ’BïœÙ¾þT|Í vöå9Ï;“PU_ÏJ:¿pˆÜ „„ÂÂBòà™3gôôôºvíÊ¿ÑUEEESSsîܹ”Æ’CÉž›7oÞµk—½½ýÑ£GÉ¡'Ož<|ø0M’yI¬ëׯ_¹r%9wáÂ…ºººêêê$ëÐ þùg ‹K—.‘mù#¢ÚÜ*¬§â‰§L¦KêŽ$*1VÝòyïÅëÜúâEõ3ç•rCÄû>FNßöèÒaƒ^åVîzÓ¼vêIæ_“­´d×\î›ì‡{çI8l´Ì²=¶¿÷Ç=8@°àå[QQ‘••}öìÙU«V©ªªŽ?^FF†„H™é… hþÞ½{óóó‹ŠŠJKK©|UUUuuummm]]‡GýKø“l6›Þ¢ä—Åb‘:ËËËKJJHÙqqqÛ¶m»r劃ƒƒµµ5 —¬-))9kÖ¬7º¹¹%$$äååÑR°-€[ÁGn-ƒ|þüyÊ@utt(-]°`ÁßÿíêêOÞüÇyiMM›l”´ÛlͤÝ2øºuëȰӧO§d™2bÚÄÄÄf…€[Ü 3WMKK;qâÄüùó•••)9Ý¿ÿí۷ɧ÷ánüÇÌ…‡‡»¸¸üù矔Ò***š˜˜Ð$ùÀ­n‚æS6›››ëíím`` ))Ib½råJvv6iKÐn~¡½¥tµ´´”òV{{{555iii²íÓ§Oi&ÚŠÜ àV ‰êéÓ§µµµUUU·mÛý^ÌÚ¶TWWûøø¬\¹RAAaÅŠ7oÞ¤ô†p+€[ÁG“³³óÌ™3gÍšuöìÙ¤¤$!¢Åb………íÚµKIIiáÂ…Ð+€[Ü >p®JV ¤\•däââRTTÔî$­­­MOO?pà€”””MBBFsp+€[Á‡¡¸¸ØÖÖVVVvûöííïFGG/]ºtúôé7nÜh«>̼·^ 5BcÀ­ $Sccc __ßöêJÌ ¥¥¥=úNcÈð!Ýêýl3BnM“’’¢§§·lÙ²ÜÜÜv?œ ›Í RRR¢ô÷鸷‚÷”±š™™µÉ +**âãã?ÀÎÓ¶’““ßõt"""B]]ýðáÃh¤[7!„1àVЈ­­í‚ ²²²ÚªmZZÃ0ŽŽŽ`çcbbh[—/_nA¶©¢¢âëë‹ï4·Þz¶ !Œ·¾_•””RRRÚðæ¡p+ÿã{zzêééeddàËàÖO""—Nï/¡uõ¸¼?ªªªôõõ=Ú;GEE9;;Ÿ­¬¬ä»•æ¸Ïœ9sîܹ„„~ùºººØØXz÷Ò¥K·Ã899ݽ{7..Ž^øûû¿à GL+¼páiÚÃÃ#77—@»}ûöíS§Nyyy·Ø­DIIÉòåËiqW,·&mD¼—ˆXÂuë›·_äú­Ùs•öá>VGl¸²Êá¨7†[AZœ1cF£øZ€Ï„ ¾üòËŽ;~ñѦLïÖ9sæ >¼sçÎ]»vUTTLJJ¢ò©©©£GîÑ£•ÿꫯFŒñðáCþª~üñÇ1cÆ(((téÒeéÒ¥¤ÑÝ»wÓ »uëöÙgŸõìÙó÷ßÏËË«­­¥ù¢¢¢:u¢EÈŒ­q+‡Ã9qâ„:5¸nýwxÜ›%ÓWtì"-·¯-þsß<Çh¸ü”÷éééµøVVÒŸ±±q÷îÝ÷íÛGùcXXØÞ½{)åä»uРA®®®¤Tšùý÷ßïÚµ‹ÉÈÈ011¡ŒÕÛÛûàÁƒC† ÑÒÒ⯊DùÃ?ìØ±#%%…ÒIÚ7è²eË‚‚‚ž={fooO“›6m  á’¬iþ“'O¤¥¥[ãV‚V(//OÖÆ÷Ž[o&mD¼:bWKŠŽ³ÒY¦1¤¿˜H¯A#t¬vç½åf´Foø@îaÅFÌPÚþp=¯åÆZƒÄiöà‘º{f)òÜÊ}+Úl˪±#ûr3ÒþRR+¯Yz6ÛV¢Õ®¹}$Ôæ\HxÛ݃[éŒG)[iii‹WrìØ1úZŽ7Ž’ÊmÛ¶‘^ëêêøn%KòÇ®¨¨ oÒ†èuhhèìÙ³iJEÆ kÌ[ÕÕÕEOÖ&Õîܹóøñã$bÊ‚'NœxîÜ9J„Áq«GˆWG´±Ño¢ã·›ºñ'#–Ï.¦pÚâÚ•)DGmxò²XÄrÝa½&î3»reÊ@±Ñ½œ<_V¼æe‹kW¥Š4g”µÑõ&ÛrБלïÏ›i°`”ÈPS}—×ïÜ ^ðz͘1#((¨Åk  TOOÏÖÖÖÞÞ~Ö¬Yß~û­««ë¿ïÁiô¦’’’˜˜-µwï^*O©nÓ¼µÑ­ütrܸq¿þúëºuë>¼oß>###•ÄÄÄÉ“'÷ïßûöí[¶l¡­qk]]Ý®]»lllX,¾n·þ¶seS·ÊŸ6[¯^ž2P|Ìö—óCõ$xnå–ùÇc›7m+t¡Š„È𵆠Â_³A^DLká¸ü—Y6oÞlmmÝâ5¸¹¹)**~óÍ7;w0`yŠ2Ù7¸õþýûRRR_|ñvÓ¦MÊÊʯs+ñèÑ#šC%iå´‰ &ØÙÙ±ÙlŸß~ûVBb¥9­qkNNŽ®®î­[·ðì9 `nµA¼:¢WðÜJy+o2bÏ­kÝîkJö’кhÎ/vÃoæ¸^ÚW-Üü5$Å-õ²äÏ¿î­2J„Üjîöàw)Q1…#fîoØVÜJ ™^³æ_ŠçMF,ú•òÖå.¯_nrQSS»yófËnð$;—––æææfggTWW“¤hU4YUUÕXŒ ð¯êÒ[ÅÅÅ´QR0¥Šôº±ƒnc™¦ ¶T’ÖFïRaþCh%EEE´’ÂÂBÚ"½Û²¬³¶¶–Òg+++܀ͭîñ6ˆWG×­ãw˜ÞàO†7¸Õ=vÕ-q‘Ñ“­®;zÎ[*ß[DRùp„ Í_7S¼¿†–C¸[Ä «ßûˆ[/™»Ç®ùkI?‘¾¿.>¼ì„¿éñëzæke×z[þssÖNNì/Ò_ýï%>Ë7¯.Ök¨¾—åvnxzz’^ƒ‚‚Úý(ýÍÄzõêÕéÓ§·æö^Þ›[­¯Ž(#ž[Mnð'×òܺ†^»/5›?l÷ÂiïáÓå·ø[ò¹¸È@c Dñ#†©Ù¨Në+¡yi-oU&[ÍÇá_v•è?AGyÇ#Ëæ›‹]{è¯I’ƒyEÆŽ]rjåõ7îÜ ¡ÔÏÎÎNCC#**êÓëåË—åääîÞ½‹Ö`·"Ú*àVЬéu÷îÝ222wîÜa±XíX7ôÑJKK=JÖÃÃ.‚æV·8+„0Ü šÁf³O:%++K’ÍÎÎn¯Ÿ1""ÂÌÌLMMíÑ£GŸT8€[p+øX-¥÷îÝÓÑÑÑÒÒò÷÷og9]uuµ££#<˜››˜gËÐ ·Z"„1àVðJ(•+..¶··—’’222 -//ê&búDùùùšššÊÊÊ7oÞ¬¬¬Ä5V àn½k‰Æ€[Á›}”`ee%''·fÍ//¯¢¢"aü©©©ÎÎÎóçÏWUUµµµ¥Ó\ $nµ@cÀ­àmQ)oݹs§‚‚ÂŒ3Ž;–žž.×(ëêêÂÃÃ7lØ ++«¥¥uîܹçÏŸ£Û"·^ 5BcÀ­àm¨¯¯¯©©ÉÏÏwuuÕÕÕ•””\¾|ùµk×)“([±X¬ÜÜܨ¨¨ƒjjjÒ®RÆ@¹*ž{„έ¨4!n-HcbbŽ=ºpáBJcõôô¶mÛvùòå°°°²²²y³q[”Dçää}ú422’RWÊsIÙÈIÜ àVÞ2Õ544mÅåô5×3×ßÌùË7÷ÀýüãAE—cJo?¯ Ê­Nª¬+æç¶ÈpÜ àVð‰PV—Sêí—gw>Õè@¢ò_qÿŒ¹!z°E„¨iè7†!—wXÌ4‹ÉëÕÃÌ¿çëw4 éº*ì;«HñMÑöƌÞ?ùð3Í«òO¤T²Øåð,€[Ü Ú õõœ*vi~urrÅ“»y‡’uÉ¡&¡_‡v#!’ÿíÊ×Å’ÇÌÒ'ÌÛ—7þlEÈ+Ãzl‹{!Í$°ðBZehqMF §ªp+€[ÐAÙâ³òÇ÷óÎ¥moú%e£ï$Ó¶ ýàÏh̾ߟ¨t5ÃòIáù,V »¾’p+€[À'ªõ”¥zçì¶MT\9Ð8¤Om>–R_´3V…}ûgÌÈcÉ: ΰØe8pnp+48õu…5i¡Å.Gži™†~mò¹ Éô Él£.á"Îéfñew+ê Æ¸À­@0Õ”»y‡öÄO[òÅGlõme2»*¬‡cÊ‚b—ŠºBÀ­n‹Zë~¾Ã_qRơ݄S©Í »&ü‡‰*ñe~õ/ W·¸|Ð\µ†S_vwWüd^óo‡v!Öÿ5›†~㔪ŸQÉ©gãp¸À­àPQW虽Í*¢·Ð¶¿a;n÷´Ð¹ŽSƒ#àV·‚÷JYmžcÊ“ЯګU›†ED¯;¹û«98înp+xÔ×srXñû•xC'1ŸH‡v»’n^Å.ÅÀ­nï#c=öLÇ ¤ÓGqœž/3a 3ëò;,²,ˆYtŸQ9ÈLþƒ™lÃÌ8Î,zØ’M…tñÎÙÍ®¯ÅwÀ­nm‹Gö6²ÌÇÊg]á>]zÓ;,²ð3Xùò¦cg¦c'æk‘WHü6aÑ;ºô¾np+h+ê_Ô'–ß·ˆèõÛfßÕ­‹1¿Ìaºö`Fê1Úט¹žŒôFFó\ËoÏ9¨ZPó_·¸´ 5œÊÓ)‹ ¸Cò¶\ޤ6•ƒŒŽ ד¬5fIÀK>`Tq[n'Y1жÌ|ns.wþC%#ÿ7£áô·Î½ÉÈíâ¾5y3óÔ+†ñ×<Ï|Û—é§À•,m­Œ¡_<*8»rÜ àVÐ&dTElÝJ7}#ÊôÆô–b:uå¶Ð~õ3×›4i 3b^CËm‡Ï˜/¾ã qÁ]®y%W3ÝþéБéÒ¨ÖàV¥ÖF|*Óåî[´T>Ì”õÜõ4Ýœü.¦ó—ÌÔÍŒ¤Óg*3Xƒköwz’οïÊ9–<›ÿÄ:àV·‚V^âfúuëÝÚ­'3q-7å$«ö`zýÆOég×Ì ̬KŒ®;óëR®IÇ­`fœä–!‡j_c´¯0½Æ7¸UÏ—é+ÏôèÛáj_åºøÛ~ÜDµYšÌt`Ä&1ß `þo0wë]¿åæË­Ñ«Yø÷eµ¹ø>¸À­ •Ô¿¨Zt±õÃDÝúÊ1 ýyc `ú)q;Ñëás™¯{1³o4››é=‰ùy4#³•ù¬ 3Ó±a¾Òþ·Î¾Îµ¤ènB:a-·óð0nIÅ}ÍÝJY-­|®ws3O1?a¾È,ðkÕ ˆ%µ™øJ¸À­ õn .ºÜú{ZÉ­ƒfþïÒçÀéÜv`z1Xé.Î}ô9>å•ý•™ï4È‘2ÙÆë§|·R¢Ú±óo(ÿmº9ÙL§/¸9oÃj™ «™Ï>gæy·ü#w*©ÍÂWÀ­n­'®Ì×}õ3·]wøæÿ†4¸•<ÑœùòG¦Ï4fÔ"fŒ>3L›ùi·Ñø7·ú3Cµ¹ÍÎôwôrFBŽÛ÷é×%ÜÅ[Ü ì’iSË©Æ÷À­n­‡SÏvËÚÜÊ1„_çVJ*•íщÌç_q»ÿ8’™º‰›¨Òü™ŽÜÉϺ0ßâÞ¡Óx¥«Ó¶2?ýÊtîÆm¦5S«ãÒ|‹s<¹^& sŽeF/ãv£jñý8Vb1¥Þx´+€[Ü ÚŠŠºÂ¿â¤ZãÖEþwQ•ÛéwNãà„ôM.ºÏ»õiƒé/Mrg>ä^0¥½|©ÌâG/yÈí­ôJiRùÆ2ôºÅb5 ùÜ%ú†S…o€[Ü Ú¸2_ÊÝÚÙÓZßò‰®{â§TcP&·¸´1uœ¿¼ƒfaßbní`Ù'©üAý ´¸À­ ©¯¯¯å°|sí,¹Ùë'!Vƒà϶ǎ-õÁP‡np+xpê9ÁEW6ÇŒhýhž®Ò<”¤žVZ_ÏÁqp+€[Á{…]_÷¬âñÁ$uÃÏÛ«[W…}{%Ý<¿:‡À­n†úúúNÕƒüF0íÖž¬jöm‚Bb¹§wܸÀ­àƒ–SPr3ç¯qZù:Ah6 ýêP’úÃG» À­nÊﲪ¢oçìÝ=\?ø3¡»K;lÒe¢bHñÕâš t[p+€[`$°õ¤¤jvELéíãɺ¢¯ í!ðJýlMøt>p-Ã*£*²–S…>Knp+LØõu9¬ø‡ŽçR vÆM4ý’×綃€¤¨´3kÂ{Ú&(¸dX‡_/©ÍÆEU·¸K&Ëb—g³â¢JozdmµKT]ÖÇè‡U‰”J-#z;$Ϲ—w$¡Ü¿ :¥ŽSƒÃàV·!•,e²µV%»8©üÁݼCŽ) ¶ÅŽ]5È:²YØ÷F!]šv(jјŠšštEÈkò‰ê»1zèßñS.¦™>.8Y]Í©¨ãTshw0€[Ü Ú™m_pÇwʯNI,XxÑ;gϵ k§Tƒcɳ÷'*ý7ñÏè¤ÝÕá=Mþ!ównÌv ‚;†|¾"ô z‹º.jÀ–˜_ÿŽ—¶OR;‘24z#sƒož]Xñõç•Aŵ™è˜àV·‚O^?¨ò²º¼‚ê”lVlzUxJE`bùý¸2¿˜ÒÛÑ¥ÞÑ¥·¢J¼¢J½èEL©wlÙø2¿¤ò‡$ÐŒªÈV|QMzy])OÜ àVp+Ü ·Ü àV€[Ü p+Ü ·€[Ü p+€[n…[áVp+€[np+À­n·Â­p+À­n¸À­·Â­p+¸À­·¸àV¸n·¸àV·Ü àVp+Ü ·Ü àV€[0º@ mp+ÜJ/èk€@ ˆ6Œ·t«Óá¿àÖvéV@¼§ u¾Ù­·\œPKB9iIÍu‚@ ï5¼]ÏýÛ­5¬ÊÆ™Ùiϼ®œæg¯@ Þœ±z]=•ö¬™[†‘—™ÒT¯@ ZIQA¤T†½¨,+A ÑâÈËHiêVBUA&-1*ëy*@ ˆd¬$SæŸj)‚ïß ð‹ }Œ@ â-ƒïPæ5ð{7!xûh&Óÿ[ëL endstream endobj 36 0 obj << /Type /XObject /Subtype /Image /Width 628 /Height 568 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 754 /Filter /FlateDecode >> stream xÚíÒÁ À°ÛiõáBñ‘ŒP:s,HÌ¥ñu2O'õt?'/Fâå> /XObject << /Im2 30 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 40 0 obj << /Length 250 /Filter /FlateDecode >> stream xÚuOÁNÃ0 ½ç+|LIc§i’# &"7àP­«Ô®úÿÂM˜4 !KIÞ{~Ï1‚áBÀ6h4Áéá8‹Oa´ËêõΤCŸkÕ¬³…‡EÄ3=òºóºyvØ$ñ˜ÄèÒ^ñ endstream endobj 39 0 obj << /Type /Page /Contents 40 0 R /Resources 38 0 R /MediaBox [0 0 595.276 841.89] /Parent 35 0 R >> endobj 31 0 obj << /Type /XObject /Subtype /Image /Width 517 /Height 568 /BitsPerComponent 8 /ColorSpace /DeviceRGB /SMask 41 0 R /Length 21450 /Filter /FlateDecode >> stream xÚí½wTÉûöýýã}Îïœ÷yÎóº êšÈÙ@æÁœ]E0sãšÖ¸fÄ„˜Ãš3 YrÎ9#I ß÷ÆÖÞÞ =3Ä™áúœëpªkªª«îª®«{˜ÿüç_tì¥A5ýG Æ5éÕů:.è¼"È‚ RVÑ>O»=íù´óÿGè¡`þ3£e~¾4t|¢óû] ‚ HYeÿP‹¶zÚð§z¨q(½ôm—ù^†³èN¿¡ A‘ÌgþZGÉksë;ý#èwU[òºË¬;ºS¯iBA$³é¿ºÜœé»¦Ö¢êÔˆü·6ÑMƒ\€¼@àíbo㹦¸kqµö”eì¡C§ÎLȇ j2›ªr>|íÌ¿Õk-ªNÈkÎjN8­A^@ZôÌxª»Î¤sZ¬VŸ°ŒØ²%|Ó¦›NNÜ|Rý÷;u/5g™NR9´vúMZ‹ªS#òßi܉;h£ÞjÁc“ §´¹"/ð_¹òÑ´i—W­brVÿÕ/fÿþG‡W0‡«Ž÷ŽÞ»W qµàJïÏÂòœ/_?ÓOJϿܻqNÍlõ´¼ëXjÎ2™ rÊoÝäKšµU§FxZ³˜­Ê#Y[¶½­pE&‡^âi4æˆ&yiþ“qÇ´¹ Ùºõòر‡—Žyâè¸ün”óèÈꈭ[?¬]{ôqtøaݺgçûÛç T„ Fó/ö-®È/,Ëu\?®cO‰3ÆääåÙïÕgg·úîv:<اcþ2P³U—±*½Y7á´V­EÕ©žÖºÎPý¯è¥Z·ÆÖÎÙÉîÀ;˜w×dì!®þZ6aîVãe»»‡mØáârâÈô°õëæÌáÊΜիô¨ A$ïÈ´WlX¢Ý¥ùHMÚr7íu¦ÏÛ׬6k3eŽ>]“”YýåSÁÇìã^ëÙºç^n§’ß¾}-*Ï}vuÚñë“YØT2§$íó—ê”üh×;7ü”Õ<€PSk=ÆsKšt7ªúTùõÛ‡Ó=™|ÇÓ–tøésåï'Í™2Ô1’ðň„ºØ©žx¾~ìaíZ‹ªS#<­™Mj)Î襺´FiCžÖH¶{´;˜{Ëdô:"ºjUТEäóç ØAæÎ ß¾ý辉âªCÍVEe¹5‹Ð²³ñ@žãtFnЙ²»;ådçdöTåªsê¹ ¾ õêmcbÖ»“ÛÕ³}5˜ºîoþ˜º~°¾±æªõË©Ì]/ÛÚ”Ï,ìKW/[d4où,æðÞ»ËýgÍušIéä´Ä¡«´Ø’tçûñ5JìÜ»Íz[M¾Û«ÝtxÅÃ]«S[¶ sRæIaüÔÑååeUUUl>ÔlÕy”êÑGlwëÔZTáiÍxL+Z„ôS@L¦¬­± Ü”@k$×vàxÝÔv—®HÝqpx9k–¿££/ø®À… é B\u¨ÙêË×/´µ;v°°Öê\“3få|þüY»S»þŽ:ÙÅitØohOƒîºÙj[ŒÒ6²Tº\‡©n>JÝÂF»‡>•),,èÔOmÔÝ÷9– {¨õž¢ÿã)¸—q§þê=Çë} ø¦cÜnÄ]v«Ÿ²ÔŠÑ1Qûª[oÓIɡá6©îJtFˉºóÖO©¨¬ ÚÏŸ¡iô#j¶êd¥zäÞë-ºµU§FxZëbS³{ÓO‰™Ò´Æ­Î"ÜŽpk$+mÆìÝÌF®Ó©‰KŒwŽé9a‚ŸƒCÍDŽŽ¾”öÿîï±jNoqÕ¡f«ÂÒR»÷TaÎzýtûÙë®ükJx’yeííÌz¦„fÇv}gþsÏOÓ{hC‡ÿX€å]îVáCéQ‡ÍÙaG Ÿ÷o(ß|„· uoÍééUÕß¾}]¼|õÐd°f÷Ñ:˜Çæ,ÃA-\Û8d©^­EÕ©žÖ µ¦EH?%fJÓ·:‹p;­‘†­Ðùi¦#×ëòh×lŸ9sÈ®O˜pÊÆæÒôéŒ;¼›={Û˜1üu¡æ©gA·h):­ZL[7“³ïúJʹ~óšV§v´gþx:¨ñ‹•ÿT,(­y—iþÊ™z&ê&ÿlÚä Ü |øšíùÃWÿë›Þz~>¥Ï\øëÊÝs”p\8Kϼ½@™ugg|ª®$ßY³Ñ¹Æ Õü²cðÌc³–á`U‘8Dl¹ƒUù[“Íx[öGà¶F¶òÇÓÁlwS«º<Ú¶x@кu¦M;üûïöΦ{6Ø‘<1ãï©SÝìíùëBÍSöô/,.ÈÍË™µd¼ÍF£Õg¦~Ì-,É·`aØ]ööj~wàåýtÈ”î“\»Þz{–©XT–Oùã§ŽîmÛéÊݳâ6y*ÉsÈM[oÒÏÌIËÏÏ+(*HÏJÕ2jO»}ï©ÿ*O^@ém»6Óa—=¾{&±™ËpÈ÷-×I+‘ûí?»î¿ ×l¹CT%¶&l+uiíŒÀ!Ok¤a«ÚÁ%Sëͺ<¢ݡ¬[Ðçæ”)‹6ô Ý1c›µõŽy£oNŸ~wëþêPóÔøåýnܹž›—ûåËò‚Ç>7úïN5oõØëP-ûWGFETWWçg¼¹®«­:en¸ð{\B,UÉÊÉ8xm“ØM~³.Ï¡ÀK'ïìdr\÷ºhwißÝVgÈ2å¹`ú £¡ª=6]¦Ç•Ñ`±v@/ ¦êÔHã·ÆÖÎÙiøÚvàpÅÔf«.¼fÌøcÅPJ<³·ßá4dW(qi匀M›ø«CÍS#7èö«eؽY€†a;ãvF–,¬´{ŒÓ¡‡S*0d©n—A:&í5 Ûêš¶³°Óè?§&ßÂFKǸ½¦A[Óv]Gi²ß —¸iþCnÚz«®ñßÁïÔWÃr¢Žµ˜ò\a›¹:û¾å.×ãŠöU ¦êÔH£µÖcªšpE&‡^âi4býO;¸jj³M—GôtðÇÊ¡”¸¸d‚çâñ”8´mÜÅ‹)qp³]ðªUüÕ¡f«‘›tû;èô§Ã|¼¿Ç¾³jžLÙC–ëZNÖí1úû«cu†,Õ¡Ìa«u{OÑíÎdŽ£êºLuzÉrâ?iþC—/Õe»1h_y®0ƒÍY‡«º¾q˜³^­EÕ©ùo4bã;p¼f:j‡.Üç>6ÛŠ‹7Z¼Z²d×fÛƒ[ìÂ6nd^ trâ¯A¤pê8RõçÆa+ôj-ªNÈk¤‘›µÿùÞÁN]ípøföl÷£)}zᘇûœïnr¼³h:¹övrâ¯A¤pêd¥ºbm›µU¯ùl¿Ü·F²ÚúÃæxšÚíÖåÑ2»î; Ú¶`ô‚­Ý®M™²aBŸ5vv{Ç£—–l±Ø¿f(u‚ E”Á€–u”¢´f½í§Ü4µÛ« A5OYo—ü­d‚ ¨9ˆ±áT@AÍJä},{ü÷¿ÿ-ÊËbT˜› A5±;t°yì‚ v Ê2 ‚ æ v“A5ñÛAANAÔ$ÉÒ!‚ æ vñ¨E‹Ê:´‡÷n(ñ!¿äg§)™hkˆÖêÞlýv¬îêÛ§÷µË•o@$Nì +G´ƒu57ËËLes(mnfZ³³ñVlPéèhg$Ç d&ÆFvïf‘Q¿çjÚ‘JìC‡í§Lš*SõV­Ze¥&Éíè ªwI²ƒTÑVÓ§w/º‡ü™sÅý<å|ß$S›J“'Ž?|`Ÿ@æö­›ç:ή÷s5íH¥ì[LxÈïÓ§M7Vi†APC¨Žvàvîô ýÙœþýú^<†ÝIrÒ“V¯\®¥¥ÕºuëiS&¥ÄG±iÇîhdز¥jÏ=^{?¹ÕnGzéõØØ¸KnF2›“™š` ¯ïïóŠÛæ Ë]ͩԣ‡ðw øý»1£mÛ¶mK÷Ì£¬­hƒ(ÀMpáƒÈs‰ N]¬*>:¬M›6lþž];( ¿üò‹¸¾ g%6Å3¢¬ÔÄåKkijªuè°Ûu¬DÎAfy™)<¢Ëœ.^cã'ïÒáýÛ7(M9”Ïزq½õÈaÁï“ã¢ìgý¾`Þ¶âÔÉ“ÂCüS¢7oX×·Oo6_ }þˆ“ÕH·³§ØÃ“Çþœ8~¬@›šššîçÏd$Ç…ú9ΞÅß®æfwo^OOŠMŒ‰XºxáŒiS wõÈ¡ý£íFñÇAä¹ÄGVq»ÄØ·ý˜ð`‰sÄVçŸGiš9¢5«VÐLQù„˜p§%‹ø9_Õ£êhôóσŒmW³ [[ÑÈÝIèFÎïíK&õ!HGG›­õI§%ƨªªÖ¯1qwÑnÝ,ž=º/Ц¡Áþ}»iÛá9£ÈP‡éÞ•ßn߸fÙ³mhüqg"ƒSk; íÚ~æŒqcF³ù¡l1ž9’¦Œ”M‰=V¼÷R Ûâ9_ɕР›®®Î¹Ó'è'¥¹; ]øÜ·~ùåþ]·¾ì€Ô¿_Ÿ{·<)qÓãò°¡ƒ…Ûôzü`Œ­¦†Fçή]vãï=þ 8€n°Å „[Ñçµ7=%…ø²9ââРA`O×¾}»‰ÆÑÖ*²AiæHÊy”uºUTT²Rº-®‘óAP£ÙAnF2èjeÛ¶l¢«xûÖMù†út;ÇSQàIMˆfÒ±!ÅdÒ÷ó6Ö#)1rÄpÏ«—Ä:'=éúUwºåžÞ¹Ó'b©|bL›/œ ]×ÌÔäÑýÛܳˆ‹ƒÈ ˆ ެWQ _š9’renz: Âü±˜/‚êQõbâò]6o´µ±ð}™ÿæÅÓ©“'òï½{YnÚ°–6dÚ&M_; }âë©ãGztï&ò\Ô™w¯ž§'Çy\¹¨©©Éß uõ+ϧ'Åú¾¡ŠU–C#&Úˆ9AM²ùHc\×€N\;@4äD…9éyÉuý¾gFR^f 5…xBò¼ùÀ`x/ÈH‰¸|îØ× uÑ¡]›.9’õDT!Ø;P8Ñ-½‡ÛÉ7ÏVUV|ù\]k•—•¾~öðÚ…9œvCì‚(Šr3’èÆ¾ª¢¼ºªêSeE]Tþ±äð®Mi Qˆ*;€`ŠgéI\7|®þô©¢¼î¢¦ÒâÂU¨öï^æf®YµBM­ƒººÚšÕ+éPú2üua°H:;¨ªª(«»¨©TØT9|°ÿ~1¡$J?zXú2üua°H;¨þTUYþ±î‚@uÔ€ýܽŤ)1hàéËð×…À ©ì ª²²¬´î‚@uTûöíÓ’â˜tjb¬šZéËð×…À )í âcIÝ;€ê¨_ýµàçg•)¡¢¢"}þº°Ø$Ô|.¨´¸î‚@x:€` nåå¥EuìÂï ØBÛAUeyYIaÝ;€êúÉ¢ChWg>D Z´hÁ_†§.ìvIke‹ ê.ØT÷ï¬^鬦ִößß`í@\žºMhînç ~ùå¶ÿuW‹ï4òÔÔú¤â**º4É,4hO; ‡ƒÒ¢|®Rãb¢Âʼn^(ÏvÉù½híì ÅOhW×ÐPŸ2ibtx¨”çÕÑÑ¡Šïß½n’Ë¿UUÕÎ:­[³:;#Eí .³ÐÈ›p=†½)ìàciaWÑÆOËJøP <#ؤÄv@ º¢]·m¥´µUÞCÊjL:!6Òq¶=Οë(Ûfíì v³Ð$vÐha¯g;(+-)Èå**,”¶ýìì,%˜ÃŒÌôôŒtæP <#ؤÜv@ÊJK¢t«V­¸opíݽӸK—–-[¸nwaß§jñoØœCû÷1ï ñWôànÿþý~ûí·Ö­[²±º}ó:·ÙS'™š˜ÐÍg×®æß¿#ÍF‘C‡íÛ·—²çÜ~r›*ÈÉ  ¹cG#:»‘‘áŽm[ 8Êxßž]ôµI;ó׉z·YgtòøËž=Z·j¥¯¯wìÈa‰£¾ôã’vÒ{wSί¿þJdì'âxfVâdÕ—T”•äpBÛ~^^®÷ /J0‡”ÎÊÎdÊ3‚@Jo™©‰”ÖÐPg_ÝåºrfÛϤ=jóÆõ”Þ³ËUÜÎÀ.œ?7#%Abu===:ô¸âžžüøá½Ñv¶ÜFæ8̦F®¸»Qšv‰ZìK<§î'·)Ú9)½z¥3ulÅr'JӾʼtà=t8iâxº+&Mœ0®!ì@¦Y8¸/ŽmF]Zºx‘ÄQ_úqIctjŸ7t^ò)zÉÁ~–Ä™•8Yõg%ÅùÙ\EGÔ<ø¼ÿþîPÍ!¥sór™CòŒ`rÛANF*ó6ÅÂóØW;uìH9Á¾”NIˆ¥tçNøí€öiª·k׎nh_y?xÛ™i„yç<73•y;]â¾”Eû ÷] žS ÷“ÛÝKS:6ò¥c"B)M·ÍÌK]:w¦ÃÁþÌahÐûz·Ygtè'Ð Ï(„‡/ý¸$†«üìtzIKSSâÌJœ¬ú²ƒò%ù±Qá´í—GÇDR‚9¤taQs(²5ؤܿJf  “îNÙWé¡^ À¯¿þÊoÜÆyªïß·»uëÖ”£¢¢Ò·Oï{·oH٦ȞS#ÔóµkV±æÂsjá6¹9LEæ­fC£îK”Éæe¥Õû¯’e. T9 qÓ$͸$†ýÉß÷‡ D^Ï|ÞŒ»çó̬L“U;øX\—™ÂUBLmû¥¥%‰I ”`)]\\Ä ”g;€”ûé ).šîñ(;ÿÌÞ|ÆF…Ió¾ð•Ë_=;=ÙûÙc×í.TFG[»vv .&<§æ·}ö¾š~6òÓ¬³ îé€gÂ}®õÓ°tuuéÕWèþŸæ—[˜gfeš¬ºØAiQ~nF2WiÉñ´í—”3vÀRº¨¨9(Ïv)ýïèú¥mYCC½0éžyS—áÓ“ãoßðec%½ðTŸ8ayANF*ý¤2FF†õk<§æ·ƒukV³ïº¯t^Féí.[¸¿$4q|bl‰ ñ»™fû»²’Ë$ŽB¸ÏÒKbØ©çô*=#P?—;-‘Òdš¬ºÚAzWô(TófQqó8À~·:(Ïv)½˜7®'OœÀæýóPîÝ[µjÙ¾}{ÛQ6wnzJo<Õoy^>lh«V­Z·n=pÀ¯'ë×xNÍot[»võJ}}=CC—-›ØÏäæfîÞ¹ƒ2[¶linfzúäñ†°Ygáı?{öèA/QŸÙ¯«óŒB¸ÏÒKbØïݾannF'%?r耔v ÓdÕÍòrÒ¹*ÎÏæ~Ñ@øP <#ØT¥&Äœ<´s“cݵÑy5•–ÛäßJ†ŠðG*êT”æe§%pU“ÎS‹^(ÏvÕEgŽþñüïÛUU•_¿~a\]ýIJQa¶â§O•Ïß=w|Zb ìvÉb¹Ù©ñu쪋¶®^XUQöås5«ˆÐÀªŠr)E…¹u«*Ë©AØì’Í r²Râê.éí =! ‚´eå‚êOU\……”,aõâGUe™È‰ T§Ù¯Á`4vPœŸ“™WwÉdc]Œ!ˆ+—Õ ?UVpä_ZTÀª²â#Id‚D…ªSƒy9°Ø$£ÄÖ]2ÙÁ¸í&Ë_Y@«íkWV”qäW”Ÿ#¥¨°@ujv;€d²ƒ¢ü쌤˜ºK&;¿Ód¥_7båºnIEY)W¡¾9¬¼\«(/™ QaêÔ ìvÉfyÙé‰Ñu—Lv0q·éÚàÄj׆¥ÿ};Äÿ]nF «Š²’ȉ T§a°H&;(ÌËJKˆª»d²ƒI{Í ˆ«=›–},)ä*øýÛ¬Ô)E…ªSƒ°Ø$›äf¦ÅGÖ]ÒÛAiaÞçê*âjß–åÿ_/ÈïMzb +ïû×ÊK‹D&HTX :5;€@²ÙANfj\DÝ…ï@uÑ¡í« ó²¹ÿP)Ðçw••‘D&HT˜[—š¢ñ½Ø$“äd¤Ä…×]°¨.òt;ñöùÂܬ¢ülF>/“¢C¥f+R#ï¼Þp;‘ž ;€@RÙAFÒ¡]›’cÃRê,jäð®Mi°¨¶ÊHŽ¿~þèÑ]kïXÍh¿Ë 6-QÜÂÔˆÇù£ÉñY?ÿ$>ìvñ+/3åÚ…Þn'Å|H®ƒ¨º÷ã;žO¥'D!ªP­•–S_¢ç‚Ì”DöÿÉÂ`¿ s2’¢Ã.Ÿ9B7ö\7ÔZTýÊùãqáyɈ*$·›”vŸ•š™Û ÿNHFbTVr, vÐ\¡æÏ“¦'D¦Å…§ÖVT7=1*7# ñ„Ýò³Ób>œ8èºÑy^½üµm9Ñá]›%êèÞ­þÊLK,-ʃ@ÔÌí 3%îÔŸ{ß»‘žš”‘–¢4¢Ýþ›$>UU¾ó~|ëÊùª†ß¢aɹd$FÑsAZjÒ•‹;øúõë—Ïü"# g„ÏÕ•°‚š¹¤'D­sr¤Ûi峃¯_¾|©®æªª¢B ‡D%?WWÁ ‚píàväŠz‘\ØÁçÏŸ?U± ôojjJ?¹™$e²ƒÂÜÌ5«V¨©uPWW[³z%ûI3½{í=ÊÆªM›6zzz'a2ßûØX[ýöJÐ!·JBl¤¡¡A½ü“bRÔÏ(æõ; MþËgz¨dðþ½¦¦E›~RšÍ')“9|°ÿ~1¡$J?zX¸ ­C##Ã+înYiI¡A޳í™|Ëž=6o\Ÿ’KÚ°nM/ËžÜZ‹Îwݶv5g)èõ;ø¾É¢’üßûjki;ògqa>ý¤4å0/‘”É èÿàî-&M‰A—™>m*{ÇÂU«V­²3R˜tvzrëÖ­Ù—|ßwéB™â–ëí][¶lÙ±£{äg§ÓE›šš>uJzrü¯g¦:/[ª¥©IwY{v¹b“E z}Á˜M¾ª¢Œdgg{îÌi&M¢4å°‡ÊdíÛ·OKŠcÒ©‰±´„ËèêèìØ¶EWW—Z§Nž”ÿãï\M™4qëæT‹î^è6†Ù*v¶£.œ=E qË•ÖÞe÷ ´Úévh®£“é²e=G……ÐBu°ŸµpÁ<&ÝšÕô(Mùt¢åNK°É@Š"½¾êhmÂÝáoE¬ø}Ù`m]u=YÎCè'_ì ºª²²¬”ô±¸I°âæ(“üúë¯9Lš***Âe(“VTR\4i¶ýLº¯ø±HÂCéÞ£Åw(AÃLþÝ[žýûõeÞ&·\ íßG+›Iø½cÒ±Qat™0i}7N!H!¤ ×W½<ØóÛ^ƒ:_x½D‰•ûFóäˉT|,‘¨æöt@eØ;Z±4ËLÚÚjäÆõkÙ÷6éÉïÞ­ÛÓG˜´¸åúÂëÉØ1£555ºtîìyí2“©ªªÚ‚Ã/¿üÂ^/yYiØ[ ¥|:Ãë«!ì ×à.»/OgÒ”è3Ô˜'_ì€FW^Z$Qâì€ ò±#‡;wêÔªUKšµ›×¯®]³JOO¯eË––={<ò7Sòу»ýû÷£gÃÖ­[ÓcÚí›×åùwƒ ä.×víÚ1éÖïm¶jÅžÏ]Üò¼¦óó.…nièŽH¸ž %þÝ^_ aÚºêWü—2é+ï—Ð!O¾<ØAUeyYI¡DñÛÁÂùs3RÈ‘™Ãóæ°‡¦&&LI2:ô¸âN³üøá½Ñv¶MöÉ¢ChÅ2Ÿ| ÷“ì2;yüȇٴbI5³Ó¦2ù½,{²Ÿ| Û˜>½{‰Œ‰ÈóN›:ÅßçMNF*9¦–¦&“¹cÛ;ÛQ!~t¯âûö%ûÔ¼~-~w)æ'‹óúj;h׾ݭpç¿/wnß¡O¾\ØAE™ÇéüúX\Àoñ1Ì/ë™Ãب0æmCîÓÝ׿ò~ƺ~ï`õJgz†%­ý÷碹+mÓ†u´¨èqfʤ‰ìL€ïÛǵþÎÈÃÙ·%¥Y®nçN››™ÒÓ«…EWöሢäºmkÇŽFô0Õ­›…Ûù3ì'–-]¢¡¡®®®¶oÏ.l2}ï@¯/<Ð&/Í;E…9üv Íáþ}»iŠéPEE¥oŸÞ÷nßÀ·’!R¦o%+úïÊJŠ ²Ó%ªîvÀ¼èýì±ëvÊÔÑÖ†@¤Ävà¼ÇŽvþŸ Ü…óÉ"ùòa…ùY©¤¼Ìd&ÁŠ›Sw;˜8ayANF*ý¤L##CØAÊamÿÍ?ß/p¤­«Nš¹|ð¿¾w ”/v𱸠/3…ôò‘gô&MŠ|ûêñ­üì4æ°îvpËóÚðaC[µjÕºuëx=y;€ H™žý[É¥Eù¹éɤԸ¨¿=ÏGùf¥Ä‡ú½xxý\a^NaN&ó*þ¢)A°%·ÚôÓ¥ÆEü}ý ù¡ÇYÊ.ÈNg_‚@;Pn;()ÌËNM`EŽðìîÆ ¸ù°‚`Jn9Y)q\1¿AÈ„@;Pîÿ†VœŸ“™+Q°‚`ÿü¯ä”D峃¢¼ìŒÄ~¥'Fã%C; 2™)q§ì½{ÝýË—ÏJgYôìã´„¨—Oïß¾z¡ªá·hØArnùÙié)ñÞMÏ뜕FdEÏ×ÝÏä–åÁ jæv@‰EùŸ*Ë>WW~®®jfª¤ÓðmF`ɳ@°‚`ˆì‚ ØÔ˜bì‚ ¨ñ7~; Q¨1…˜CÔT›¿@P“(>>lñ¶Éƒguê®a¦Ì„øp¬+H‰´ƒìÔÄgw.Kü÷‘Š"ϳ‡žÞrró¢ÒŒHYGJýŸ³ÞvþÑ¡;½'ïz=ª£v¾˜¼àذ…[Æcy£Ã"»Gû<íöüvðüÞµˆ ߪÊòêOUJ Hx Ï“›îJ3"e)u{¨ƒÉâ‡Ý—<"uƒê®Å»QH•cå+Üò–ó3Ýó¾ïÁožgåg§æf*h84(e‘²Žt˜½éª=Ž+v΂êKR,ot˜§{üv@Ï9J&¥”òt¤C×o_¿~ûòª/QH±¼ÑažîI´r %“RJùFj3§û·ÏŸ¿Bõ' )–7:ÌÓ=Év•¦dRÊA)ßHíæY~ù\ý¹úT_¢by£Ã<Ý“hy™©J&¥”òtÜ‚>Ÿ?WWúÕ—(¤XÞè0O÷$ÚAnfŠ’I)¥|#¸¨ÿçOŸ>UUBõ% )–7:ÌÓ=Év‘¬dRÊA)ßH§,Tý© _­GQH±¼ÑažîI´ƒœô$%“RJùF:}éÐêªÊªò2¨¾D!ÅòF‡yº'ѲӕLJ9(åé¬e#>UUTV|„TQV\^”S‹ŠR,ot˜§{’í 5A>••›V‹Šò<(¥iíúïàló©²¼¢¬PÊE§˜m}jQ‘BŠå­ô®K÷$ÚAVj¼|*öÔœˆÍÝkQ±.ƒjÑ¢E3i“÷îJ»*²ƒ%õ.šÄ†nªO! âXß™ÿ+hÚò|®ËZ—BŠ Yé;\—îI´ƒÌ”89TªÿÙÿ]IOOÉZ·.ƒ¢Ë¼™Œ´Éû¿põتŠòòÅõ.šÄ†nªOÁUYq^ÈÜLF³“dªN!Å…¬Ü®c÷$ÛAr,«˜ð Å çu42TUUQSScg{óÚ%楚}’SRœ¤,ƯŒÄÈà9ÿ{QdDúËT”޶vRL˜À«1aÝ,Ì£?4\ÿ¤-D!çý_²vBUÅÇòÒBF5ìÏ4¦DISKÊ–Å«]ÇZÒ¦] ´¼í¬Ç“BÞÍŸã@ÛiKUUÚN­Gޏê~¾i»'Ñ2’bXY>oÎl¿7Þ©ñ‘aA¾gN2h óM·¤8IY¬AÅj¸1û÷ìxuËÆu³~—çþ×b¤ŠØÿeë'W•—•1¢ž³iþL‰’¦–”-‹+V»Ž‰ÓÇÂ|úù‡j äJÓ…T¡×3ÏòVˆp;ì÷†Œ`ýš•ïß¾H‰‹ˆ~Ùí m°MÛ=‰vžͪeË–±‘ÁÜFÜ{ &Ç÷µ—Ý(ë¶mÚ´jÕÊjäðÐÀw"‹]u?gnnªªªjdhphÿná–¹JKˆ Ÿâ.Šš2 áü-0bõäá.;¥&D²/%ņéëé½yñDdÿ™!$Sâ#œ—-ÑÒÔlݺõä‰ãc"‚äa¤Âý7À„èÐÓ¦üö[km­­›×7áL­Ü8­²ücYI!£š ögZ83",dü¸±mÛ¶¥°ÛÙŽJNˆeòïݹխ›­ÛN;þuâ8[ëØÑ?)‡ò{YZúù¼n–…¿}*°g×N6¿ý6wŽcAn–@ÇJ óÖ¯]£­­M!1}ZNfOÇDª$3>zÇJPèþ+D”¦\[—ýêO#Œ(¤âÖ%\·m¦ÅÿË/¿ð,c¹]Þ×#»˜gÏú½}»v$û™tȿȳÃö3§oÞ°V\Éä¸ð%‹ækjhtèÐaûÖMÖ=ÉvÅjèAS&ŽpûzBT7ŸTRΡ¹™Ék©XôÿE æN¾#‘_°å¿ÿk6ÿNv𱸀õ„M gZXt}ôð~^NffZ²ó2§Y3gòµ´´®]¹”Ÿ“6oî¶íÌq1‘¹YéÛ¶né߯/OËüíS±1cF'ÅÇ’ÆŒ¶[»fµ@õí.[GÙXÇFGdg¤::Ì^¼h!OÇ„Uíâð¿k~MP\@¡ûüù3ûV‰)“^Š;0†Óîî×# ©¸õ@‰ÉÇѤó/c¹]Þ×#»˜m¬F„¼ ñK÷<Ë–,ä_äÙaí ßWâJ®\¾”¶&ŠsT¨ÿâ…s­{í -!’UdÈ{g§Åæf¦tKih ¿hþœˆ`?æ% )·$WqÁt;!²˜¾ÞW—Ÿ—âê2Jò½âðÿÖ,ø„Hq½±k$Æ^ÝÀßwP7=Ü{÷êÉZt5xÇSšþ „=¤»£W^3é÷o´µµäd¤<ÓÄ ž®®Ï«§Lúí‹'lùÆïÿú­ö•e¥¥…yŒZˆ-À*73ÂΤ ÿ<¸?&2Œ[€j¥&Ʊ…éžV¸‘- ·OÅ>0éÐ@Cê;v ðcÒ ±Qº::<VʵõLè(M¡«¬¬,æ@‡”I/%ž]@eBfþkRqë´;±ùâ–±Ü.o‘ [WWç÷c&ýúù#ZÛü‹¼1;¬ª¢’Æí?s¨¯§Kæo­!º'Ñ’¢C„•üüÑY¿O6t“Cá¸}ýRÿ~}è š#=Š,vÿæÕQÖ#5ÔÕ:u4ºpú˜Ès‘¢Î.fHiq½yd• žù?âÚa$0¨>½,=.£Ä¥ó Ø_Êþ „=TQQánVlEy)·Ÿâ¨¢òk|D“ŽdË7~ÿ7¹8Vå1ªÙ`¦…3½½ž <¨M›6ìp˜ü×/¼Æ£©©Ù¥K盞×D6Åß2û”.ÊÏfÒ…yY5Îòïê”#°x:&Ré÷÷רAQ”••åp Ã;(Ê‹ûsRˆÃÿ)ÉMåi‡D!·Ö³¸e,·Ë[ ÿ"3už‘7f‡µµ´ü^?7ß{ÈßZCt¯vvð£3¡~-[¶9zº:'þÜð–Œ#<ð¸UÇšËų')><犹²‰µÈ‹‚^ ßc<û'†ûÊ´Iž?u”ž)AÖæ~ý§¥EÃgÒÁ~¯Ø|}}=áY–“‘rû/n€º:Ú¯½2éWÏÌWcöëöyd%…yŒ¨'lZ8Ó@_ßÝí|zJbqAnFj’@aʼ}Ó“îÌE6Åß2û” `Ò” bÕ c¢Â…ÛÙ1qÊ õ*ùþtP$eÖyVœŸÍ߉B*¥ˆ[Ær»¼En,´˜i 3éOîÑ¡4‹¼q:<}ÊÄ kWˆ½<õt©Ãí Þ»'ÑhŠY Ðöÿ·^qá>/Ïsœ5°_æ¥íÛÓó[R]MíìÉ#Ñ¡~í‰ãÆÐ0E›8nô³¿oÇ|xïv渆†:÷\Šõ¾L?Å]ôRÜóË ü•dnfúç=Ý,Ì%öŸMôìÑmÍÊe‘!¾¾¯žŽcËæoX³ÂjİWOÄ…<¹ƒêÊÏH¹ý7ÀEóçŒeäó‚D÷{l~ã÷‡ë¢Š²’’‚\F5ìÏ´p¦††ÆõkWr3Ó§O›ÊæS:Àï]^Vú-O--M‘M‰lYMM-Èß—=×>%è&?16š4vÌè5«V´éºÝe´í‡ €‚œL¿wo¨.OÇø%îw…ÒÔeD!·Øÿ2–Ûå-ÐF ç9Zðö9iäð!´¶ùycvø­÷#r¥Õ+œÈ˜(˜Aïè^”퉳ӢÆø¾|êÿzá\‡Fëžd;ˆ buíâ™1¶Öj:гŒž®îïÓ&û¿yƼ´~µ3ó(Íž9q¸SGC*f ¯ç겑Í(vìÐ>ã.t§mfjâ~ö$÷\â$.#A‘ŽØC}8zp›#®ÿlâáík=ºYP-Cý=;¶°ùñá׬ LUUUr™ã‡ÿ«‘Jœ È`Ÿ)ǵnÝJKSsÃgESõ×®¥5_Â-ÈaD=dÓ™W/uéÒ™ºgddxðÀ>6ßíüYs33……E×;·ÿóRì‡÷ æÌ¦{6Úl·mZ×hÝ“htó,o¢5ô‚UB¸¿LÕåsPr8Ògow42lªþïݳ¼¼¬T¦íNéEûÈœ¾•\”,Su )–w]¹œï2ÙÁÇ’FïCºÝÛzþÎ9—Û=ê*Ûm3pn$7Ì"£ôñ‘ÍŠ Ñ6›••W/ç¢NRWÙn“~ œ“I#Ä s„È(}|d²ƒÒ¢|FtãS§¢®²Ý&1çæ@ÒqÃ!2Jí Ñw;ˆU}·ƒã ¤†>oCÇ­‘‡Ï퀚šÚÄñãÂC‚ú¼M>G»wºª¨¨ÐÏFXéÉ Ë–vêÔQUUU]]}¸±ïÝi’Kƒ?2<«±.jö\mÛ¶µ9"Àï]Ó.n|d²ƒâ‚F´ÇfæF’¨«S¦ß·ß…9d3¹‡M+ê*Ûm3pnްÌÍÌÞ½~Q”ŸMË8:"Td£Lù ­†>oCÇ­‘‡Ï–§ÞÆÇF®_»ºw¯^ }Þ¦£Â¼¬Î;<°¯K—Δnèi;Êfñ¢a!¹™ ±Qînç† Ú$—dx&…}©~'Žm--9~›ËKËžM»l¸ñ‘Íò³ÕØAN‰ºçgjfüæÝC&‡Éd~OíF[µmÛ¦U«VÖ6ÃÂ"ß°öÜÞ©“QË–-»v5½ÿðÊÑã{M:·l©Ú£§Å‹×w™bi™V¬Z¤¥¥ÙºuëÉSÆÅ%ú³§^5vð³Û¤çä°ºçf 1™ÉÍ/ÈÉX»z¥¶–u~ú´)) l#‡Ð…ÙªUK ‹®Ï=8}ò¸©‰ …²gO¿·¯¤©Þ±£SþÝko&S «·o\§Æ© •>&BÊÓž-0~‚m`ˆWBrÀæ­«Úµk;qÒhö°o?K¦ØÆM+FZ }›à7sÖä¹óg2ù2‰ºÊýë¾ÌÀyþüïÅ gílGQâàþ½Ž³íÅ£!ðç»lÙdcm’žï`?ká‚ylIÇÓ”•–´cÛ–víÚM<‰=ìß¿ŸÄêÓ§N‰¥kmëæti‹ì–¦æe÷ ´ËE„Íut¨û_En„¸I*6ÚÎ6.:œD§[³j…p³·o^777£«†9¤á»nwáé]wׯ6tˆÈ²‡ëÖ¬eS3#) ±Ë–p_½áq….O+îç® çˆÂõ׉£”8uò3SÜEAyص«ùƒ»·²Ó“Sc—-]òûŒiRFxÄðaÓ§M}þäoª+q ;rxÌh;þè5Pd„;Ãæð'D^†+—7–¢G¢½]äjg3)¤4Øþýúò„Z¸‡ ŸZÛAzvXú÷I,w^@wò™\Å'hii°£߰ù‡ªª*LÚÈÈàµÏ&þRGGK¸Y‰’ÕæÏuÜ¿o7%&Œ{áì)žmM¹£;‡¿wL:6*Œî؉±QLšö:CUUU‰Õ“â¢…Ë ¬CCƒCû÷Ñš©¯?’ßq“&,”àˤƒü}è&VäðéòdúÀ”¡ø»¡®®öþÝk~; vßû·søÀzzz/¼ž°™––ÝnÝ=ÏͼsÏmÀ€ÞmÚüÆŒ?jñ’/pCÇV—IÔU¶Û$fàÜVâÞñ¸}ãšÈÂâa´B:/²¢¸CY« ä{=~0ÆÎVSC£sçN×.»‰ìªLj´¸IfvZ"“ÎJM (‰,Åý¼™© •œ6eòþ½»øO¶yúÇòŸZEE…Î(ÜExÍJgn¦”sטs´bùRÙYéì$MäŸ<¼;hà€6mÚŒEb„Yåf$û¾y1ÇÁÞjÄpáSø¼ö616 𕽆[½âr¤I/îú¹Ú™L K ï›¡C_r;ÇjF4>2Ù í±I©¤—üž y½¸ajÚ%"ê5›©§§s⯽a‘/Süã^±ùÜZ<‡úº~¸/ÕBÔU¶Û5+óûÀ¹9\E‡««©å¤'½yñÔ¸KqÅHÔIþ|Cý°à÷+Š;”µºÈþÐ@®_u×ÑÑæˆ”j´¸I¦¿Ï+&M }==‘å©'Ý,,V,w¢[©ôä8‰§KOŠ¥›X&M—[jB4“ŽaKèëû½})Ü· ?²ë¶–™”s×hs”–£¥¥üþ›ä÷–r(_bä)ÂçNŸLˆ §~&ÆD°¯JŒ°€(¤­Z¶8EÔ‡ ò”G÷osKŠ‹^­^áI¾¦x‡zºº´É³ëSäŒs3iñÐÔ'ÅFò„Z ‘lvžÄˆöØÄä÷¤š‡úï F;\×MŸ>žÍTWïpöüÁèØ7¯ÞÜ™8юͨ%îpÃÆeVÖC_½¾ïóäé5j[LJÕØÁÏn“~ œ“ÃÕ•‹çm¬FRâð}3gLWŒT3G¼ù.›7ØÚXø¼ÊLŽãýtêä‰"+Š;”µºZ‡¾¯½Ù|*ÿî¥ír—Ý455x"¥-nü‡”c7*úCi´­ ÝôŠ>éÜ©Tøè¡ýO—¶uÓúÝ»1‡½{YnZ¿65>*,ÈoÒ„qlɵ«VX[øèõÁiñBn;áÁïi[Û¶e#ÿÜ5Õ8rˆb%9ÊÚêäÑÃ#¯¡®~Åí\zbL ïkê0÷Uþ<èüé“‘!Y)ñ¡¾‹Ì2h À)úõíÃô+qÑk Õ+¼ ¹‹MbBàpùÒÅãÆŽŽ &ÑB¹Ú2iÚ¿—'Ô˦Aã#“ä¤'2¢=6!ÙD}fŒâ“|GŽÌfž9w c'C•_ ô\w®cój‰;ŒKôÙ°i¹¡¡ݰ™w59~r7·˜”ªùõÏn“˜ss¸Zåì´aÝjJØÏœqðÝ⊑„ßaó™DVj¼Ë–FF†-UU-ºšŸ;u\ ÿ¡¬ÕiCkÛ¶ {xö¯c´A©ªªt57ó¼æÎ3)Õhqã?¤Äö­›´µµ~ûí·Y¿OOMˆ9|Ò…³™wÉHŽ“Ø z<'/óyýœyÉûéCËž=(tüƒìaÛLOŽ]²h:¡¦¶Ûu›@ÇÂCÞ›™™nÞ°–gîšjŽúô²¼~õ¢@æU÷ó}z÷’ùKÎtîÔIEEÅÐÐ`ßWé#|çÆµñcÇP¬¨®¾žƒýï!þ³)¼ÄE¯V¯Àxº'1!p˜9cÚ”Ö­[Ó¥}›† ñŒ7®]êeÙ“'Ô˦Aã#›¤%0ª±ƒ$…Püì6éÇÀ994’“¸Õ\Ò•cgKû-æ¨á¤@n’Õûîå³N;*V|d²ƒìÔF´ÇÆ%ø(„j¾@ý³Û$fàÜHÉIÜj~•,©LfrÜáý{ÍÍL)9j)\„sõ.]´ 6<8,Èo”•Óâ…Š™ì +%ží±±ñoBÔU¶Û$fàÜHÉIÜȤ)ÓÑÈèñýÛ˜£†›ÅŠpc®ÞÝ®Û455Ú¶m3mò¤„¨0ÅŠŒvÇèÂ]—Ș1qoä\ÔI·».l·I?É$Ä s„È(}|d²ƒÌäXF¯}=i›U€ÿ†v×åß ¶Û$fàÜH!n˜#DFéã#›$Å(º~ \ñ‚¸A˜#D¦~ã#“d$Æ@AJ)™ì =1‚ RJÉf QARJz;¸yáA¤¬’é進;46½ì`Z;-{kºÄ»ö¢êO±ü½™£§ÉœÃ}‹ `Ðp8¿7[æcR -ñ6^ð·I­EÕ¥<Ñr_³‰{S’aЀvàgêôÎDV-~n<ÿ¡I­EÕ¥?õpÂn㔤Ø4¬¼5‘I‹½êæ^Æ2Ní mÛ¶XZM…×£»ëœy´Ñy¾×£{¢ð °ÜÇtékéµè©ñ¼û&µU—ét$êáø]ÿ²ƒF ì@¡Ù¯ªªä)PUYIe(Dá´ƒwfK_™J©EOMæÝ3­µ¨ºôçbE=¿Ë„k¢z·ƒçÏŸ?^SSÓÈÈhÑ¢Eyyy ±&ÛþDd¦ÀKß¾}Û¾}»¡¡¡««+ò·SïÐý@½”©#,`Oáµ)ýcô²—âú@=¿ó_vÐh!ªw;˜4i’——WYYÁÚµkÉèÂ^ÿ"‹¹¹¹Y[[g‡—.]jäG'9Ù $Æv ·k[Ö5ßpk»±íà™ÄO„R±…LØýRèöÄ«%Qâbˆ ~<2¡vrÊ“O~XòW˜%˜–7½^ú©`çûñ|ŸG}c6n»±ÂÙíݺuSSS2dHxx¸pãÊg666oÞ¼aÒ”°µµmžv 1°ؼ…×é•Ùb/S~Q±¹·LY%„î3‡IS">?˜?AͯkÚùúí«“w·eÞÝ¿~ûB‡K¼Ì¢ |ïÆæ?û/Ó1[ïé`Þ¼yYYYåååû÷ï9r¤pã=;v¬BÛ‘‘ù]ïÞ½>üåË&___¿´´”I—””4O;Ø"ÚÈ5¯ÏRÏÉÉaï~ñt€§å¶á5¯4v°ä©ù‚ûf"E÷öWÌHTŒI0ª¨.[ìÙ‡I/öì[þ©Tt~u©¸–>èšX꾇Ò9e)ÇÞ/!e—%‹<ûü;æ£7*ܹsÇÔÔ4$$Dá.|ž¥ž——G»“Æï¤Œì@¡í€»æ•Æ?1ŸÏLXsn˜Î¾lÆˆŠ±iR|^è^¯¹Lšq¹!Âùû_͉/Ù2éVäáè¼÷ îÕœš"?è¾øA¯ß¾ˆ<û¼Ûæ£7(‰œþœœœ…h#¼,|`>÷†#‡+¦öÌj-ªÎ6U ‰;û\Os»u&ÿþ›E"Ø ùPcž´åš9\6µ?oVkQu¦Ú‰çìs¯ ÚA£;4#;¸g>ÇÃl¶»é¬sfµU§Fj-þ³Ïõ€@ƒ3ÿ®¹ýEÓ™gÍj-ªîxͬ֒xv‡+ævëMðßРAYqyˆãó9Wk©¹7ÌÜ1¯µ¨:û—̧ì7±µþW2€¦Bz;( ¼À͇‹Gw3šœ v Ê™ƒÛÙMn;€†·ƒm°ØÀÂÚ¶m‹¥ÕT<¸íÁóuÒFçùn_G m„W ì ÑB;PDjþ¤U•„?iEe(DáU;h´Áˆ»wïŽ=ZCCÃÐÐpΜ9qqqLþ;wFÅäÛÛÛGGGó—ø Àzzz Ôa)ÿ୼ŭ  `Æ úúú›6m¢Cþvä9‰vÓΑ¸ò ÞZØAanæšU+ÔÔ:¨««­Y½’ ܾᡫ£Cº}ó:›yúäqËž=r3Sën"Ø1vìXZíééét±,_¾œ.&ßÎÎÎÃÃ#%%%--m×®]#FŒà/ÏåСCëÖ­Sî JÖ¸8qbøðá1ߡĩS§¤'ì içH\ùæ`Gìß¿_LD(‰Ç(`fjróúÕëW/Q‚ɉü¬£­í÷öU½<(„ÐÊéÚµ«ššÚÀß½{§Ö™™I·@ÂùYYY"óE–ÏÉÉéÖ­[=ÞAÉÿ%MÜhùûï¿™4%¬¬¬¤ov ?s$îZPV;0 ÿƒ»·˜4%  P@EE%'#5;#EUU•yš°¶éºmk}½Y¤vÀ<3fddìØ±cèСÊažžž¶¶¶™4Æ={öLš4IÊòtOµpáÂfµAI7==½ÔÔT&M÷™úúúR¶;Ÿ9â¹”ÕÚ·oŸ–ǤScÕÔ:016¾}ÃÄ<>ð9H~vz³²ƒ¤¤$ö®ƒž”À è‡îꃃƒFJtîÜ9$$Dšòùùù={ö h>””q£ËŠ‚ÃF©C‡Ò´;Ÿ9â¹”Ø~ýõׂœ &M z(póúUmm9Bp€¯–¦f¿Ï-Ïk”£«£s÷–gsûÝü*áÑ£Gæææ/_¾~‰î—\]]mll¤)ùòå)S¦4Ÿ Jú¸ñßyò´;“9w-4ó§Vdô\ppÿ^J›šÔüBdnf ;P,h766~õꕸï—ò”8p ——W3Ù dŠÏûÒÛ4ùáwâ~wÀÊu»ËÈÙ üBv (µB öS+<ñ„Èɉ+ßìàÈ¡äÌ'‹(!üÉ"F¾o_jij†‡Šü…ì@Qh+Dzz:å_½zµÿþjjj;wž?¾¸ï°å kkkOOÏf²AÉ·‚‚‚õë×ëgãÆìgÚyâ ;“9W¾9ØÝí¯^鬦ִVÔ÷H¹™©–={œ8ö§È_((½€&¤æ[Š•¾¥¸i¾'‹h#¼õ`rñ­äF ì@ypû:Í>Ïß0¡WÞñD m„W ì ÑB;4ðMa;€ÀO;ÀCƒþW2ì@½ÙÁ(/°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Ä `°€Àv;Øì`°€Àv;Øì`°€Àv;Øì`°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Ä `°€Àv;Øì`°€Àv;Øì`°€Àv;Øì`°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Ä `°€Àv;Øì`°€Àv;Øì`°€Àv;Øì`°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°ŠnAÒK¢|®®b!‚ åSzBì‚ ‚@AÒÛAQaÞu·S‡wm† ¨v›ÒP“HšÅùçîÍ´ÃÇ…Jcw<.ú¼xZVZüõë~QËß¾~… ˆ+º.Âß¿‚ Æ­=‰ûvqaÞ;ïÇ×Ýþ’ÆŽîu©ª¬øRýéó§*~ÕœúËg* A+º.¢C|!¨ñU³'þ,që®(ÿxdÏViì€ü\]ý©²B¢¨ä*ZUA+º.âÂü!¨ñ%Óî-¥Tªª,ÿÈUEYià›§© ÑÜÌšSªª*/ƒ ˆìjB;àîÞ7®{,\0¿üc‰À~ÎìÞÒÚAUeÅÇVå¥Å¯Ÿz?¼^YYÎÍ. 5¦Ö99ŠK@M(ØÔ”vÀÙ“3ÓRúôé=îܲ’"áU*¥»PuF‹ ý_?yzçreE9ù›OúY²jÑæ/.5¡`PÚw÷&¥§$™˜˜Ì›;§´¨@`÷–Ö*Ê>0Š ºséDxлòÒ"6“•¤Ìœ ¨ID›¿¸Ô„‚@MiœÝ›ÑªÎ-Z´8{æ”Àî-¥”‘‘ä¤3ÊÏN xûìÙÝ˹Yil&£š’%…ùYiP“ˆ6q ¨ ;€šÐ¸»7)!6¸KgGû¼¬TÝ[Z;¨ÙäSYåe¦#x?¼ž‘Äͧ’¥Eù¹ÉP“ˆ6q ¨ ;€šÒ8»w|tX/ËžŽ³gѲänÝÌî-¥oò9éIož¦%Å ,û’¼ìÔ‚XÁ &´îîí~þÌûì´D‘7-ÒÚAa^NZ¢° s3¹‡T²8?'39‚ V°¨)í@Ìî- )íàè^ZÒY)ñE åe§'FCÄ v5¡”äJܺi‡—æ[ÉžgÝp?óòÉýĈ̤X~}·ƒš¿ŒA+ØÔ„vPóŽ ï¾üâÑ]O÷Ó´ÛóÛ÷}·Ïî]=wìÏÝø»”„¿h )á_4½zþ„ïó‡Þ® ÛÁ§Êr63;5ÑëÎr ‚ H)E;¼×Ý+Yi‰vðŸÿügÈÀ¾\G€ ‚šâÃÈþóJ”—#&AÍM¹éI\; ¬†L ÏLŽEp ‚šÏs‰öÿÿürRàëÇ¡¾ÞÑÁ>Ar‹Ùöÿ#æ—ËAÒK`ÿÿÿ¦jË‘ endstream endobj 41 0 obj << /Type /XObject /Subtype /Image /Width 517 /Height 568 /BitsPerComponent 8 /ColorSpace /DeviceGray /Length 621 /Filter /FlateDecode >> stream xÚíÒ1 À°ú7 ?`V ½ÖXüªC Èà\`<À…$ð€ ÈÈÈ€'Ôí° endstream endobj 37 0 obj << /Type /XObject /Subtype /Image /Width 891 /Height 601 /BitsPerComponent 8 /ColorSpace /DeviceRGB /Length 43499 /Filter /FlateDecode /DecodeParms << /Colors 3 /Columns 891 /BitsPerComponent 8 /Predictor 10 >> >> stream xÚìy\ ÝÇÏÜ{ë¶—ö e/¤H";ÙwB$)K’”ˆ²d«d—%e-ËãùáA²”=$”Т}×r·™ßÃ}®»µh»·ïû5/f¾sæ{Îùžsf>Y.F€ƒ!@q 8'ŠBh@šÇYx·þÆ4:öúßT¡i0ø< ‰tëoÎÆBÆ„áü¿Ð¾•¿Œ2bëÍÿ1qÚ! œ[‚šÖ¡Zcm‰ ¬²ò”¯Cîâ¶&™€d+NqXûT‡…8"¯qB½¥Ü÷½ÌC•kå­ð £ð “ï@2 ucYucº(o!œ1*Ù 8É·lÄ;Á‰baXrjj¾!Ñ¥¨È°T#M¾`nÍ.+Ó¯’¤iqOþÕìŒUŒì¹ŒáÇÕï@©áéŽJËeò51ÖŠo7°Ö#ˆºå^g·5Ì$œƒÖÍ#,„ÿšGê`¡g'ò„ÛÛAK0±xoŸ˜¤·ÞZíª „R”r-ªºr¢¼!ÄÅ H¬âä Ÿžp¯|ʼn/ÌRä䆔™:•‹¥'dÑ*ó2B} Ôû aL”O dHkÕVQÿ+% bH é·0Ã!ÂãÌç͸– ð’Ê‚ç©wO< ¨dþ@™XͶYÙV³3†°¤ïϯ½:úú[,÷Øi“§/ss××iUüåÈý ‰ñ|Î/,K&Wȇ´¦ííHnŠÊŽdÊÄiK]ÝZë·-®È»öêè×'„T†Egá8Òì/-eý¢ò¼ÞDD¿8B ¢Ú2€ÀÁp&Æ©ø“;×âüzòR˜7œ‰‰9VHâšy{v"¯—½6BèEd^¼!þk4(N@‚'þûlýM×!„Êq&“U\lÃhÃ,,ä; Cˆ]\ì¨<2Fîí섞¹¶p£ U~¶¯íóëŸ'Ž›¸yGe.%ü©E[>r—º’ö²µNÿþï¾Y7óÅ‹]ïÇÜW1¤þœ éÕgú‚±–Ýûí 8âÔgË‚'C”ô¨¼ž§ììxiE2BÈØÄ€´X8+ $2;2í°‘Žî3¬ ^ŽÃ}‹Ó˜±¹‘|eoî4wÀª›.úø¬vœ¹Ø}ÉÊâtæÝÌãCâË på‡ùgwÕ™äk‘Þ8L !d>U‡ïÀ×s„&ï­µ…ªùT×sB/"s¹vó©:F}TÙ•"Ë&ꤊÄë+†³„Ú¯……jŽƒaÂ#+k`«Ž·”^B)€ïUÐ߆ ‹zx(ã-S¥ íAâ „vô·¶ÆŸÕn]^V‘Éd~ýø]YG&µèÇú•Ål™!?/»öm/aüHHˆj­ßæË-fÇq ²*ÂsÑ颀ú‹t­EfG¦Ü´)¯$_ÍHæpÔö‘ÃÇLèéqJßJ†×Û¨³Bþ;YƵǧݗ¬˜ØÎq×0þ2¢ÊLWƒ^HÌ\ÉŸßU'8ˆ¼ü"ÿ¶éõ߇6Ó^”FÁÄâ½!„Z›©ö˜ “p5‡ké1A§M/UN¥¸²‘—iPœ€4À©ÄX¥Âí…gæ)•”Z«¨P)‚ 8!D¡P0„p‚x’ššÙºŒ…cF@ àÎ2 ÐNê½l=ŒÝMäé ä`jj­Êó9ÅÉĩۻç÷¼zá&Žs’3’ŽÝØñøñ£òŒŸÏPfçdkvÇd8! ÃØL¢8…hÕAäÉj˜RBÔ-EeG&ûž•ÙÊH†FǪÔrBúEÉ,eß§†².Bèþÿq-ú†Å_تz2¢Ê ¿p HÌ•« cU`Œ¢º_}X§êçåO¨7VFþËkj¬‰7ÞÃy7E%ãzC¿f[AqÒð·"„¿aP¦\k‘Œew1 ¨!O+--®¬TPSë@§S)6Ž—ÊË¿ÓJR9Ë(Èê™»Õ•µ–x;þ{ûQ“^}Æ0Œà¬(úɉðúÊí¬{Û¬ò\³rfðÔWVŠÚÿÝ¡¦Ò0žûr8‰qýÜ%&;}=-_QÓÓÑCe~Ïd³‰Ê‚ßÜæ—dé´2ìÝß<¿€çí U¢Ë /‚°A”ñNÜ/ývSâ„ôƒõS$±Þ2Þ•¼¿“Íky'Ût¸®‚ñzá' Ö‚0±ó,…teÍÜ´´,yù×­“»ÈS³dK«ªØN[5µ8˜¤ ÍîB¦ÈÉ¿üï%Úm•]Vü'ÙÈ÷¯Ó­¿y–”˜&‹bTU¥Ç1: ÿM¹RéüƒŽ—òª2E9å6­Û2P¹KLv$k¼ýv[×Jâ4jBèØ©0 Ù¿¹Ž;á2zíj¯µÎm#0¼‡‰åÌñóÜ7:âL‘e–Q‚ö$åÒÅóïïNhrÓẂ‰ök0Šð&NÈÖÒ[ÆÛÿä¦ép]nQŠÎîª"½!„„]gAq9nÅ+ÎÑŒŽ·ež•¨TY·þ$OOCÙù,•„ÂBŠ¡ŒI9e!Í6¿ Q¤éo0Av\ôtè¿6òDT^Aιû‡ywÝzy~Þp/³e"Þ~z¹qÃFD ²tBŒO¾Í³1ûíú¹ÆÜzŒ¿¡“øìHîܽºí|kÃ6E?ò‚n>qTYG–"û[škñ'r?–O=矓ñ,ã}Ú‹s7”3Œɉ*³FWxBqŠý\øŒâÓ ñ@©Æ›P [go¡®¶º­ÍTÉ•ÄÛÙÕzuRÅ HäõU¼â,©ª¢©`ou²‡VuÔû¡×*µWê(+{Z/ÆèGßÎM Þp$œ þÞF–óÜy _Ϻ0ª(ÉaàTy,âô©üO r׋Ï1_¾[’ÆdVàB49ŠªQø} Í‚$:þؾàÐÒïLG¡îöŠb²ãú¹µ¼˜Å®Â©2˜²Ž¬B+š‚6.1_/\XY^Àb3 “oEUP£•¤/(ÂËŒÁ- @r'9cÂGW[]1Ó+B„#¥‘¼©èÐIo†f?§3 ÍTI‹Š]Œ7Pœ€4 \á3ö\TåäÈ4YJ?:s4â(é_P®‘¼¢ <…RÓÊ*¤ A$ýŠÐoÃרnJ¥+˳* D Œ†ôº)âì_»ÚSeäØåˆ”ŒT¤ÜC~ŸB³ ÑîJSlEÃYˆ@(÷¡Ý “×¢.¯B(4¤¨‹äu0¾\ä5‘¶¹LEÃ@ކd0]qeI¹r N ¶î¡Z;Íʽü5¼7U]9¾Ï¼‹Éâ7oîªRô—¢ø‰Ô<ùBL =UýbWÒ׆Í$0v;55Œ‚îÊ&(1‚y@ Ð42kÁk¤« zW¾4?×eU‘º*V­O¡YÈkcòÚ¿YÄd'Æà^y $¯!$±¨2€d@A3j:ÛòóúÕœ½Á' MãV¼dü¦P2ˆi¬’)Õúݧ 3åìÒÒÔ¢"Ì:wâ€FÃPzjÖëuöžšÅ{¼ÙzÅ HÕ¸/ó?—Ç”}Å;«0[)É=Î{ÊfjhÐhXk„W2îɽÅ 4&¶º~3útÕªù{¥81‚€™’„¾‘Îø]¹Ÿ@( Âfà/Ž”}ÿšÃk„9N@»òŒYs@óDÈa@q’Gâ¥RH 8 £ƒA»—ŸçÿüÂííè³hrl'Î$Wr2¾:»z€â¤ ;§åhB¢Âw‹OŠ*”@ ÙŠàƒ ŠZr‚æPœÐ°‚Sâç»çÍûe³˜Ðš7h#ˆ ñ‘¾øƒâ¤Bqþº¯žô5þCÚ3oî”B¡ticibÔGTE€ºuÚ"ñšgüAqR2&H>¤=·µžN£Ê4óò²9¬ÛqQ&mûˆªP·@Ad >@óŒ?(N@*Fį»ê8ŽS(4œhþsœ4Ç€_ýÃ@Ad >@óŒ?í;ãÞb HÑ_a„d»a ߯¸cÚ—dø3¼…Ð,›Ú¨~"Ãm\iÔÐsšÉp®?Å©Î1†‡$iú#ŒÀ I,vMþšŒ8ùüÅ‹Ý;ƒ÷î )+û±vÍ*˜*h„¸ÁÌ„T–G¶í:}KýÔl#Ã[<î!äJS•zNKB}ÎqB[Òö70A „ºt²0À:4l†aÜ=]:Yø׬ÿt;_½zmÙ³"Ћ—¯fØMš¸mûN|–oŸ?5áLAÛöþ+@ýþ§qkÄêóCEE¥o+¿µkZ·6lЉ‰&o£C¡aAÁ;¼½<¹,hèR”••íܽ÷Ö;ÙÙ9ŠŠŠ}z[Îs˜kÓ¯ïÏ'šÇy@ C~ûüé·âý¾R/%çæ¨  `aÞcãz¿Ž:4}·ŸFÊý†” gñïØ¡Ãínp¯°5“ÿ)ΪŒÌ‚[wT-{*™uHšàü¯¯ã'W”U•OŸŽš5{oJîÞæVlQ–ß”Óë„ùŽ8¿z°u“¨Ä_?곩îf4B¾ ·F®>Y ‚ ;±ÈÕíúÕK o¶ŽãgÎøùú=vÂy#…BiÐb¸.[Þ¦MëȈ“úúzÅÅ%Oââöìé×ϺY;$_šÔdŽeeeÇOF,óðüûÚ•&ï6bri>·gÅ”D †³(oòòòÿÞ½7lØróÖ;Õº¢ADUzFö¹(fAÁ£¨‹4cDŒ âçÂ]Ghýz¯ÓSS¾ îMOË\²p¥¥ù0ónƒ]œ< ò I»i§~gÏ\1tZ®ƒ&Œùëåó„ËoŒ1£G×S&:|ú˜B&ã°Ù;ƒô·kÑ}ˆçòuå?ÊÿË¢æ o±¹õ–òáÃGFí;µïü95uÌøIƺ”””XÛ 2jß¹z·v›Ü«wßΦfnîå?~v£ö#NŸ0xX'“n¶£Æ>öüÂ…KC†ìØ¥Û˜q“>~øX“Ãm!Ó¿ÿž4"„È“Éîß`;jlÇ.Ýl9{ö|]â&X¯†Œ[ ÃbÔ¾ó¡ÃG,­úuéÚcå*ƒ!X}»³®^»Îõü=ó»•uÿ²ÒR¡ÅÀÒTWw[º$99™›_ÁÈ“¹i˶ž½­Í,z çóóöí»>ý;vBTÛ5m!‚¸ó@UEeޜ٭ÔÔbÄòV0<ü˜µÍ@ã]7ÓÒÒœœ™v·èlÒÝÁqA~~~ #ü$.ÎÇÛ«µ¡•BÑPo5nÌès§Oò…”Œwßó*2öÿ:ÏYN°ä‚ãªj…ת.]{ôîcsèðñC@YIÉeÁü””Ÿ§;¡¡ì6MDUUU«×øvëÑ«[^>küªªªêQu‚qhnùáâ¿ÐÙéàáP®åà¡Ðê'™4ûü…ŠòòŒÔÔ*YYÒÂÌÎÉ ;–w㟟 “ù=ãpX=Té]rsswìÜ=köœq&ý5góòòê?#á‚ó?=J8Aà!%e…õºjlÜ&pÛn‚'ŸˆØ÷ìæØñ¶ =Ä<>z|wܳF޲Î7€LzèäûÄ.‡Ç>¾J§Ëo!íµZx‹ÍûT– 6ýú~INÚ·gçàA¿$'mX·Önê”/ÉI_’“„*rQJ\ 9xø]âûëÑ—^Ä?¢ËÒ·nç&xøèñ¹Ó§^<4aœƒ“˽û1§O{óòéØ1#W­õ«öðøøgÏE&¼ˆ9b¸ÏÚuA|INBñu…—·‡»ÛÛ×ÏÏŸ‰xõ:¡¾þiиÕ$,¡ø§ÏnÞˆŽ½'//×Õw]²hϾ‡C²g_È<‡9JJJ¢Š‘_Prà¹y¡%änîÚ³?99ùFôåØ{w²²²y÷þ{÷Þ¼ùΛ6øÍs˜#ªíš¶‚8yêôÜ91û/û'#xzðæzô¥ÔOï7ç;/š?oî˧ŸÅ=lgl¼i˶F¸WÏž«Öø½|ùªªªJT £ñ%9iëfÿ¡C‹ïù A;×"~Ep¼swYYÙØoÞˆ~öü…ÐL¹ÆÒÒÒáa¦&&ä¦ÐP v›&A;vîÎÎιw矻·o~ÿþ}ç®=u ‹¨º Á84·áÜpñ5Ò¶  ðÅË—A<‰‹/..©É'N8 Ã’SS)&]4‹Š*¾~%¼ôu»¬¬ìÍ›’ø§gž:]•}.ªWVXZÂ’“½l¹ÇóÏ}V­¼unµ·×óÏ—-÷ÈÍ˭ߌjòÌ ñkÅÒʪOÏ}ûÂyBÑ7NYY÷’¥Ë**+º¯XøøÑ3n‚õþ+utµérô9ÓËË+ü6xr7ß'~$“]¼pÝÇw¹¶Ž–‚¢ÂrÏEÿÞ~@üò\ó¥¶<~üdà„Ðã'qýmúŠIiÜÑ„wáÛ{.êÂz¿µºº:ŠŠŠÞ+Wܺõß­­›üõôtåääæÏs(//ß´q=wóÝ»Äj÷ß°NGG[^^ÞeÁüÄ÷IBËF—£çåæéëëlÝÔ7¼þ\û©ˆ3>¾ëò>¬Ú¶kª6JKOûöÝ„qcBãÇŽyûö]zFw¯ïšUêêB7oß¼Þ¯¯5NWVVööòxøðq #|(dŸþªµ~f=­l õß¼­¤¤ThÙ>z|úLäÞ]ÁµŠ^="f‹Aè0¼zý= uu_ÑoΑy™õ´:u:rßžbB-HãÇGèk7Èa¨¥©¹Îomôµëu ‹¨ºÔah4ùpn8(Ê'ǃ‡ÃB‡q^0¿¦Ïq–ÊÑû®\¡ '—{ár^ôuõ!ƒÊÞ0òòBY.e]¸D^ª|NUýžE×Ó…>"NG—x­pïjjŠêjj:žÃŽ]{Nž:½bù²ŸÏyÜþ÷Úõëiééª*ª³ìgŒ9‚´_‰¾N¡PTUTúô±Z0ž‚‚BhÌøI¡eK—œ‹ºPXXd ¯ï8oŽÐÜy†‹Íbð®,vã0Ûݦ¿¥…E7®1áõûÝ;C?|H©¬¬BaÆ=JIQŽ\§Qù7Ùl¹ž››7~ô_Üy¯‚¿&ô÷Ä:šöøï¼¹yI÷+‡¶é+äù³ä÷ B}’+99¹ÃGŽù½ð?(+)ë4*…o“ÍfW{¸’¢¼`z¾Jíß½#ä`èî½û•”•|}¼‡T/ݯAãV“° „ôt´Éu=íüü¡Õ_äâ´}Çî‘¶ÃvîÚëâäH£RKÎ-FIi驈Èõþ›N="´šäf^^¾¾®¶ Ÿ#GM™8¾«Igî.1m×Tmt*âtAaa—næ¼oOr]½•ïQ¼›¯^'ïzŸô¡²²’·.ÕFXAžîé¾ÔÓ})A©_¾=~ÒÕÍýxøa¾B¦|Nõ[ï<ü0]V¦Úžß‘áëdÁö\: óó t´4Éu]m-Q™&¿O "==ÃÇoÛ7oÉ”¢BÍç¤ñã#h/((Ð×Õ!íúºÚ…u ‹¨ºˆbjÚäùAã?iü˜Ý{÷]‰Ž~ÿáÃ}»ݹ^#ÅÙÃù§8Å™LVqqþ?·˜……|I1„ØÅÅ9—¢[Y[)õ4ðòâÅK„PO‹žÜ©øž¡W¯^“–k×o ³êm¹qÃ:*…zæì9nJ£ê`È^]]Ýû1öìÝÏf³=ÜÝþ±)ŸìÛ“ðæ­ÿæ­ë7nÆDÜUç}¤“w…F“Ù´u•—ÇÆˆ3!\ãJOÿ^ mú[)**TTTöï;ï(Ao¼›šê'#öikkŠJVÓ'²köu¤O‰¯ ‹FŽøôqLrJŠë2ÏÛ7¯ŠIOˆ~ö!¤¥©q>ò”޶¶`z¾…nÖáp^{÷n]…ì!âÁÃG>¾ëÇü[?϶7|ܪÝLÏÈhÛ¦ B(#3SC]]hõ‡´kOH𮽯¶ú‹/†Š²²³Ó¼ƒ¡a¤…F£UVVÊÉÉ!„Š‹‹yZD3-=ÃØ¨-ŸŸÓ'ÂçÌsVQQ^0i©aÛ5Z1ŒKW®Þ»õ·>iÉÈÈœf?{™ëb:.>òn˽V{{`£¤¨X^^ѳ ¹·&æÒÎØÈ×ÇÛÒz_ ]—ylÙ¨¯§ËÝ%&z Ñ{ÅŸj²Â»©¡®ž™ù|K:#3SühÝÚ08pË”é³úY÷QTTj>'Í!>êêÜa˜–ž¡ÞªUÝÂ"ª.¢††˜š6ùpnÐøËÈÈÌýkÖÊÕ¾ËÝ–ÈÈTÿS¾{ó_ ËÊË«rs GhŒ¬¬Âûàý€Ò²2„’’"×¢¤¤HþaGn^޾Šrvš¯¦ªª¬¬´ÐÙ‰›ÒnÚÔÖ††24Ú°!ƒBOŸ=ã}ˆdö,{:ÞÓÂ\ü˜à>åIà8ãÜÇZO³°u/×È`0deedhÔŒôï›6ìz”˜M;»qþv¦Ë`3YÉ?¯^¹™7Y —ߊ]ÝÛ¯^'˜uï†!ôòU‚…¹Y-^H°Ûϰó]矖–Æf±?}JöðZ%òM¦ú8\EY95õ ×îáµ*%å3‹Å"pœÃá4ô[)õ·j6Ú\XPXXP¸5`ûøq£…VCh±‹SØÑãK\ÈÒhâ³+++ ?v¢±¹Ù¥s§°£'ª*+srrÖmÜÌM9yâøM[²³sJKK·lçúÑÕÖ>}"ìÂ¥+‡„‹o»¦j£ÿÓ£{7}=®ÅÐ@¿›©éß7ÿWmä †œ¬,]F&##Ãoƒ?woµžíàô÷ÍÿåçåsØì¬¬ìí;v÷0ëΗŢ¥î ÌïiÞƒ÷@‘=¿ÑÞŒA¨+¿oŽ3jÛöE…EE…EÛƒ…gÊcÔÕÖ¶ìiqõú 1¡æë6M‚;zä–mÛ ò ò 6o 7fTÝÂ"ª.B‡_šÛpnèø/\àøþõ3'ǚ̻Ðp6û·gæÌºÜQI©µŠ •B!‚CB C'ˆ'©©}ì¦òÊÊÊÅÅÅ%ÅŪ**?o"”” „”••ÈÞ’Ÿ_€ÒÒPçë<‰ï“""Ϧ~ùJ>È*+ûÁ›FYQg³Å1…÷ó B¿2Ã~Â2W_®q݆;‚¯Ìò×ÒÒœë0íÿ»/êk#B7§#,j¡‹w^^a[#ÃÎöuûEÍ¿Žôêõë=ºˆxðƼGwñÙuêfÁ»ùñÝK^çÎNóvb®Ó¼Ü<#£¶K.¨UÝk{¸“ãÜ)3fUTT’Å6dÐÒåžiééFmÛnØÜÐ_ ªÇ¸‰ B¨§…ùØÉÓÊË+F´]æºHhõB*Ũm›IÇ‹* ·òòò–=-v)7mð]»ÎÿÀáPmmm'ÇnÝ!í®K\‚‚wŸ2Ä’Eμ͡¥¥yòXèÜù Ùlö’E΢ڮ©Úètä¹en‹ùì³fÚ…:2iâ8ñ‘ßâ¿nkÐŽï^ÚÚZNŽsoÜüw¯ø».v‰8sn½ÿ–ååZšýmúîÞÈׇÞ¼MxóvÕÚu¼=ALÏo Þ+æüP“ÞMw·Å~6>JIIÑaö¬Ø‡…fÊk´›:yçžý3§Oj¾nÓøñ°î®þ[†=Òvù²%u ‹¨º‚c¼Y çÆìŸÕ‚æd ZcCigçPp<­´´¸²RAM­N¥P˜οEE®÷ÀøØ½oÿÝûV¸/

z""ñ}‹ÍN|ÿþØÉÓjªª³fN'L?!vôXqqqÙáÇOþü; 'B òò,óÔéÈ:þÆ3Óã’± ZÜT‡¥n7ÕµÕ¦ápðsQ—¾¥¥a mÔ‹ÄE¸1{ïÖÀ%%¥¹yùÁ»† ñ‘ܰ4ÛøW M¨µ*ö‘ÊAœŽí oÿ+O§#=Ý$+¡°°«Uo¥ä”‚«74&Œ𢣭½#h[ä¹ó;v•••)++÷²èa?cº–æÏ×kÆM§Ó¯ÿ}ÓiáUûév¤Ýsù²ÃaG׮ߨ¡®>mʤº*NÞ7‡pI ZmW¨y$›aLÍ{èëï ÚŠaX lèF¨²„F¸qŠª¯¯7rüdƒ1tÐ ·%‹ >’IŒ¿pÅYRUÕ ÃÚUû¨èã'=Ûa&úWÄ?¼pÁ×3çJÒ34 a¢s¹ÛR1 l‡ µ6”ÏØÃ¬û½»¸›£}2 ñÜOçÝœ8yªÐAAþ‡a6‡E¥Ðšy¬88›‚QjýÃê€è³bÓfŸ”ð¬Ú2$%$°hÑ"KKË—/_¾|ùÒÂÂbñâÅâí$ÁÁÁsçÎê_h.’KDDD\\Üýû÷ïÝ»÷øñãÈÈH˜8‘ô¾-ª%%ÅÍÍMEEEEEÅÝÝ=%%E¼!”œœ|ÿþ}Þë±µzõjÕ«WŸ?.’Þ·Eõᨨ¨Ñ£G«¨¨())¹¸¸¼{÷NB+.f‚“» „Ø•wÓÚpü•÷û‹+òŠ+ò®¼ßß×p¼x;E† È`Ž4å['Ä%å?Ñ”7$p„plVç ÷ÓO/K“;‡Aàl¬É%Mgò–¥ÚË»¼¼ü½û1\Ë»wªÿ‹¬!—Þ½z^¼|…Ïx&òœy3Uå8ÍW|¥$½IIzsçæußõþµ:œÉdÊÈP‘4JÎÇGGG'%%=ÚÛÛ[0Áƒzõê%¹ãvøðá!!!¥¥¥¥¥¥û÷ï6l˜x;BÈßßåÊ•t:ÿ‡ž»víÚ¶mÛìÛ·ÃáHÇyíÓ§Offfäz÷îÝ?~üçzIïÛbú0IEEEXXXÿþý%µæÕù8U_2}•öß ß“ëiEIz*íÅØ©²U#U™Õ¬:©õίÌ@êo`'K•ÿ÷Û ñ¹sXs‹™¤ŸÉ[ â¬g'ÇÃG¹›‡uY0Ÿ»Éáp¶ïÜme3¸«yïåžÞåå夽ƒ‰Ù™³ç ibÖsüäéI>pí¼Îù6kÈ"—áÇOâøoÙ1Y¬ˆ3gÌwàõûpôøÉ&f= y.ê¢ø¤§g¸,q3ëemÚÃr¾óâ‚‚B¾L¹);˜˜ñ.âã ʃÐàÔ u¿µ«b=æú?zâTÿÁ¶M{ˆ*YnÄ´cµ®Èd‘ç¢kÄb±·l·ê7¨§•Mø±âc%´½êƶmÛtuu-Z$8瑘˜¸aÆ   É·þþþgÏž5111119þü¦M›ÄÛÿeºñ/Ó?n×’o=¦Ý¢ˆÄu]ÔûmpgË€Û]ZY Ïh^oKÁ™¼Å)NB,¡‘¶Ã ‹^¾zMD\ü³ââ’Ç"òkµqðpXbbRôųñïËÒéÁ»¸Æ?}~îÌÉqG ºv?×Î矨=¦&]Úþó¿Û\˵ë÷0ëfÔ¶-¯O¯UkÝ—.yýìÉ™SÇ_'¼_çÅKçÍ™ýôÑý¸Ø{ÆÆF[‚øpW’ß'Ëæë† (>BóœÚÂ[—Ÿç«_ë o£/žý”øZTÙ’ß' „ÈŠˆoÇj]‘Éâ⟠ÖhÏþÉ)Ÿ£/»wçfVvŽøX m/¡µ®555rE^^žÍfóM:::8p ]»v’;n—/_>mÚ´¤¤¤¤¤¤©S§º»»‹·oܸqýúõ&|Š‚J¥š˜˜„„„œ;wN:ÎkŠŠŠ\•ùãÇ®ú$·o‹ïÙ™™>|ptt\±b…„Vgb†ð…Y†˜eCq˜w©bWÊà äº ®XÅ*ng—#Dáuø&óáêÛ¶«oÛ&fÅÏ6Ùô÷§#ÙEéS:zE$lŒHðŸÚy•ÐÜqví¾¦Ô HÇ™æ8RP(NŽs9Š:vtÁ| å¿£¢.^ò[»ZWGGQQa¥‡û­;ÿrwmX·FG[[^^~Á|‡÷Iê·Ü Â~Í™!„ŸtvräK#G§çæçéëénÝ´A¼Ã›×.÷µ¶¢ÓéÊÊJ^Ë>ŽŸþÑ“¸3gÏïÚXm„R¿Á),,ܰݦ¯5ײfµ—ººzÍË&&M ] ­Ñ•èk~kWéêè¨(+¯]½R¼“ZµWݸzõêÒ¥K9baa!Ñã6>>ÞÝÝû¬[||¼xû‡&OžÌ}»Pè;† EjÞéîÔ©Ó›7oÈõ·oßvîÜÎõ’Þ·«íÃÊÊÊ‹-zõꕤÎoŠxY’Í ØU¹Î—ì{Éç6­LÉõ6­L¾—¤ Úµ»d•¥Šr>Üx.“øÿåA Mä¼ø¤¼§Z †Bs'šÍ§ÔœÉ[5ú]õ)“&ì 9xýï›>~<´7ﮜܼ‘c'r7yÿUSUý©$ääøæ™þœ>V– ÿ̺OïØ‡Z©©ö0ëΗfÿž!C÷í?¨¤¬äëã=tð 1_½N Þõ>éCee%_EIùœºÁëñðÃŠŠ ÕÆAø$\=‡¼Ù­¤¤hÓ¯ï¦ ~\»¶–VMÚ¨&ijèJhòòó[Ö0¯ZµW ;wî\ÇŽ¥@QíÛ·ÏÙÙ!tøðá.]ºˆ·ó¾WÈû…ü%K–,[¶¬C‡™™™¾¾¾cÇŽ•Žóš]``à‘#GB3g΄s½¤÷mQ}xÙ²ennnÆÆÆ………”à§ú„f9L‚œÚü-Ù/ž|¹1ÙlÉÁXo„Ðd³%?G“{¹vª,1±›ë“´h$lnR_¥Ãðösbf8*¨Èì¬n…Ê/Ï ÓóçÞ<ä¦4É[œâ¬vVƒ ™¹ÍZ¹Úw¹Ûîý\„–¦ÆùÈS:ÚÚ¼éùVx7i4Zee¥œœB¨¸¸X0YÍYèì~´•eر“ÎóyýëÝ»u=²‡ ˆùø®ó¯˜¸-÷Zíí9p€’¢byyEÏ>6‚!W ]—ylÙ¨¯§ËÝ%&‚Aœ:ð)ñuµþkÒF5lÇÚ6·–¦fZz†±Q[Þ]¢œm¯zdãÆ¡Áƒÿ½OŸšÿýVî\¹B^h÷ïß¿fÍš „zõêµÿþŸª]„]cÆŒYºtirr²¦¦æøñãW¯^-çµÙ³gûölë9sæØÛÛù^Òû¶(FŒ±xñâääd55µ!C†:tH¼ÿf>ÇÉ'7ñ_‚/ì¯?Wf½@-8Ý !ó颦¢ÿØ(„PLÊŇ)ÑdšŸöqQB±_/>ú-x¡Rhó,ü¯¼ßWP‘EZο žk±!tâåz‚ø-÷f¥8%ôL.õ#·FгÆònþBçù‚vûÓ}×ùû­]¥¯§—úåËÁÃa»‚ÅøéÒ¹Sر JJK·lÛþ'u:xÐÎ=û£¯^/,,8ÀF0‡×*×Å Û´iM‡ƒ‹/ƒÁ£Óé²²™;÷ì“î zZ˜ÿI“š”­†å¯m5'O¿ikÀÖMö8´fÕJ1N„¶WàëýÜM ýÞ¤ÐbwìØ1**ªævQÇ7n\Cýp•JcTUÑåÄýrFkˆ¬1 óõõõõõm9×€&Œvãôí:ôázò^ü·9N>Á·à”¹[^ì¹ðb ýÒÛÝÑ÷ˆÉƒ³·ÜÅky—õÐ;ËVhîÿ)N¢é{ÔÿˆqóËun‚šüÊ%!Æî²`Þ‘p4w¾K^nž‘qÛ% yÒ‚é7oô[ã·ñÀ¡Pmmí… ÿ¹u»Î7aZèä¸Úw]À¡y :x©ûŠ´ôt##£à€Íâ °uÓú­AÁß—géhk99:ܸù?a!B oÞ&¼y»j߯YÆWÕÅAh0‰šýIëÔ¤jØŽµm ƒ‚wM˜< ˆ%‹Å÷¡íH.ƒmÇlõ[!æ¡6Øv, ¢ áE¿Ïq |5†"KPd°:?•-*wÁYXèu0–k'Ûr3¾@ÄÔéö=)Îÿù[v·£ÏÚ9-‡° Ñ,ýÛ’]IԋܤÊÖýp1¹Ë(b9¯8{œ/¶1‚×Ã!D…ï¶øó¡ùœŒ¯Î®=ùM+0“M ù»>LgýÜ”!(´ºèšÜA, BM,8 Äfü±ÜüÛébsçpÂÂ0h, ®Šþj€&Eñ‡:›VH“©ãᘠA¥Qêœ;‡M`‰Îç Š,\EVYEE ¨£â„»êдl·¿A¤\q‚à$¢¢"4oÅ ’š”‘GètÙæ_ÎáS ±€:*Îô/ÉhB˜,Ö¸és›y!oGŸ…–ê®8¿g|ƒ(4&GL|p+âð÷iWœ¡QSæ@ ‡.RPR˜ÿ Á!Ç! yŠ!Tñ£bÑÈ@̈nݺ½{÷âÐävìØ#GŽp8ÒŸ——7xð`KKË+V”–JùÛluˆIeeå©S§¬­­ÉÍÏŸ?wíÚ•\755MIIA×ÜÚ¨%œœbÖýçÍîݺ& ôÃÖ††OâââââÛ´6DEœŽ,¯¨pqv‚žgņˆµiàÍ!@ ñóóSUUE9::>|Xú*èãã3{ö섾¾þéÓ§Iû“'OŠŠŠÆŒמ¼Âáp>þPTTäíí*..ÎÈÈˆŽŽFùûûKqǨmÜHÈÇ•444N:EZ***ÈuEEÅŠŠ tÍ­Z|ý°¼œ¿®óõñòöAmûúíÛî½û/œ?ûðÑÊUk0 Û±=`@8+¶ð³b=ÆÿÍÛâÓÀ' …r!$''Çf³¥¯‚kÖ¬™0a“'OžÐ|Ú¨%À×ùûáÁƒžÅ=|÷p@›+W/s[bldä¿y[PÀ–Àm›7þz¸Ί-ù¬Xñ¯6 (N<^¾|éââÂ}b‰ûl{rròܹs¹o }KÃ0î;­:uâÛq7%%%GGÇ·oß’›íÛ·OLL$×߿ߡCè“Í­Z;vxóöç oß%vÝ ——“›;û/„PZzºM¿~ýúõý––=ΊõPœ …´oß>,,Œ|b)44´cÇŸïð½zÉ}påÊ•ÉÉÉl6;==Ý×××ÖÖ–´Ož«¢.^ºvã&)}ª-9o9yo"ã8~84ìôÙs99¹ÚÚZÙÏXäâL¡üü¼Tø±ÇNœÌÍÍkÛ¶Íbçzo§Ú¶Bèü…‹'NF|þœªÖJÍÝm©ý ;ñµ¬~ë%v„ÐÑã'7mÙF¡PÔÕÕm‡ Y³Ú[II‰›ïöÀ­‚-+´‚0h>dednGŸ…8-Zq’~„‚‚<×v4 (xê”I›7®?¼“F£9;9òJL¾ ÂOÉÉwþ¹Aþ8‡˜Ã—yxåææ†Ü?p@ÿ„7o…†ñ*ÎgÏ^\¾ø öÑâ¥ËV¯ñ»ÿïÿj[a1Y –“—C¡G¶ïؽÐÙÉÃÝ-xçîí;vc[¼È!tüä©Í[F´Ý²i#BhﺆhªZµÂ‰Sü· 2øøÑ#T*uï¾ÕÖB°úõ[¯ªªÊÛ7¯·nm}íú*_‹½=p«ø–ZA´Hcí!@KWœL&ëø‰S¡±cFs§#BK—,’““›?ÏaϾSgxu› +<ܹ2NÌáåååtYY]]]„aV½-­z[þædù2…aC#„ÒÒ«ÿ½„¢¢â€ `„Ðø±£kXrÞròr:òBÈÉÑN§;;9†=~úì9R«;~ !´fµ·z«VäÊÿnÝ©ßvªm+„=Zç룥©‰Ú°nmµµ¬~ë%v„Ð’E É•©“'­òñ½{ï~µ-+´‚j*J|ÙµjÕ F2H°âäÞ"740X»Ú›kÏÎÉA >ŠkÉüþ]¼+uY æpOeÛwN˜éCEEÙpEÅż mY¡TSéã¤Jq~IN*.. Þy.êÊÕëä³€!=]ÝôŒŒ§ObÉ)´Ú"æpG‡¹³fÎHúðñI\|PðNOïº}«VÔK?u.¹¦¦FvvNAA––Vaa!W$‘R,-=ý{VVkCC®P«GêР䮌Ì̶mÚÔ°‚Ô¡^¢ÂîºÌ#///<ôà€þ68Žwéf.þ1œ0q2Œ[,ªÿ]u55Õõ~k554‚‚wäåçÿÔ…óæ „·ï(--+//yë0¿¯tˆ9|‘«[Ò‡¦&&}­û „déõüm:—|ʤI¡ðc' Æ‘ðc!ûÓÉ]sg#„¶o Ü^ïíTÛVpšï€òß¼-/?¿¸¸d˶Àjk!H=Ö‹Àq„²²2“É ÞÙÐ@³¢FïaÐéôùóæíص~æû÷ „æÒér§"Îôîk#+KïÕÓÂÉѱ²Oôá3§ÛnßñòÕk ÃzZX¬õYYÏŠ³®%_¾Ì• ðKW¢ÃŽ×ÖÖZ±|Ùâ…ο|Îa³ÙÇOžêc3°MkÃÅ ]þùßízoªZµ‚ÜÙrrr'Nžî?hh«V­–/[Zm-„ŪÞêµkGІM[ìg;èèh/Yèò'Åû»ÉHXôéC£¦Ì©øQ ±hÜŠ5eÎ?—NAÌëÌ„‰“kç´ÂMHTønÛ‰3ÉõœŒ¯Î®=áM@ (N'Š@q 8PœŠÅ €âPœ(NÅ 444î‡Íb2ªp§¥…Ã…B•¡ËQi2Ð!Jqr8삼Ü{woe¦§q¤HtêêêW›†J¥hiëõ:\INžÃfCŸhÅÉdT=ˆ¹kܾó¸)ö&=·Ú/ž>ºÔ{½ø4,&ãÅ“ñŒždWù£ú@ƒ(N‚ÃNûš:j¢Ak#i«"A..4ZOëþáûƒ©Txª á'8“BÉE¼6›M£Ñ~‹U†ÃÁ CÔ;-`V”œ¿–„„×}ml^óÅO‚J(…EEý1îh"t¯qGÞE”½»Eoæ/05ëÙÇfÐù aðŠó—àD—„„7Ó¦OÿòåË´éÓÞsÆôSÇq7¥©Qc>*..?n¬˜4_’“^=‹Kzû*dßîØG·ñîÅqüHØÑ…ÎN\KaQQZZÆ­¿¯=‰½/'/ç·~£ Oº=/7¯¨°H__/`ë&Òx.êÂz¿µºº:ŠŠŠÞ+Wܺu‡«h×ûùêêꨨ(û­õ¡-Tqffffffò#""âââîß¿ïÞ½ÇGFFŠ·7 ÑIAP©Tâwx-ÒÔ¨[¶­õY…aÕ¿zO¥R»tî¼gçö —.óÚoÜüÇØØ¸}ûv\‹¼¼¼Ïª•jjªjjª¾>«ÿ½w_ÐÛÁý{<|4f¤ACGü{÷iÌÉÉ>r ù’Ußù¤=//¿MkCÐÒ§P¢¢¢V¯^­£££££³zõêóçÏ‹·7¹‰×du8)•"ÏE bÛ¹«Ù¨±ïÝ Ú±«Í N¦fc'L~õê5™2þé³Év3Mº[téfî0ALìæªòÇOŸìfþÅ} ]Ôëê\0 ÿýR‡Y¼Ð™×Ò¥s§ß&g{˜u;|àEüãë}W¯]Gµ´4ãÆpßFJýôžkOKÏ€ 8…ðéÓ'333r½{÷î?~oozʼnQÄ;ILLüçFô}{>~ú4ßyQIqñ½Û7îßó>郧÷Ï;ÂË<¼^¿NØ»+8áE¼ëâE'NF4U•ù^Bç}«>Ý–{~ú”Ìf³¿¥¥­\µf̨‘Ü4÷cÈÉÉ÷êiÁëÓnÚ”­A%%¥%%¥›· 2X0_·åž))ŸY,6Aø¯CgÏš¹z­ß·´46›ýñÓ§eË=IûÔÉ“6nÚœSZZ¶iË6Š ÅÐj{@yy¹¢¢"¹®¤¤Ä}õX”½HNâï¨Ⓦž6W|åËèOn.wwSPP2xBèë·oÜÐeeuuu†Yõ¶´êmÙœ~ÔH[÷+S>ÖÐP7fôJO‡¹8ñ¥Ÿ>mjfæ÷¡¶£**+‡´u³¿ ÏÇ.ruû––nll´sÇÏC¹8c(ì¯¹Ž¹¹yÆÆFK—,"íîn®ÛƒGŸH„›ëŠŠó?ËËË•••B?~üàªLQö&‡Ãf>O|Fe…øêê!rSKS!D¡PBÜùQOeÛwN˜»ŒŒÌ:_Ÿu¾ðÎH?µ¾«Þ©S§7o~~øæíÛ·;woorUU”‹_êåÍ!G‡¹ /â/_8çéáþæí;Ooè^uQœvvv999999Ó§Oooš“üBÎæ{[ˆ×òçÙ,ruKúðÑÔĤ¯u„,]ºWû%Nr…üRÒìÙ³¿}û6xð`„М9sìíþŽ¢({sЛäæû7ÏuôÛjhþü¤ynVFA~®iËúúçÌévÛw¼|õðžk}VB÷¨Fq ~Œ!„a˜¯¯¯¯¯o íÍBqâBȸ}×Ä„xœÍi¥¡™›‘™öÅzð„sØ8GÌᢞƒÜOøËE:j$­5­sù÷=ã$Lqæf›õ¶©(+‘š*é´þðú©4ÕHZkÚrZ ZºâÄ Ã0‚žŸÇ0 'piª‘´Ö´å´´tʼn’ÊK~ËÑ1’^SPœÐ"'’ÊK~ËÑ1’^SPœÐ'ÌqBM¡ü4°âDÒ¨8Q‹Qœ^Ó–ÓRТ'ÜU‡šBùhXÅ wÕ¡¦P~@q‚ŽÅ €$+Îf{[“À9ˆÍÀdê&d$IuIxM[NKPGÅÙl_Ý(»ÌÊHPw:]S×J™˜Y&½yÞj å g³œdbç&W<:гÙUïÑ; ®µŽùƒJ5r@š°¦P~IqòÞÖ,ûñcÿÁл÷brrs-{Z̶Ÿnݧ7BÈÔÜêýë§Õz¬a²jTÎ.8bO°Ù¡¢Î:kža ªµ2¡ÃFßþû NçÝSVV6g¾ËÉðÃ***bŽmꫦ¦æV‚{þ¼!¤¾ü4’âädòô^chhp4ô€ž®NIiéÓg/††÷±²ü¥ j$ÅêaÖ £jû<ýŸdúž=.G_Ÿa7…wWäù‹fݺ)++‹òÙ¨³nõTÓÄWñäfW‹>Üõƨˆ¤—€FRœ<ÒÅ?{±3x›‚¼«¾qÍÊÝû,\ºâctŒ“£Ã׼ǎòlÿ=øT ç_'Ë_XXXLòӵ緊©»ñùIIÉ©iB7×ò‹ÌQwžT’.  ËÉ’wH$/|ÍSìÍ—/V’ð.óʦr=ç[5ýá3GÎþ{#?ß!ëÙÚ¥SGù¯û^²`Ã0…Y¥µ•ÿúÇ_nÙPÞÅ…ˆ&ÛoÐÐùs¦ëC¤J-ê<{þÒ¯»·9ØÛÑŒ©ÿ¹qKÞ®oëOD3¦Lt°·Wv0¼ŒS’Ÿ§øÝÊÒbü¿ñcü†‰üuàȉ©³ænZ÷o¶Q ç³¯6n ËÎÉ!"‡£˜Z°ÛÚ•KwîÙ¿mGP¹råfLß®M+ÖõÈy}A–“¥˜W"‘Tß"ü–#‘È'qÊ9Qæù5æ_~§90Å:|Õ°>‡8Áwï5müÕ»÷í¶žujJòó ³þQüš˜Ô»ß E£bÆ2T©E]€)©).NNò×®.NŠþú¶þDä`/P¼V {ƒzuñ¹0¼Œ“‡Ã©VµÊÌ©ÚuêÉÚaæÜES'Žkݲ¹uVVv›¯}X»yÕ«ûËÚ Ãܾ¿xYÀå³°v³låǵrÈ<³Tþ«T*ÍÍÍýÿZšý»ž²¬4߯nÊ•"é7|ð¾Gš6þjÿácÇ *äúóx¼œÜ\K>Ÿˆ„"±¢ÝÙÙiжò.Îzia6£ƒC\||Å D¯·ë¯D1ìCƒÏ-€aáSÀˆ±“.\ºšœ’"‘Hã~ÙØÀËS>ɶ\¹ˆÈŠž¹¹yææfÑ1±?¯\«XŽR·Ù󗼈ÌÏÏg™T&eÔ3ÿò›r~‡å§Póóó- ÈÏÿ÷\-¿É ÁÔÄã3)Õ¶u˄ĤÓç.¦¥ [µh¦yý/jתñëÁ£Ù99 ‰IËÖ)ÚûÓ{éŠ5?ÆH$’°wïgÏ_ª?‘lQ`×Î_¯ÿe[Zš0-M¸vãVE»¾­¿Ò$ŰãC `p”ïÇ9ê§¡Ç~ûsÅê ™Y™NŽN-›7 X¶PÞaèàïûŽÉÎÎ~|ç*-œ;}ý¦­3æ&¸8;üýùÕ9*ݼ۶ž>{áÇè˜*•+-[8Wó­.Í\ëÊ;ìÙ³‡e2ÃðÜê*­°Zúpˆ|‡ Z´,`é‚YŠvu믘wÁìiKW¬Ýµgygß!ƒ._½.oþã@Ñè S“’SªT®4bøòv}ˆ´`‹ºÇò]¶j]÷¾l¬m~øþÛ;wïëçú+MR »³£>·†…sÆ©/‰0#oëÍäü[=)˜q›Ã±,b*d7/“H×mÚ6ÒwH^^þ†ÍÛÚ·m]’±2-ÅÆ%"æówMÔù—k3$H¾Š6C÷’¿H³ëiPz©»›ë7‡õý~¨m¹rcF3¬õLJÀàÈqêe.ìTßÊ—'ò<g '3Ñ}¤ƒú;¨à“?l)(åŒSoŸ^mÑv\±WϰÉm葚Ζ€bfœFz”Étòëúžqå1&Ó9pfè‘â'€Idœ8ƉH±þPº§QÒ™Nu ¡GŠ:N“È8qˆ‘bý t3N£¼Ç¡éܸÑÐ#Å-6L"ãÄ¥Cˆë¥›qâ¤:"Åú@éfœ8ƉH±þPºç‹Ç÷/0£ Ê(#5-`Òg¿É0›÷à ^ÆIDÙ"Œ”bƉJ:(ÝŒWo@éfœxÒàˇ·¾lÙQ’Ÿ‡A0ñA€RË8q^ã€A€RÍ8‘c`0Pº'Ϊc0Pºgiת\­VTD˜A¤[Ø'0P*§ké-ªT¯ý!<´ R-½9¼WV#P¤Aм’eècÆ©tT«JÚª]?¼gɪԨÍÚΖÈ(7¤§§¯ß¸éâåËññ 666Í›6>lhëV-ÿ}¯2ÉýØÞ´JÚµjÖ¼tþ ‡ÃQädºú¼{ÿ¾°±«¡# ~TƒÕ¼’Z ¡à®(Z6o†-€¡fœJ—'G¾‘¿¨Z£ŽâµºK˜ yi³j7ÿ‰“+W®täà~w¡P|÷î/[¶¶jÕ¢ ‡C],VVVW®^ûúëò_/^¾lmmM%¾¬[G äZëä{ Ã0)©©{÷þÏ-€aáþ—M0ì?ÿMÊÉÉ™=w~ý/×ÿ¢ñœ¹ rrrˆaªÖ¨#ÏJ«Ö¨#ïå7rL½_Õñl0ÌwDrr²Òr þß½;gæôJ+ð¸\'G‡ž>ÝÚ/Ÿ¤X |áŠy£T" X½¶qÓ–uê5œ0iJfF†Úõ/ü†q =ÒoûŽŠ–í;ÇŒ¡èÏõ¼ù‹Nœø]1Ëñã¿Í›¿H¯Gàsƒ ÚXµFaš°QÓ"¡HÑ(L6iÖJ$ áà¡Ã­Ûu¨U·¾OϾ¯_¿–·çæäL>«®×M›·ܱKÑŸõ}9DÎŽŽÆÃ‡ÀP3NF Ťuë7ÆÇ'\»|þê¥s±±±ë7üÂ0LDØ"Š{öFÞí§‘c~>ôñý;îÞª^­ÚÏËW*-§ ÆÍš»àñã'999êÞW¾ðˆ°7+–-íØ¡½¼qëö/_½>}òG÷nó-ø+Ö0%¦aˆ¨[×Î))©?f&øî=¡PÔµK'EÖ¨Ο{â÷?N9Ë0Ìß§ÏüöÇŸ‹ÌÕçøì °6ÚÙ ºuírèÈQEãá#G{÷ê!Ø*f!¢{÷ü~ìȳG÷ºvé4gÞByûÚõÓÓÓo]¿rîÌÉ©{ Åëä””­Ûñ¡0ØcœŸsòÔ™…óç8;9¹8;/\0ïä©Ó¬Ý.;ݪe >Ÿokk;sú”[·îhXfàÖÍ*xÌš· a£f­½;.]¶R$³ö¼uûΡÃG6mX+ÿõ؉ß-˜çææjcc3sÆÔ‹/—ú0q¹#ü|·ï"¢À»FŽø‰ËåjŽÚÂÂ|˦ «×¬X»~ÍÚ [6m0777ÜÐà§aC>"‘HˆH"‘>zÜÏw¸RŸ¥‹ºº–·²²5â§W¯ßÈÿ>}fþÜYNŽŽNŽŽóçÎR·üjµ<å?Mš·Þð>´çß:N 6”OJIIñps•¿öp+Ÿ’’ª˜¥à¼Ož> X»áõ›·ÙÙÙDÄápX»ÉY[ñ§M?mÒx†aÂ#"÷ìÛï?aÒ¾Ý;”ú¿{¾`ÑÒ}»wð-Ìå ‰ºú(–Sð]JHÝr$ùy}{ùlÜ´ù¯“'_¿}»móyOù¿ê¢v°ôéÝc˶³gLs°ÄhÖÆ*•+Ö¬QýÌÙ³=ºw;}öÜW_6,ïâTp|ˆ¨œ•üµ+‘H䯓“S\]œå¯ÝÊ»¨{‹°×Ïä/DbñƒG®^½ŠÏ-€Afœnˆ#Ÿääèø1:ºJåÊDõ1ÚÑÁ¡àIXEç “§Ïž9­]ÛÖåll23³5oÍÚMUõjUçϙ٤E[¥þ))©þ§¬Z¾ÄÃÝM1ÉÅÙéø‘®åË+­dÉ©[Ã0æææCÿ0cöüÉÆ™››+NøjˆúmHèo¿ÿµõ—õK—¯úº£·|ôô|4‚ºÆáC~Ü´u»O·®ûöZ²pžêFWšW±SÅÄÄVªT‘ˆ¢cb4¿ lmGú GÆ `p {åPî]—¯\“’œ’’œ²lE@OŸnòv­mxx„¢nn®¥…ßÜ<::zÁâ¥ÿ_2Û[ü8Ìïì¹ ÉIÉR‰$..~ͺ_4l ÔÌøI£GüÔèË/ Î8èûþó.ŠŠ’äKBCæLŸ¥›‹fFð}ýôÁ(?_¥vÖ¨³³²¦Ïš»nõŠÎ_wX²pÞ¤©3ssrôzŠ~墱M«™µ±±®W·Žò,Jóþ÷kOŸn+׬KKMKKM[°Vó[ä§§ïÞû+>´‡ýîHŸa"†ˆ¦Lò_º|U'Ÿ^DÔ½kçÉÇÉÛý|‡~ûýYYÙ!/Ñò¥ W¬^;ezùò.~¾CÏœ» X2ËݑƎ:xøØ¢¥Ë323]œÚ´n¹q]€RÿgÏ_<{þbÖ¼…òFù»ŒôNœ_‡úNJLªZµÊ¸Ñ#´u㞢ÞHÞÎõ¢ŸW <°Iã¯b:´oû!*jñ²+~^¬ç# !ØÚõ¿*ø«|M‡ýaá’å»¶o.8»º­/ÿuÒ„± /kש[¹r6Ã~üáæ­;¬o­x_++«&¾Â‡ÀàpŽmèï791:ÜÄ""ôÕ—-;ŠR0e2ïÃ#F›tåüߟíùÝ÷ƒoÜ&Ç˽tòh¿Éø$”¡»7vî3Pþ:!:r¤ÿ”·ƒ vPÔqb¬0e0+W¯ó327/oÕÚ :¶Çø%Ý=WÝ@’-ŒƒNÁÃýk¯orss;z{O7ã`Ì'¾é1e0C:x ÆÀ$2N[Â8` t3N0b0Pº'rŒJÕê¤ÄÇ`0Pj'êç T3Nä€RÌ8ÿÜ¿¥˜q~3Ô†bÃŽƒÃÂÅ2N@Æ €ŒÊ„™±võ©+çOièÀ㙵ïìÓ±kOãÞÀ@ÆYZþ¹tnáªM|¾¥º¹99ËçO5úL ãeŽå¬úÕ«WûõëW­Z5//¯±cÇÆÇÇ«ö‰D£G®Y³fƒ Ö­[÷Ùy¯]»6`À€êÕ«{yyM˜0!99Yu™*TèСSà^ô ôoß¾B… Š žžž~~~QQQê“J%Ò,"â[ZJ¥Í£cCQòq(ä T·n]̓ ®aZcÈ8·oß>bĈgϞݻwÏÓÓsÔ¨Qª}fÏžmeeõðáÛ7o~øðáØ±cšçݹsç˜1c^¼xqýúu[[ÛqãÆ±®••ÕåË—¿^¸pÁÚÚº`‡˜˜˜˜˜˜èèè›7oÖ®]›uÝ´CQÈŽ)`ñâŃÖ<êúuÀ0ÚÀ¨—]­Z5ÕöZµj …Bùë´´´¾}û~Þ¬¬¬ªU«ª¶{xxœ:uªOŸ>Š–ž={ž>}ÚÃÃCÑ¡`ÿœœÖåÈÍ<’ùœÂô1ô¡Ðî8¨[a…¼¼¼-ZÄÅÅr4ôW7m[µ`&-)Nþ£y8´AñÕüöI°ü˺ MתgeeµiÓFuóésØß¾}[øyoܸѸqcÖwôññINN~øð!ݹs'--­{÷î¬=SRR6mÚ¤n9Z‡¡øì Ë8q¢eË–nnn…uý‹: ÏÔ^9$/tvv>yò¤êÔ:,]ºtáÂ…D´téÒ¬¬¬BÎûêÕ«Å‹:tˆõM¹\î˜1c¶nݺwïÞ­[·Ž;–Ëåª.YÎÎÎîÏ?ÿÔÁa( ³ÂD$“ɶoß¾gÏžB ºþ…0j¿¿cbbÞ¾}ëëë;uêTÕ©«V­‰D5òöö®T©’££caæ½s环¯ï¶mÛªW¯®î} ðôéÓ¿þúëõë×ýû÷W]+¹×¯_9rÁ‚:# E!WøôéÓ5jÔ¨U«V!P]ÿÂvÆID¶¶¶cÆŒyòä‰ê$GGÇ   ÷ïß?}úÔÝݽuëÖŸ÷ï¿ÿ?~ü®]»¾úê+ ojaaáçç7iÒ¤#FXXX¨ëfggçïï/?ߪ&>…\á-[¶øûû~5ô/ê €eœ'N “H$‰‰‰ëögr§OŸ—““sþüùõë×O™2Eó¼;wî\¶lÙ±cǾøâ‹Ï®Óøñã?|ø 9‹Å5jÔ(ÕÑÁPh^á‚gö¯^½jeeÕ´iÓB kÿbè3–:Î.]ºŒ;6,,ÌÞÞ¾C‡ª}š4iÒ£G±XÜ´iÓ={ö(Òuó.Y²„ˆ ÞL144ÔÆÆ¦¨««Hq¬­­›5kƺnZ„¡(ü oÞ¼YõÆIµ?˜JÆÙ³gÏž=ÙŸ@#1pàÀ~^ÅŒ¨ë£h/ÌBx<³Üœ¾¥¦g혙}æ‘KF0% ïUpë¥Kð³—:is€eœÆ¡}gŸ ¦J$jŸ¦cffÖ¾s£ßÀ@ÆYZ:ví‰g…c@àŒq 〲aFD’üÜ QÆJŽq2N@Æ €Œq2Ndœ€Œqh3ãć t3Ndœ€Œ' ãdœÈ8' ã@Æ È8'2N@Æ €Œq2Ndœ Oxý{w«Q·¾†iiB++K‘HŸÏ0„×x]¶¯ÿüó/_¿9Yòý3<ä¥W£ø$”¡×Oî*òÉL±ðÔÙ ¾~# v0Ó<¿H$fxöÎndf)å˜ÙÙÛÛ;:šÎk†ˆÌ,íœL1v;{{âr^ŽÀÁE¯Ö ŸjƒÃ9´¡sŸzØ;»a˜@´kÝòÆí`ar¼ü×K'ö÷›Œa(C'voTä“ Ñ‘#ý§Ü¸\°Ãgê8ÓÓÓÅb±ÉŸX,Føø@ æ¬:_ ˜æè…B"Bøøœ@)fœ¶¶¶¦œp˜x²…\t‘qÚÙ ìííMvtL9v„Ú‚:NMPlj:N(9Ôqj‚:N¹u(íŒuœ¦¼s ×]dœ¨ã4åuœ ¨ãÔuœ¨ã€’C§&¨ã$œ[€ÒÎ8QÇiÊ;rMÐEƉ:NSÞ9PÇ Z:NMPlj:N(9Ôqj‚:N¹u(íŒuœ¦¼s ×]dœ¨ã4åuœ ¨ãÔuœ¨ã€’C§&¨ã$œ[€ÒÎ8QÇiÊ;rMÐEƉ:NSÞ9PÇ Z:NMPlj:N(9Ôqj‚:N¹u(íŒuœ¦¼s ×]dœ¨ã4åuœ ¨ãÔuœ¨ã€’C§&¨ã$œ[€ÒÎ8QÇiÊ;rMÐEƉ:NSÞ9PÇ Z:NMPlj:N(9Ôqj‚:N¹u(íŒuœ¦¼s ×]dœ¨ã4åuœ ¨ãÔuœ¨ã€’C§&¨ã$œ[€ãõïÝ­FÝúê&3 %¥¤zxxDFF>|øP&“9::šÎk©Têîîo‚±Ëd2‡¸¸¸—/_êÕºýùÇï¾~#r²2ä»hxÈK¯F-ðI(C¯ŸÜUä“™bᩳ|ýFìÀ9´¡sŸaïì†qýÑ®uË·ƒ…Éñò_/<Úßo2†  ؽQ‘O&DGŽôŸrãvpÁ¨ãÔuœ¨ã€’C§&¨ã$Ôq@igœ¸§)ïÈ5@'îÇiÊ;îÇ Z:NMPlj:N(9Ôqj‚:N¹u(íŒuœ¦¼s ×]dœ¨ã4åuœ ¨ãÔuœ¨ã€’C§&¨ã4ˆðOìÞˆO2€gœ¨ã4åà Â×üŒV0€Œuœ¦¼s Ž´uœš ŽuœPr¨ãÔuœú~Vfæ×âb£ña(!7gœÚ‚OÄ' ?Û‡Ã!7÷Š­Úu°¶±)~Ɖ:NSÞÏ "ü»·oT¬\µ{ßþV6å4÷ܺæçñ3âÏ«-k–ÖkØãŸdœW¯øÏX ¹Oº(íõ³Ç÷îÜìй[ñ3NÔqšò~fáÇÇ~ìñí@3O&‘|¶3ÃÈ™ AØs (“12™TÃtÛ/›µÚ»mýgö®Ïä­éé\ k“=Ô'¯bDøú¼’R©ŒÇ3“J%…éÌ0Ÿùؘ2‡A•„“‘}î` Ë“Je%Ê8QÇI¨ãÔûðF¦”G2 óæé=÷J.n>i—ÉdRã(ΗìÙ³ç®^»¶:`—Ë-êrPÇ© ê8 åÓPð\9Ã0ož=HOÖkÜŠùôT;ŽqB™[¶`úüŸ×²¾Ðó/Ù–-šoÜ´iúô™kV9éD§&¨ã4ˆõ”12ņaÞ¾x(LMnÓ¹,?Ÿa•žÈ8¡¬÷ØÿvBÕúü%+Ž<гÏ7ÓgÎZ½je‘’NÔqj‚:NßaæßC\ô‡Ø¨ðž e’<Õºi~^^N6þ|@ÙR섪/ôùK–ˆìì]:}½3hw³fMû÷ûVk'ê8 uœz¾D’Ÿ—ûï¶£³K…ª5ã£#Ë»Wâq9ªŸ®U‡2?`ðßN¨ú@Ÿ¿d‰H(]¸x±ÿwßöòéZ°½¤'ê8My'3Ð:Î*ÕjÑ«'w=¿hbÆå)}Óãô%èAƉ³ê`8 |É E¢a?jÖ´Éò% 9DEºá ê85A§|Ë”UªR#:ò]~^>ׂ£ü©‘â«ÊÒÄ©³å;¡ê =ÿ’½{÷¾W=Ï¥‹æSÑOΠŽSÔq’¡Ôqªì÷«Ô0ç[æçæ|ÒQ%7€B~ÉvþºCç¯;Pn*ãD'¡ŽS¿Ãçñ¸b!‡ÃQ”›Åö©ÁÁ$€"%œ²Ïöáñ¸%Ê8QÇiÊ;™A„ï^¡ò»°Š-­­ óÁ¡Oï—š³IÍG4³³3cbb=*V)QƉ:NSÞÉô6ü¼œÿ¼lÞªí›×ž=~P˜LòÀî@üíPçɽ[P²?h›æ¹yTjÝ®}‰2NÔqê8õ,ü·ƒ»|í}ú̹¬ 1YÛØtêÖôAJBÌ„i³nÜ.ZƉ:NB§^†/ÉÏǧ@¯(]°[ÐgÊà»oÓ…)Ù™éøx胔„±0eÒÔ™¯\WŠ:NMPÇ©·ëvú•._{Ѫ%óÌÌ-ø|K|ÔÊЄi³ˆˆ5Ý$Ôqj†:N}_¾O·kÝr€2§Z»Y„Œuœ„:Ný_óþ]òðæ8·L&!ss®”1Íð‹±õE)‰vvFõÙ¿tòhç>寢#GúO)½ŸôtM•l¶¶¶šgçõïÝ­FÝúê&3 %¥¤zxxDFF>|øP&“9::šÎk©Têîîo‚±Ëd2‡¸¸¸—/_êÕºé,²´´´´4ž“õé☼mù³™føÅØú$3¶«ÓÂC^*þÚgŠ…§Î^ðõ/Q(¤¼¼< Sù|¾æÙ9ǃ6(þ×ËÊÞÙ £ `èÞ½ü‹ ªù"CQHÂäxÖöܼ¼ /­^³þÖõ+ŠFw[[[©TÚ¦u«µ++Uª¨Ú¹÷׋Îk×¶í?ׯ/[±êƵËg5ÂÏ»]ŸîÝ=öî}ø†›Ò’âä“Ò’âd2Ù›·¦ÏœóðÞíbG„cœP†PÇ© ê8¾Ñ„Ï02â`ë!üôôtÕ“D.îDdoowâÈ¡‚íòì0)9yËÖí~£Ç^<{JµóÆõkú $‹ÁïÇ(-yÌè#GëÞ­ëöÀ]Çذq“Ò›š››ïß„/-0PŸ¹;’H$–—s™èA¡á#|㓞”[Î[¿ðá‹DbÕö´¤¸¸ë×®=n‚êTgç9³f<}úŒµó˜qvïÜóaWàÖ±þʳW«ZÕÍÍuÆì¹µjÖððpWzÓÔÄØ?;6wþ"0ÊŒ÷ãDøß802©ŒÇÁÖ/|øª8çÌ[˜œ’BD\.7##ƒõ¿èë6üÒ ¾kç”Ô"⇈RRSUg÷;f÷ž}£G©­­”/Àá~œšà~œßhäg ÉÆ[¿áK”ŸœáååÙ¶}§ÔÔ¯zõvï ¤ÿŠ,é¿ß|>¿Eóf;·²vÞ°nÍ´³cbc+V¨°qýZÕ7mÙ¢¹|iJä wuu]½r9¾´À83NÔq ¾QIòÈŒ‹­_øðUë8üaÐ? *Ø¢HU3EÕÎ}{÷êÛ»ë۩ήaɆuœš ” áM8’,±ÔÊ[¿ðá³Öq@ñ|æ'ê8Myç@øÆ“ŸÇX˜aë>|&?ß:Ê8QÇiÊ;Â7¦pd9Yd‰:΢„/AÆ  5Ÿ9«žžž./ç2Mb±á#|#É8s³e|slý‡¯ùyn ÍŒuœá&/—±Àý8‹>ê8´uœš ” áOÆ™EV–Øú…uœºË8QÇiÊ;Â7ªxòóÉÌ [¿ᣎ@g'îÇI¸!%Â7YYdgWÚáOJÇ“››r{X‰D¶õYŸ«¥’qŠDb†Ç7ÙœC^džð¾àHeÄ3+íð< ñã©sgåö&M(/,, ië‹Ebdœ:Ê8QÇiÊ;Â7¦p8™T­zi‡/QÔ r»egRƉ:Nfœ¨ã4åáUÆ)c§´Ã'WW–vKKÊÎ.ÒY}=Øú¨ãÐYƉ:NB!#Â/k.®Ìxr³„ ñÞñúΡ¥~~>‰DäâÂ2‰Ï§¼<Ûú¨ãÐ]Ɖ:NB!#Â/kÒ­›<ï'¾Ö¬$ ¹>«…[½¶¥~B•/O¬Rml(3ÓÀ¶>ê8t—q¢ŽÓ”w„¯'kÂp9Ûfx³JÏË#ww5hÌH"1°­:NÝeœ¨ã4åáëÉšðE9Œ‹þ‡Çr_¤ÿþïJ†õÈLÔqhž«® -ðõ"ãçZ Êëø j3Nd2Ûúx®:€¡ŽS2"|}ßJœOWý ÿý{ªY“”ÛÓÒhÑ"ö¥ vŒuœ:Í8QÇiÊ;Âד5±K›þ„ÿñ#5iB/²%ÇVì³ðx¨ã@Æ©ê8Myç@øz²&åÄ2²«¨?áÇűãÔB9=½V=$„êÖe€´$dœZƒ:NMPȈðË|5òò2Ì$deå¨?áÇÆ’‡GÑ–fa¡§÷ã #bå‘uœÚ„:NMPȈðË<ü q, 8Žú~L UªT´¥YYQvvÑfa Õ.ÍÒR;a††R­Zìᣎ@w'ê8Myç@øú°™â8ðõ)üØXjVÄ»ÑËŸrY$oÞ—ûõI Ò’%Ú 3,Œå)ð„:Ngœ¨ã4åáëÃjd‰ã9s½ ?.®ÈgÕ‹ñ”ËÐPêÙ“NRn߸‘"#µfh(}û­šðq?Neœx®:áÁâ¿LåˆÉÎB¯ÂUûl!uŠñ”˪S‡5T{¶]ƒ¨(JJbiÿçÚ³‡=|—|9ÇÃÃ}á¼¹ú÷Ã÷aƉ:NSÞ9¾†©RqGPÎXc ¥š5eZÜ4<å2*Š*W.¢4㌎¦¯¾¢*U”Û=¢Y³Š¼õUë8Ož<µw׎êÕ«;ñÛˆQcß…¼RLºxéòïǺ¸8Ÿ»pÑoÔ˜÷!¯‰¦‚ÿ„É[6mðönwýú…‹—nÝ\pêŽA}{÷âp8ùùùÇŽÿVpRZRœL&»qóÖPßÈ8À@ñú÷îV£®ÚrzKK~rªÐÑÑ122òáÇ2™Ì¤^[XXxxx˜fì2™ÌÃÃ#>>Þ4cwttŒùò¥º>¹/O›YYRõŽcxx¤££ý’%¤ôD*{ôHÑÖ{¥§;^¼˜]¹òu¥vÏqÝ:Y»vW ¿Ì¨¨È;m{ôˆtssPêsøpÄ“'·ñ7Ž­YóM²Áƒí7ŽmÛöM‡y+:é³ïh¯|J½oŸ^..ÎfffŽŽ'~ÿcìèQŠI={øØÙ ¤2YxDÄóç/ò°fݶÀk×o¼ÿàa‹fÍìì¿lÞÚç{µªU#?|ز5pâøqŠÙÖ¬ëѽ{~~~­Z5øÍÁÁáîÝ{³gN—Oš=s:Ã0¢¢nß 5Ò¯ØîÃC^*þÚgŠ…§Î^ðõoAÐ Îñ  û T79==ÝÎÉ•|á+¹>£•/ï=ã´Aǘ’BµkSJJ©oý[·hκyS¹ýùs<˜^¼(ÚÒ*W¦[·XŽŒnÙB¯_Ó¶mÚÙú¢”Ö:ÎÄÄÄï2súÔîݺl—Ÿþ¶··;qäP“&åIÉÉ[¶n¾wÿâÙS§NŸ»`arrÊð¡C‚öìMŠûXpÞÇ‚GŽwéü™v:;|Àë‹FϪ‘¹¹ùþ½Aݺv)vP—NUüµOˆŽé?åÆí`| €np5O‰ÄÂb܉ÄX…B„ðÙ?9â ®Àà¯åOM%GG]l}uO¹ŒŠb9 þYvv쥜ên_¼­/±\ëôèñ“ÎÝzŽ=J)Ý$¢´¤¸¸ë×®=n‚¢ÑÅÙyάOŸ>#¢^=}^ž« »Œuœ¦¼s | SmDF` §ºcœØúx®:€î2NÔqšòÎð5eœb)#p7ôÓÒÔ^¸ƒ­çªhÑgžž.V÷8d ‹>Âge+flŒ ãTwå¶~zz:¾!t”qâ~œá«ÊÌHȶæðx†£ÎîÇiˆ[Ÿõ~œP<¨ãÔ¥l…ìÉ0²·YøYYYD”™d­:)=æmC c1j¸V;?ê8t—q¢ŽÓ”wŽÂ‡Ÿ.Žñl2äMckc _C0Ι’ˆú6žÎÔ©ôûïäâòIã£Gj¯UÇÎ:NÝeœ¸'ᆔ…?C“QÙÌóa&¶¾Þúçš6Z·Vn¯Q;?{øª÷ã€ÒÊ8q?N ) ~¦(–#0ÃÖ×®˜êÔ‰*VTnÿø‘æÏ§,ÚÒ"#ið`µG4±ó«†ûqè.ãD§)ï…?GœHsl}í ¥¤$Ú¼Y¹ý—_èÁƒ¢eœ‰‰Äå!ÝÄÎ:Nfœ¨ã4å£ðá犓HÀÇÖ× 9™¦M#KKåv‰„  ®]Yfy÷Žúô¡N”ÛÓÒèøñ¢½{HH‘8ŽuœºË8QÇI¨ã,DøùâXaëkIû÷ÓŽÊí»w“Džq¾Ï^déêJ‰‰ìï’M§O³´ïÚUäŒ;?ê8t—q¢Ž“PÇYˆð%âT²³ÁÖ× 1‘||hÔ(åö–-©öYÂÃéÛoYÚÝÜ(>ž}–ׯiÀ–J¥äヿhᣎ@w'ê8Myç(|ø2Q Êaëk@®®,íõêQ\‰Ddg§<éÝ;ªY³hgh(}ÿ==Š_ ᣎ@w'ê8Myç(|øŒXD[l} ©|y–v*T Þ½©eKåIOž°ŸU(?Ÿ²³ÉJ¥!$„=IÅÎ_œðQÇ  ³Œuœ„:ÎB„ϧSÕªØúÄÇS•*ì“Ö¯§gÏXÚ×®UûÐswwŠ‹£êÕ•ÛCC‹|ö;¿ºðQÇ  »Œuœ„:ÎB„Ïg’À[_ƒ„jÖŒ}R·nÔ­[Ñ–V¾<%&²gœ“'cç×Nø¨ãÐ]Ɖ:NSÞ9 ¾™8‹ìœL'üÈHªV%á §õëiÊ–YÔU/æçÖŒf¹qÒ£GT»6v~í„:NÝeœ¨ã4å£ðá[ˆ²Iàl:ᇅQýútò¤rûµk´k{Æ©îÊ¡âY¶ŒBBXÚwï&mí³ØùQÇ  »Œuœ„:ÎB„Ïç’ÀÅtÂŒ¤æÍYŽqV®LÓ§Ó«WäáÁ2‹3NooòöÆÎ_ºá£Ž@w'ê8 uœ…ßJœOWÓ _~VåãdF:Pýú,Wüdd³3v~C uœºË8QÇi¸+<°JËcQ%YBåB÷¬N”`ça:[?<œzõbŸôÇØù$|Ôqè.ãD§A¯ÿ#Z ܤ›÷r5¥­i|7ƒ2¶_ ᣎ@g'ê8É`ö˜‹³“Ɇ¯•­Ê Yž¥t÷®ñgœØú¨ãÐ]Ɖ:NÃýÒå‹s™’]Í£Ýðß½£ZµX ÓÒhÕ*š5«hK[²„NŸV¾.;!.\ ww–þ›7Óĉì÷3ŠŒd¿7»P(1Âíý{jÑByRÆ,×aç7²ðQÇ  »Œuœ†»ò–â<²sÓŸð_¿¦öíYÊù…bbм´?ÿ¤>}¨mÛO¦W¯Ø3Î{÷hÁ>\¹}Àzù’=ã™™f÷îQ½zØùM1|Ôqè.ãD§á®¼HB%»šG»á¿~MÍš±ã¬U‹Îœ)òÒ¢¢hÂå«¿¿ûŽBBXî‹ND¡¡äïÏrŒ³}{zõŠzô`@ûµö˜rìü†>ê8´‡«yrzzº¼œË4‰Åbà ¿œHj#pןð_¿&OO–vJN.Ú¢‰Çc¹ÙPݺôú5û,!!T·.K{½zjgyö,£B™…v~ ?==ß:Ê8E"±¼œË4 …Bà ßVÌØ *èOøoÞ°gœŽŽ”šZ´E½}Ëž>Ö©Ãþ$žØXâóY¯~.ãÌ®Z5;¿É†/™n  u¨ãÔÄpcÏHãØpl¸fºÑ":}š•Û>T›qª;Æ™™I‡±´R“&,ížžtå ]¾¬Ü~ý:U¬Èþõêу4`ˤ'\üýs±ó›løªuœ.ÿž4HKŠûì$E 9::¼y}éò•ÙsDÇD7oÖ,hçöò..gß´ã›>½å¿nÙ¸`Ñù¢äËáp8î çÍп¾·À3N;;Aff¦½½}|||LLŒ››[… ðZÿ_ˆxádËÆÄ”|™=*RÿÓ§m¾ü’3hP¹ÔÔÔ””ggçÔÔÔþý“ÓÓmÕyã’’¾$â¨.3>¾òèÑ.?þ˜•••eeeecc“•••••Uµªõ7ßX«öwuukÖ¬ÂÏ?çåääðù|>ŸŸ———“““—gÙ·¯…ºuÞ»W˜jooïèè( SSÿ}ݹ³ÐÙ9&&ÆÞ”÷%SþìÛÙ)çÜSÀÏNR¤ž<¼pé2ùO˜¼eÓoïvׯßX¸xiàÖÍ—°cgPßÞ½8N~~þ±ã¿)-\&“ݸyk¨ïdœ` 8ǃ6tî3PÝäôôt;'WÜÓàÖ<üÍêׯúë݇ߢmÜÈrG! ,-I($KKåöèÜ9:|[á—Aø¢”Ö»#9¸¸«ãÔ0éû†lÚ°ÖÕÕµf¯m[~iïíýÏõëþ&‡½}YpÆQ#ü¼ÛµñéÞíðÑcïÞ‡oظI‘Å*2Îé3ç<¼w»ØA]:yTñ×>!:r¤ÿ”·ƒñ-º:NM ·”-K—-0/“ðSRXN©k¦®”3$„êÔÁÖGøe¾Vê8ïÝàà`ïêêJDÖ­™6sv•µ¯ýsC()õ3zÄú›†Ù¸k„ïp¥DÖɵ€A?.[º_Z`œ'ê8 4ü\qR®€_&᧦’SuäìL‰‰,í¡¡T»6¶>Â/›ðµrû÷•kÆ-Ý«§Ï‹'ã>Ftìàí¡rÛØjU«º¹¹Î˜=·VÍŸLMKŠKMŒýó·csç#ãC…ûqjb¸±ç‹SH`©ûð%‰Š|ŒÓÙYq↔¦~‰ïÇy'ø®D"iØ ¾¢…a˜Ðа‹—ú¢ÚßìŸ^}ÏŸù[Ý“SRð¥Æ™qâ¹êd˜¥lq*ÙÙè>üÔTrt$§ho$“‘ò„ˆèùó²<ƉBFÂsÕ?=Ì©¸0Hþ"-)NQ¸©:‰ˆV¬;z”Òì®®®¾Ã†Lœà¯ú¦-[4g­U̸zår|i€qfœFð\õÌÌDruªk]Œy†!"NQ(=ÐæQÖ±^%\H1ž¬’RäSêD´u+ű]‰1o•+Wfcˆ‹ž«þiÆ©š*ZX3ÅSý®yöb/ÀØ2N#¨ãÌǺfíØQŒy³³²ˆÈÚÚÚà¢~CTÛͳ„ ÑÑÜGX&YXPƒ,íIIÅÉ8½¼ÈËKïÆ7¤4ñðñ\uÝeœFPÇ™)ЍcáÙøGl좲··ïÕ‹îÝ£† •'=zDqqäæ¦Üž’Bnkmðá›øÖ7õðñ\ueœFPÇ™-Nà÷>A(e‹/÷ìWõYAƒÓ_ј1,gQ/Òçð uœ¨ãdœFPÇ™+Nâ÷>A&^Ê/Љ±­U‹eR¿~Ô¯EF*·oÚDãÇIø(d$Ôq"ãÐMÆiuœyâdNqïdO §5ÈÁA¹='‡jצæÍYf±¶¦µk‰ÇSnOH°¯VMffÆS¥[7ZµŠeQ‹‘··‘|6PÈhâᣎ@w§ÔqJÄ©dWÌK 1ö7o¨];úë/•qPp0ÅdzÌ2o 4l˜rûµk¶_|Áþ.ÖÖ4k–‘6PÈhêᣎ@g§ÔqJE©$(æ) ±”íí[jÔˆå'õîÍ>KÛ¶Ô¸1<¨ÜN«WçYšæg…Œ„:NœUÐMÆiuœŒXD‚b~mb)[H5jT´Y<=)+‹¥=**Šˆˆ*›æg…Œ„:NdœºÉ8 Ž“#N§òå‹7¯!Æþö- ¬E¡’á›rø¨ãÐ]Æiuœ\qÕ,æ£õ9öS§èõk–ö›7µö,rTò!|“uœ:Ë8 Ž“'Î$»bÞ"²ÌKÙ‚ƒ©U+–¢Ì´4òð ~`¹À|Ö,–³høe áê8qV@7§ÔqZˆ²SñæÕY)ÛÊ•ôä Kû‰tàõèÁ2I `I7µ •|uœø’ÐEÆiuœ|q.#(惵{r2Iæ*Ï? £èhZ¹’ìì”' N>>e6t¨äCø¦>ê8t—qA§¥8ìŠyšY»±oÚD>М9,“5¢5ônèPɇðM:|Ôqè,ãÔqçý>î2sÃåhq™-_äÄ܈èÜ9:vŒø*¼ÌÍ¥µkÉÙ™eÞ╲ N§O³° §°0ªYÓ`vTò!|ÔqâK@§Žë8›ýçðxŽ™¹—ÜŸ»7$¢3gèÑ#š0A¹ÃèÑ4bµiÃ2o1JÙââè÷ßéúuR=BdnN•*ÒÎJ>„:N|Iè"ãÔegfFÙP«A›Kiùáá´jËU87nPx8{Æ©!ö'OØí“–F&ùìú •|ß”ÃG'€î2N]ÖqfˆcIÀµ)µåGDPÕª,í5kÒ»w쳤¤Ø?~Ì>iútZµŠFb™dcc$;*ù¾I‡:Neœº¬ãÌÇqf¥´p†¡ˆª^eRtáû\?ÿœÿÛof>>,u¥MšÐäÉ,U¡Æ•|uœø’ÐEÆ©Ë:ÎlqÙ™—ÒÂcbÈɉ¬¬X&U¯Nááìs?Ï={6®];ÓÜ9PɇðQlj/ ]dœº¬ãÌ%’@ Ç ££)/O¹ñæMòP“7V¯NÁÁtâ„rû‹$‘p6´6Ù•|ß”ÃG'€î2N]Öq打I`YÂ…DFRµj,gÏ?~¤AƒØgqw'–Œ3/,à˜r5*ù¾I‡:Neœº¬ã”ˆSIPØŠïÞ±?2 €æÍ£eËŠöÖgΰ·‹Åb±•|á›bø¨ãÐ]Æ©Ë:N©8ìʲó¼ytáué¢Ü^©Mž¬µUB)ÂGø&>ê8t—q겎“ I ü÷==$åž©©tö,EG³<×G»Pʆð¾É†:NÝeœº¬ãäˆÓóí+¦¥ý¿åÖ-êÝ›ý.ë½{—zºI(eCøß”ÃG'€Î2N]Öqr„YÇ×ù XÿIfyå uìXf£ƒR6„ðM6|Ôqè.ãÔe'Iüª¼Ô=”²!|„o²á£Ž@w§.ë8¹Ñ\—/xz5:(eCøßdÃ×\Çéàâ.‘–Ç:‰Ãáxx¸/œ7w@ÿ~ø¦àõïÝ­FÝúê&[Zòeĵ²² …±±± ÔÞkÑÊ=é=[6éø•Þ«¯ù|¾ƒƒƒþ¬Ž_;88äää˜fìVVV999©©©¦»P(LMMåóù¦»ü³oÅ×ôòÙ3§Ïž9=`ͺÙ3§+M X³.-)nÆ´)^õê?iʤ zòç><ä¥â¯}¦Xxêì_¿ø½8ÆID¢”D®,O$‹…ii^é½6;¿§c9;ar¼Þ ¯ñ¯ñZók-\;UÞÅ_3DÄ9´¡sŸ€¢rpqWwVˆÌÍÍ÷ï êÖµ‹ž¬í¥“Gí¢#GúO¹q;ôå'ÆÚM%iIq ÃÜ ¾;aÒTýÉ8ÊWÝVż%..¾[Þ®*wëÑ;..Þ†fÕ굦þlÖ²MyÊmÛwúçú S ÿ¯¿Oµhãm²á+}ðM-|ÍÁ¦%ÅÉ ¿Àä”|ͨÍ8Uÿ¶Î_´¤eËQáa-[¶X°x©ÑË“§Ïöí?¨øÕ¤Â¿xéòïÇF…‡N2ÑoÔS ÿäÉS{wíø6r„ïˆQcM-|ՌʤÂ/|°Š¼\)AWLu,ïá7jìê•Ëñ5@ΪW®^[*•¶iÝjmÀÊJ•*^¿~ãέø|þØÑ#[µio܃’››;~â”][{ó¼Å¤Âܺ™ˆróòx<ž»›»©…¿w÷Nù‹ÞÞk×o4µðU™Tø…VÑÎ"0éŒSþ3)9yËÖí~£Ç^<{*M(tvr""'GG¡Hd܃²xéòÁ? lÛ¦õÿĔ§ÿêÕìííN9d‚áQbbâP_¿€ËL3üOþ˜Rø&¾­JWÃ4gç9³f<}úLž|È ’RRSíuðDó2µcWм‹§ÌL-|ù9â>F¬_»zô¸ &þ£ÇO:wë9vô¨îݺš`øJL*|ßÖe“qŠDâu~iPß‹ˆÚ·k·}Ç®ÜÜÜí;vy·kk܃’š«¨f“ÿkRáÏ™·Pþ¥Ëår322L-ü_4xè†ukŠ1©ðU™Tø&¾­JûYuù=>Ÿß¢y³[‰héâ…¾#GWªVë«/¿Ü´ÃԆɤÂ÷òòlÛ¾SjjŠW½z»wšZø“§N'¢~þ½matä;“ _qŒüEZRœI…oâèJî`px(C\  ãdœÈ8' ã@Æ È8'€3Îrv#–)b Œ3Ndœ€Œ' ãdœÈ8' ãÐ3 þJòórsdR©~®‡C\.ÏœoÉ33×ó‘ddR©TÊÈd% ˜8.ÇãpyØ9qEº)•¤$%^»z1æc”TçI§››Çgûðx\—òîm:v*gi%•Hô8Ý”¥‹D·o_Oˆ‹-Ér¸\®³Kù–­ÚÙ;:q¸8€ŒÓðååæÜ¸~µZ:=¿Äáè:¿ùýОñ3i—û(øÆ½[7º÷íŸ!ÖçÜýÞÝÛ•+Uí7p8Ï̬$[äÑÝ[îßiß±³…¥5vQdœ‘J¢"ûõé_¡RÕ2Z†a4†633kÔ¢Íî-ky<½>àÇ0²¸ØèÞßýÀáp¤’üb/‡Çã5jÞêÉÖ»yyyÈ8qEÆÉT*år¸e· #c ¶H$³OšñÌ¥RG¿‡’d2Ï̬ä§þy<3©LF2)öO€’@u|šrþ÷óìÙÓ–­[?{ö´`£æƒ úŒ>]ñbþƒ}'h'E#FáÙ³çß ñ݀Ϟ=g 0¨ Z )'v €’ÃYuø‚&O°ž¿x1pà3¦Mûá‡A‡ù~àÀ£G7lÐÀÃù$?ÎÎÉ MIMãñxõëy:99œžÎ³´¬àáÁçó±? ã,‚jµ<‰("ìÎf4蜓ˆ–¯X9ÞÜAƒÑO?ùZYY-_±òèáC )_õáCäǘØ6mÚZZZÞ¿ܬI>ßâ¿I>ž ¬džô†jñºüP¹R%üiÐ"íŸU‰Ä+ÖtìܽŽWÃ:^ [µë0ü§‘ÅÈö?µ<´ëÐyͺ¹yy¦¶y*üG)1\¾|¹§§g½zõV®\©8’§®½°)šŒad2F&;°oïÀïÈ_32ÙÀïØ·Wñ«AåÏŸpsuåsúÔß666Í[´zü䉼ýctô»£«»º_«Ç}üeâ™Ôädì"0™Œ3%5µÏ·ý>:i‚ÿ“wß^¹li±—ö&"ìͽ;7Z4o¶-pÇ’¥ËнÝ<111111J¼{÷î?ÿüsíÚµ;wî9rDs{Q“4§”«l1¨„óßZ̼¼Ü¨¨¨ˆˆˆ6­[æäd§¤¤888Ä'$0ŒìcôÇC+zW¸Lõl)5#<…£TŠ¿z—q®ß¸éCTÔœ™ÓûôîimmmccãÝ®í¾=» ö9þÛï=zS×ë‹m¼;ñÙe::8Ì›3‹ˆN9§H&‚öìkÿu×Úõ¶j×aûŽ]ŠLH~XtÿC­Úu¨^»ž¢E>U&“mÜÙ¦ý×µ<´öî¸-p‡¬ÀA»Ý{mÓþëÚõvîÞó?Oêí6;qâÄìÙ³]]]]]]gÏž}üøqÍí…NÑ´y%|Ø;Ñ®Cç:^ »õèsíŸë«×mhÞÚ»v½†=zóäÉSyÏ{÷|Ó gƒ¯êÖÿrØO#®ß¼¥µ”ó¿µ–JdïÞ‡[ÛÚ_¼t­œ­]BBBXX¨ããÇOÂŽ®ïSá*5¯Lgã.~txçùcÕªÕ”®UýÊ8/_¹FD]»tR×á×gÍ™ïæævóú•³§þ -Æ»ì Ú³|e@“&ž?¾?à»~«×®Ú³¯`‡Ð°°ËçÏ„‡¾Vš1pç®Õë6ôôéþòéCŸn]׬۸cg|Ò¾ý–­XÕ ¾×ÝÛ×>pñòe½Ýf¡¡¡ 6”¿nРAHHˆæöÂfh,'¢Yi™¯^½:æä¶Í¿„„†þ4rŒH(¼véÜö-¿¼~óvÚÌ9ò>§LúôÙ¦ kŸ=ºç?v̯ûj'á,Ž……¹[ùò¯_¿ªß°aÓ¦M_¾|yäÄoÃ#ßlžÒËõ5¯Dgã.FX…xùuéÑËÆÆgÕ´KËW¥¥¥‘£££¢Eq|Q~j{÷ž_‰háü9.ÎÎD´xá¼B,S¸jõZ"êÕ£»¼åà¡#D4~ÜKKËŸ†ûeóÖôóUÌ2uÊ$kk–‡Ä:rŒˆü|‡ñùü‘~¾A{ö:zlì˜QD´wß"š;{¦£ƒƒüÅ…‹zštfffÚØØÈ_—+W.33Ss{¡s4æì‰_5wéþÝÐ"-rÊä‰ÖÖÖíÚ¶‘ÿ:yÒkkëí½‰(òÃÅjó-,ÜÜ܈ÃiÖ´I³¦M´“q~ú¥*U+ÇÆÅ8~Ì«~ƒÈ‘é9²rWÆõJç´¬Egãΰ}WoXÏÞ}ìWP€žfœÎÎNqqñIIÉnn®ŠDS‘tQ\|<UüôRuä3òxJ2©D’ÿÿKÍxjÖ´Q~^îÍ;w}Ñ M(еªšóæv¹¬˜S·“î×í3¢o_낳€¶hù¬z·.]ˆè·?þT×ÁÝ͈¢U®†a%¿èçÝÛ—7ÿ¹„ˆÖ¬‹Ó333¯ß¸9ì§…™ñÛ¾}‰h÷Þ_ssswíÞKDƒ¾ Ÿ4lèD´bÕê´4aZšpeÀ½Ýfýû÷HHHHHH0`€æö¢$i2†‘Éd¥«… ¶h=œ1þÞ¼ ©çéÙ²Es"²øï™ÚÈ9•/{rp°¯U³úƒGGñ_¿vM‚Àíè‡*D4سö›Ùsƒ‘HòñÌ!­ÓòYuÀöÏߎíÙwú̹Í[·K$’rål<ëÖ­ïUïßÄnÈ–––¿î?ÔÆ»£ƒƒÃä‰ã‹“qÊç[8x¸iËÖüƾòóõ-\BìÏ0²?þ:´g_ùò.S'O;zäË"‘Höí?мu»Ê•*Ž=êü…Ke¾yw┿ß)éÇüðáCûöí‰hÈ!ƒ ’÷Q×^øM~Hïõó‡®Uœœÿ=ú›’œXï‹&¥t3Îú¬Y÷øÉS‡Ó諯æÍ™¡¥|“T¯4 E÷>â;búµ5ªVòéòõݺuŸí©œšÚ¥q“óËWeÆÆµ7šoi‰? ZÄ9´á›¡c3Di‹²•)nÛ¼ÞÚ|Š•uÿî›=!'3ƒˆr²³_=»W¥z]'çÄøè˜¨ˆí}H&•×8=¸wìÔ9ú¼ÃäçæÚ¿û§Ñ³2ÄŠF™Löðñ“Þß ¢õk׸º8¶kÓÚÜÜ<;;ûæõIÛv6—É®X[ñ""[n\ëU ôè¡}ýú´µwÂ. †þæÎµóû ”ÿš9ÒÊÛÁÐ ØÌ,âþÃÚm[U©^   ã„RÊÑ>¹PÆÜÂâ‹&-e’\CL7)gÁ†f¿ÊÊÎîÖ¥Sw¥I6ÖÖ­½Û5iÑœÏçóù|dœÈ8¡t24•-?Ï€oNÉÐ' 4ŸoáY·v`•Ï›[ZZXZZü;'2N£ÄáǓɤe—q~þ1â 1<—È2á©èÈ8áÓŒ“gV¥Z'÷ï¸W¨Äã•Éva4_1Ã…‡¿¯P©ªTªßÖpˆËåŠE©œ’Ëå`ï@Æi,ø–Ýz}söäïKfMJu}¤ÓÍÍãÀî@Í}xò‘•íéíûV¯¾¿«×4™ssëXæ…ÔÔ… Ú·k§££cÞªÕXç1»wn¯v(Eµpõßo<ªâV­é÷ŽíïÿðvÀÜù%%%µ­âɇbbb233ƒƒƒ}|žçç;U•ʯw*S“%6¶Âvа,éf§<¯8-êwXE£xÍœ±1éõÝ›?ñöòTß­±|¡‘ûöP·ÙûùþЈHJ©¬»v/((ì;`paáO«TPPØàÂÂGObgÊî!vÝÞìéâ:ñÊÕkê÷øü…ÁÝ{ô0hè¦Í[jü CM"‘X˜›øÏº~ý†ⓦ>rTýèÝ»÷ öôö¡¶rŸ9{ÎÑy\·7{±sؽwc^ÝĹ:~íÏ÷ïõʼn/O¿{÷ÞšÄoŸÓ=yt†×,éS/}÷ÍÅoÏÛtŽeöíÓ'84"--]•_ë8 rëúÕØè¥ö#ìT7lÚ|ùò•#‡|ŸúµL&[¶bUó&'';88dgg !.\¸’’bggçïïÿ|¯\G(óï(÷-Pf^”÷•ÚÏUf^TŠŠ*¡ÓüFÞ'Ǽ¼üKiiBˆoS¿+,(íøßï®ÕX¾Åa¡ŸïÿË‘cÇ…‡Ûà`dx(¥ÔL-[š혲{zÊ®Ý{\ǹ˜™ýÏ9DS¿»¸Ï®¾Ourµ(,Bý/**>æôñ£‡þñý¥g®+7/oýƤ·ßî%„ðóõY›¸A¡P¨JHÜà>ÍíéíCmå\4oÎì¥ÿcoÊŽôô2àÕMœ‡ ±07omazèð‘›:~dð 2™ÌÄÄdá‚yçÏSÇ27­_geeÞ³ÏÛáöK£—=ylæIç¿þfgÊ®„ø_÷O{ö}¾8<ôõ×Û-ü(ðäÉ/j[ENNÎû￟••µdÉ™Lû"/þÑ}QQª%#O*õœá¾1i‹bSÒ'3==¤RiÝåÓ××KLˆ_±rMܪ5+WÅ'&ÄëééQJå1mꎔ]•••BˆÊÊÊ”Ý{g¸O¯ÖfidDÛ¶m ½<=._ù5þõÈѰEAæ­Z™·j¶(¨¶å«R÷{ÇvûŽQ‘BˆáC‡9zLq+3ó̹sîÓÜžž·¶rË d~yŸ—oiùÆòØ(Æ4”æ÷[õÜÜÜíÛ«nwhß.77¯Æf—ÒÒ–Å­º|åjYY™Bý •™šš- Z¨T*32nmùt›ÿœyÉÛ¶VkvãÆÍˆÈ¨äm[ŒŒTSîßÿe¤“³ºAmkqssB„„„ 4H1}úôŽ;>÷+¯Bª#q]"éÔ_qr…Bê¸P¸.{Šªf9øÞ{wÂÇ ‰‡½ríǤMëëS¾Ö'¸&$nX¼°µ…¥Ôd66»vérüo'ǹ8?ñ·>}z[Z¾Q­MË–fªªl*„xø0×ÊÒRu»•UmËW°,,|ôçä‘Q1;·&„ð›å·rµ‹ó˜øµ‰>^ž5|-²¶roLLX·~ãÇëMŒM"ÂBìG0àMœæææÙ99:vBdeç´jÕªÆf¾³ç††Ù jll\RRÒ£wÿú,\"‘ØØt^¾¨WßÕz˜›ëã7{e\¬••¥zbëÖÙ·§mÛ6Ï\²j/,„ðö~¡SvëèJ¼%#•ÿ<,ö !”¯w—Œ ”d‰ý[›ãà“éë»OøQpàÜ™¾~}ÊwõÚµ½Ÿïß´~Ýâ¥Q£FÚwª}OO)5Çôi¯Kçâü韓£—,®ÿ{üÎÝ»ª,sîÜyf{33So/Ïõ“TwG:دŽOX¹:>--}Uܲg©­Ü½zöØ’´A©Tž9{î£àЋÎ1 A4¿OÕǹŒY½ìanîÃÜÜ%Q1®c=Pajjr3ã–º™\.7Éôe²ìœœEaÏØÕ}0yê‘cÇ<|XUUuïÞÏËW¬~»W¯jmfúøÍòöêÛ§÷“§|øAphøí¬¬ÊÊÊú)`îüº“ÊòåËØ¡C‡xá y¹<#µ|ó{å)>r!×å)>å›ß“g¤*žu5ËÇëúÕÍòžYmzå+++›7?híšUNŽ#c–FúÌ{úËš”R£ j[\\¼=y§±‘Ñ[ov¯ç\®cc–ÅååççåçGÇÆ=³}QQÑ–­ŸÙtî¬þgÃÏ×;é“­þ~>úúz5nj+÷ì¹óoܸùøq¥R©TTU1 ¡4¿cœÍŸeçà$„p3zAà\Õt/Ï®ß/--U}ÖwÇNÛ¶m¼<==VÇ2ü}·ïØY\\ÒºµÅ°!C⫵IOÿ!=ý‡A!ª»ªµøxÍ”ˆ-“§ºÿòËkëNþ¾5üXUGGW^^&30Tí¥œœœþ'Z•—éêÖ« †ÞŸ–mð’HÓ…®ºB‘Ÿ'~<¦TCßOË´k\ÖX¾°ÅK¦M2 ?!„ƒýˆÌÛYá‹—®XC)›Vµß’W;™Çô©¡á‘ŸmÙ\ÿΟ7'$,bðÐ&ÆÆîÓÝΞ;_÷z ôë»níš'*¥cÝ©Ó{'¨§TÛ>ÔVnÇ‘ö>~³oge[[wZ³zcŠdï–x™¡áèwÝJ‹køE cÓ’çºêÃÇk_ÿ–¤¥§{îïêï¨Uüººƒ‡å<¾øQ#]OUÓÆ¹®º6ÕTsKÙ(×UoªRÞ¼™áîé}ö«SÏ5×L?×±ÎãÆºhý¨§³'~×íÐÎͣƠšr?'s¦ß¼³__`/ qp•Ë—ËÈì5'— ϸêRYQ!§¯(%Ô¢b–øûUTÈ£—Å9Žr¨ÿŒ …bϾý™·o»8a ‰óU¡T(5íh(¥æk×ÎÊ~Ôèr¹|¤ƒ}àÜ€úÏhó»·ÚYY­[»æÉ“m1 y$Ί²zJËÈË©©¶”²L Ïéè>mªû´©/0ã˸ .à¥'NÕ—;OH¦§´5¥”hVâBhåz^qÔ”RИ¤tHœ q$N8@âHœ q€Ä 8@âHœ q€Ä 8@≠q€Ä '@≠q€Ä '@â‰$N€Ä 'Hœ‰$N€Ä 'Hœ‰$N8'HœxåèJ¥R!ĉÉôh1ÕÖš&qš·yÃĬe~¶ôh1ó¶–t€&KœÝ{ö»œ–zx×…BAw€ö‘J¥¯Y´y³÷;t€¦òâm¶Y endstream endobj 38 0 obj << /Font << /F22 6 0 R /F18 5 0 R >> /XObject << /Im3 31 0 R /Im4 37 0 R >> /ProcSet [ /PDF /Text /ImageC ] >> endobj 44 0 obj << /Length 1676 /Filter /FlateDecode >> stream xÚ½XM“œ6½ï¯à¦jGFBBà›íÄ)»*•¤¼99>hA³KÌ  0»q~}ºõÁfÖcgË'„$Zݯûu·xyuñì5Í#JI!‹®vQ^!ŠH IŠTDWUô>¾ºÕ›mʲøÅ»Wo6[&ã7ø.㲩u»ÁàÖëÞ=ulKœ¿Õ•›¹¯‡Û͇«·Ï^§|zÜV&D´eœ¤©tÇ™Rí›»úß­ê˺Þlåñ{sjÓöœ¹Î[ÊHšð¹”Wf¿W­?¾©[o‚—ãôW^S*ñ’2'iÛëîNwk'óœTÂvã`ÜýÁ‚¤Ëz÷É4Qâìû^9œFýþLDâw˸ÒïÔ±Ü{ÀwÜÐÀ:Êò¸T[»5ýBè*Ú^_k^î½»=˜nX3.ÍHFÓUãò5;Ã>‡`÷M¬ËÀºÑ´,¾Û«æ¨§‘$cA8(INZä•tqo‘Y3‡æ„ yÊœŽùÜsÇ!x†òF½+Z3ÐZ°,èbãœ4æfMm!HšjÀpšdÁœ7;wjkœš¿z&­û&DSwlÛº½¹\Ø~‚ìyì}¹SuÓOØ=LÝu&ĸî{u³Ê´q=ÝJÓ¶ºD–>wÜ/ͱ©Ú|aÙ-¡qÒ‹žªv¸…¼zþߌETFŸ¥´ ,ÙÓùfK)ñún“ÒX7hŒñ/ªÅù#Ðm ÊólÌ‘’za„zqï̱+µñºnt‹d††$tf0ç¢Í¥phË€6ÆG ,ì¾2ÛyÄG¥«o•ßçJ:Ïæ˜Q«XS ç5fÄM^Ę×Ô†ö'Éâ3Wï3®Ì+Ø~¬½öÔ±€X¥JÓ0õ¤l=êÕõ ÄÓ„Èì3š{Íæ²B|Pת×!í+Oë~/6=ÕMíbÜo:pJ÷²œÛ“U48#¢ ßÂøÊ §àÈ Õa<¤x@0Þ3>—SÍyBGe§Õ Ýr—¸úð"’›NnQ*„”õ·]ÙufïFÊ=\cÐÕ*¸!|ÑãâËi< ¯ïQÖ€³‹GBÑ"& ®{f±+bÂÆF•{ àáX¹‡CÊÁÓ•RÕ C À% ¬]¢íÔ®N|eOôA§ï; &§ò´åU;÷·¾—n4±zÝŶi.»M׌j‹:|^ë¦:MÝ´Ö úÚ݃,aÌÇE&Õÿ,®I§z'½ýìkB…zÊ”ðhH³œ(²OÒ *¿»6•núÇú‰ü‹A=¬ølQ‘Æ RÓìƒ}è&š~ážNï  ÞŽ×£ý*Ø\Çrþôù# ž($))Ò4½;7dI#fhó¤pàñ$Ÿ•P;oK(,Œ%tºÏÖnmg€U­ðökwÝ×meðœ{Hþ–\™ /æäã3¿cBJ>ˆþŽ”  cš<‰—PM¼—îj}v–§É‚Lú<Æä,·»yt.Œ…úa·´÷n]õ½ï@jØWùf!~JŸ“^›5Ëë€r¸üT$$Ù〠[&€.~øpN@„²2!C’õ`OvSnÆ¿J_Ef{6ÝšeW–.ÿg¨ðœH¸?¢,&}GPïÍc±’žŸ<Á¼ƒ®VÂÔ‹ßÖ+?M@$¿…Q­>»wÿ‚¾˜œÆ ζ¯+?ßjÛb2ÙØúúÑÆ&4RÜþ«És_}Šà²ÿ†g½ñ endstream endobj 43 0 obj << /Type /Page /Contents 44 0 R /Resources 42 0 R /MediaBox [0 0 595.276 841.89] /Parent 35 0 R >> endobj 42 0 obj << /Font << /F18 5 0 R /F34 8 0 R /F22 6 0 R /F30 7 0 R /F17 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 47 0 obj << /Length 1417 /Filter /FlateDecode >> stream xÚ­XM“Û6 ½ûWhz©=S3â·´·î4™izi'¾%9°mkªW’w“þú"%[^Ù»¶s²¢ˆ‡÷ÜÇÕìÝ”’XJ¬ÖAÁE ¥&1—Á* >Ï¿„T/¾®>ÂZq¼#NƒÐ­ªSäOÙ¤ÈÝb/Vš(=,~X,—ó¬Lò}j›Å’35/ª2k«¿ž½_Íþár@0Å —PE„†¤˜}þ)¼ü„„ÇQðÜ--N$eð”ŸfÍ1À1¦‰G˜»qw0L™âƒž'U¹`Ѽ5YÙ8K»µnMcë§líþ^WþÁä¦.ÏÖˆÙ%ÕšK&ˆã[¸}I •”0šs¢™¼LŠé˜šŸRX[I¦œçv[[“6çD¥@w|$*葨Œêó¢ò0"QÌ߆üQ9e@©CDE¨ŒFNTÝ‹Š¯:QñÕ ê‚ÎkgêtÅǼ˜Ö–1FbHo§mt¶»Ú®sûÍÖ€u’dÃÖò¸r4ïLÝtu#¤ÏJ!Сȭ3&&ÏmêíP4èÆÖ¶Lló“[ñ%”a¶v+²ÖÙì·¬ixC½­œÝìvùwoÚz{à ñKpI!x¡ayÓÕàH¸¡vuÕVI…Úf“|q1~ÒiƲc¥úZÖ¸芑2LßZ\þ}FHˆé"I”·hÞf…-Ìî­U%Ÿ€R(§Qºïtnüm È¼)5­_•î×ô¿umº¸zsêjÛÖ¦½Ï·óÖîé9k·þ ÷“WSƒqéô÷€GúYâˆL*¨CÈ+Gèë¹p‘µµM‘)¢( T¨ »¯%rø dÝNaH}šÒæg´1´cõöä[éû2i³j8c*Ï4œÖžIiÖìrƒ§Òwg0~?äÁÓ=øråùîc(Ã…òlC,PC…6D*[€LÎÿÄò‚½hW !†ØîUÚ}¹êÏÄû°;8s‡.ëOv“úEÕº?IÄ'•6ZVئ1Û{ÌðÎlÆ*?*äð.³ŽúúÝ%°Ÿl™ž m¬K5èo6?ûüyZHè×ùÞ]û[™÷³nû©¥Ýöµ}\ÏñÖÔÑ”vçÁõ…{)¨ÇìEPg}P€¦ÇUm,ÔJ}ˆB©vX.¥É{\*HiE¸Cb6>Åø8›œq۵¡ãªǹ<¯ðÅsVnüÄ×Öû¤Ý×öab>e!‰`BÀ…¾s¡ãP =G†™‰MBÁ•º´IøN{~Ê…¨ã@P8 І l#/ÁGPÌñò ‡øÇŽM½Ù¾2š‰1PÖ Ùõî§©cЗîä -ïÛ„ÇŒÀ%ãJ.Çgc8VÁVŠÄ°×qã:¯âmŽO’'‚kÖ‰c(I_®ÿô•«ç¥)ìyE¯†2M£àwJ×.É;µà1Ði¦ñ¡1_Pâ6¿§õĉ|ì÷ ôzázýy®†1M¡ŒÔ:(¸" úƒtP®H‡³ä‚·ù=½`†D@gùõ‡¦šçpiº ÀÕ¦ÉÓ‚]£@ÅxôÓ° }‘”ýÐÇýК-ç¿ã¼ŽFÀÖàQëìÝL¦û릞œÑßÙIÜê®±Àaêõùòד ¥Yº; üfîh±›~JHpDè.s©õEå×2?ittkr5§Ð$ ³ñ>Ó^üÞ$ˆi{h˜ªÑLÓd›²7Œ’¥°â°5Á+„‚a¦û$^5º”ý?®Ü%ñ4|:„¯1ü.ú€Ñ¸kKª$Dí{ û„þ¬»˜ endstream endobj 46 0 obj << /Type /Page /Contents 47 0 R /Resources 45 0 R /MediaBox [0 0 595.276 841.89] /Parent 35 0 R >> endobj 45 0 obj << /Font << /F30 7 0 R /F34 8 0 R /F18 5 0 R /F22 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 50 0 obj << /Length 1990 /Filter /FlateDecode >> stream xÚ­ZKÛ6¾ï¯ÐCl ËrH§¢´I´È"—$w×I 8Þdí4H}‡¤d›Zš¶$"@¤•©ù8ó çAêë4œþA#”eEc´cÚAsûùêí{ÞÜÑÏΤ³Í÷0ôsã 3Æ¿·n^_ý}õõ± DÆ–dÐpÅ”ÒeÁÈ2žÞ\ýòLª€9¤YÜ|hM4’0ǤqÍÍ]óvöbµ¹›¿¿y~õûÍ®Tš¡Óæ¾×_1K¿O³¡`Õ4Ò2ÁÝP‚Mlˆ†iÔQ‚¡цü±÷ÄUuÈŒ„ô¯¹0³ûÕÆ_vO o9^–qÞúB2©U%ë ºÒ›ÁP°~P§H“‚Þ¬>/ FŒ›7˜_­“ŒÎ-ͧ’Í!.Á ¾(ؼ¦ÕŒûHuŒùfnÅl±þ–³; E4Kã%ã(Kà’!ˆ½É2Ø,³.…>¿Ê†*çJŠi©F;É´Ñu'_«>X@ž&¼¨‚)h‘qΜµaü™ðvãŠõßqÀûEðáJçÙRfZbÔ†¼UB%Æm 9ÁªÀxP+RÀ"ÛÀ¤¶gãêEl[)ö?ókŸMãÿëíƒ5ÏS¦¥˜F»–äþ¦í:Fž` ,Ð^”´—TQ' %ê9Ù‚«0¾a/`˜€ž¾ÛÝÃjó±Àø`¥ól V“WŽ’•GyL´€.0^”š*½ ŒçìÎ=FŸ °ç 'ßážÃcäÛûoç²ùpµs|YæÔ´ŽEKÅ„³•8—1ì#˜çU@mK@ œÓÚFŸ‰®,rÁ8ÉH·«ÿ ÕúpóTq7­EÒà˜ÂJ-’1æýmî* ˜"}ý%¤ÓåíjQʨƒñó†8­UÒ\1]«Žâqí3¸‚ík`RiRÄa¡=,K.?9o0Óú´ŽS­®˜‘ º¸ãž@aK¦¨#C:•¢þ±Ø~:móá¸yƒ¡žÖ2 QÌ ¨ctW^4za'¦¨C¦¸MQ_¼¼/”oÃqó3bHÁæNoÍÝ/Ouí£Vf~ pöj7“úúòæZjRÚÊå·ùµDœmühºÓ³Õ6>¹ËÝò.þÝnWÜÇQ»¹°³ïóØßøŸ¿,vÛŸé^ËÙîÓ2>¤ŽW=lwñ1‡YûGì–¾J#ÛWt[:?¡‘Ûø`½Ü|Ü}Š£î7ñª:!$ãÇnÃ,ÀS57Ÿ½¦- AÓ!by{¿ñZÑÛÉ<è·Ã X‡A«Ýv¹þŸÓ‚QÓ]p°†)ç¹ Píœ3ÖWœYò\ÞuˆQ-Ë89&„iU>-MR…È-ÏNˆ…sÛålõS"Ô5)«´ùø©Ÿ}fòè(uÀXÜÇuŸ£ewŒ›ÙH¾NÀѺ’•Ž+>E„r—`n2˜ÔxråF`æ9ÒÊL$ZSw¡Ñ˜”ÝNJ¾•Þ3=¸Ç´Fæ¨fO€÷€Vß;Ž<.«”.ZV¾ùæGDõeëÐqón+¡àA5t‘‚23éèB'DÑåÆÇÏݶàQƒçsÍ,C<*ŸdÙ×}H2ªM2/WÛÝ…IƘÙzrÝ…$C×$Éøç‡$c|7M|÷–j쓌ãm¤¦‡‡$ÓŽˆwId÷ºñ~OZü½oÑ}H.tÝûmlöxÖ…¬²”I/‡¬ÒËn²Êr½ü¼Œ:RÌ¿Vg7Ýo!›.j/¿.(å=,ã}bC/gµ^Ç_î–m·ÔÍ+¨%¯Ú©yóþðãì,›‡ÀpÆ© ‘…-/öTT>1 WžöB¨êtÓÂMKĆ¥¢œ('"êÜűÀ½ð$*²7wh…šin*aRq.úÊþš‹]”° ¨”TG:LAc¹’Ø1µ`-  xuNW%òÓRs) ßMtkÿñ¨Jn­%Õ¶œu;·Üs1 BËøPžpî*ÈZ0´*E>Šv1Zýw¯1½»O£ìîU`½_q<©ý¶USXƒç‘w^²òU‚7#—öP%`[%¼™;µ?‰!·ç©Û3E !Ö zRjreÝú­Ü¶ˆûóÔ–»ï±•3íùo¹¢&?BeNìl!¾“bbEmãVЕŠÁî|ðDÊ’Tl)1¸çcŠºGr”8·žÐ2A ×ÕŠ êrÐ\Ç"žš£‰jݲŒ ¸FrÂᇑ=®‘ ‘»ÁW‹Ýê_*ØùíÎßàLBýqS9ÁþñTxýq ½Ö™š8Е€® ìÍáËiìõB§ ÿa—®-8ù‚“E‹q¸'Üå·,ª`v±âÓžö–Á˜9Š9=‘fë?Á:‘,Rà ‘BËó㦒§>™J‰úq ùH‘€"ÅpÐ> endobj 48 0 obj << /Font << /F34 8 0 R /F18 5 0 R /F22 6 0 R /F27 23 0 R /F30 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 53 0 obj << /Length 1427 /Filter /FlateDecode >> stream xÚ½šOÛ6ÅïþzÙ†Cr†ä©À д(PÄ·4—ÆnbÀñ¢Ym¿}Ÿä?eŠ®(¡·EV™9óæiHíÓzõúÕ ‘ŠÌ¦YÿÑ„¨œug¯¢åf½iÞ?ü¦É?~X¿}ý†BÿYü,5úôÔ»ã×ÝáSûÜê‡õêÏUû „nŒõŠ!Sl|óñËêýÝlðË·V6†æ¯îÑ/ ¹–nñó¾y·ú5DG‚)ÁãN9'çOÝ]ÝÆ‰í 7ùôÏqû’Y}åL-7Í—‰¦û —n™Vã÷&,µÖ–2]†)AiW`ÔµÏôNicRè!Ercðм2¤ã¾¼$²ÒÖÏ•—UŒ¾•õt§;Núªçõ•€í¸¾ZÒÊhI¡ûíáÓñóã+kîÁúä©HHæê‡œÁœÔ¡/.Ä4®ÛʽÜêÖsL÷ò2®ÛéМä\4LÑíÓ¨m‹xåt˜bÛOϯŒxÞg´é­"ÍXA©\i‰>(ÛÅ¼Ùæ%†!%>Îì,•F‹¥ÉÛ«îÑ*î@ãâ£O¹91Âk¥m¬E †Öeî” µ— h¾J.Ì+´È‹g:EŒDâßHÂE©9‘^ê\‡©së u®ƒLF¨M¡¿ê<š/’”c =î9Œ¦´v’çüxx„åÅ{»  Ïónˤò†_G÷Ÿ<§’›×bÂ-xÎ2гç$Ð0®ÅéÐ|•Í+4å…*´±JÇxQjV¥—B×qG Ýçr¡ÐuÐ[Óa@Ý =š¯‹,b:.Â,§O¿Þï·ÛMÆt$*:sñ ܬ/1c›{„è¿ † ŽÊ¦ƒ^Õ¨n%x Fœ]t·‹8;t´S«T@ó3:Ì˺…žeî½€çî ©å®l®™¯ƒd¾—Bæ'CóY³b'd¾Ð‘Ú¨h픎üi‡ÔæÚ6ІÂLW|»æÏÙWÃ9{ˆË-ÓŽV®Êíh¼ µØÛ«ï}ŠÍ5#Ht 4Ÿ¯V†³rî d57åNÅvk€EWÖË9åUÔ‘Œ÷±¾ñ©Ì|²HhBÂÇ{ЂdR®ƒyøºÝfºÐ´ s¨rR¾ŸZÊÞ«]bÀphö¡ÐEÎtó„“rA&p®îÕ¼V%Sî.Ïàýá—ZF”xÚ¾„¬v AP?Øéw·ÐÖì­¯ÙiN¡ûÔ0O`x+š¹'=K Ä ´ÏÍ¿Î÷ÆE^UØuõ±¡ ®%˜,Œó ó›Ó}íát!¸›5;±-îvàÁžÒ5üò¼Ùž–ñóîåXÞÔä%£#ÕéŽð‚À+ª1í— .ο8ШèM!E À4sx%¼%È‹Š”Ý‘Dyеà–ÚÁIJÀÙ›Œ’¼4´ç?ŸBO_ƾ7XQAtïV•“»ó½Ç…va9"u”î"Ð!&€E zd=JÎã}{'мÂ[Ìk“ОVÂÌ6a£ ŽM„ùÒkê»?ÄÉ Ä“FNÄóm.”¯1ö¹˜´pÞ) ðÚ»uÙ´¼P¢O³ñ´ÑÕ êv1X’&¼A5})ôî©k¯JÙÏHÝ>—:€ïÐÅ É\Dk±l"·0¯„©·2“¯SÌözßöy·ß¤ïò¡Dôâ½_mhò~óBåã6d<^9„…XƼZpƒÆ:Í8Wµü XYç endstream endobj 52 0 obj << /Type /Page /Contents 53 0 R /Resources 51 0 R /MediaBox [0 0 595.276 841.89] /Parent 35 0 R >> endobj 51 0 obj << /Font << /F30 7 0 R /F18 5 0 R /F34 8 0 R /F27 23 0 R >> /ProcSet [ /PDF /Text ] >> endobj 56 0 obj << /Length 1765 /Filter /FlateDecode >> stream xÚ½[Ýo7 Ï_qÀ^ìVEŠúÚËд)†¡04ØK×·ñš`NÜÅ.Úþ÷£|ö]trÏö”ä¬ãâ¤HZ¹¼¾xö \ ¼ÖX]ÿ]FWV[á•®®oª·³ëÛ»í|¡ÐÌ>læ ´³›»‡á-×ëÍœ~™Ãl[?Úmêµÿ„ç«Õ§ú¯Ýíªþx{»|ä×ÅüÝõ¯•¬à¡k€æg«fåÌÌV_—÷ŸÖ«ŸÂ«Ï^):VÜ*áPU ôB9_‹{¾ÇX¼f$ˆLýɳF„ìí…’Ä:í—<ÄPàiÓv9_€&š½øà^6pWá‹«ë‹/€¥°ì A k+VXS}¸¿xûNV7ü[Z(ïª/û…÷x+¤ ¯­«7DDH%tJ¯®µªE\gê«Ì­¥ Ìò†”ß77«mDum9]Ø  ƒ}à?—ëÏìYôlÇÞº©ýÀê<ÕF i£´Ò@_›ßVˇàØO  $g@GHDá!פðX92´3­;o+_L—qù4»¡÷Bóf´—ÂÖL¸qú‹€*ㄲºÚeºQþ³Œv°»´>; ‚ØŸ³¸›,#Å՜ܚC'¸+B—“Iô‡ú4zhާX6ëH̱ÞT:D&BûLû+È Ú„„@µ)äx"/‚Ùr~Œ Î `*®|Pù>æzõðqw[óþ2A÷Tü¸ÙT:d5 t&Á6¡Ê ÙÉ2¢ôqéXË´®­^ÆÙËлc ÈÞy ¤ó8@+ŒÏ<ò&ËH…‡¯T8¶ %@×_qZ·¡-¸½[ß$Â(Çxû“Ï<ú¸Bwš ¥M®ÉÁ¹ÑÖ‘^´%ýhGz Ð8-š>èqâ¼J0>Y¸åŒÎ [òl™¶ÓeDd!†}KxKM]3˜£xKB©Í£Ì;¿È)á¹èÊÒc²ŒD‘ãMys2wmsçô{sg–ñö·&¯å#ã¹{uer'Y%H7A€ã¹³ hKú1h"w ¹SêƒçÎË㓈YÎ ™aË ŒÍ ÛÉ2Fr§’A˜g'í†tã f(Þ‘Phóìy$ˆ&OÉ2RaDÄž=º%0[Gy`ö3çãê!J…¬'Ñæ±ˆZdÎË&‹Hq¨$g:}þÀ쎿cÌnÔR“) –±œvG ïH)§Çd) A cNwE@;AB‚Ããì™C3噇BC3’R¸v˜¤Æ+˜"˜-åǘ ÊK`†ú…ö1ë—ãtOÆ› }^È*‡BfNަË)_ùSÎÕŽÍ^$øËP¼ã ÈæA¸Ì±™2\ûLg˜,#DÊò³ï›móæô{[¿,ãì¯2ÇfJ£°¥Æf!±Èv˜D‰ÄY´%ý4•9K€0…ƒ§Îç Æ'+·œÎ›):®Ì°,c$wJÃD(L;6{ž`0CñŽ„B›‡Ì±™B%\zlsZÉ2Ra„¼)oOö~E@ÛÞo:¡ù+e?còZxö%6‹ÍÓc²ŒA/ §y,ÚÇ ƒÞ$2¦j'IDOÂ[ÈÒcºŒ‰ágŠu -‰E@[{ Õ8‰YÆ;Øß¦çqÃB¦¾¹Õ»¢çüþö†ªˆ_üK‚­ïê nNrõ« ½Î÷Ër{²Înù~¹ä¹?5\æp㢓®F(rýÔÕ:!€ʻ¤ C¼#D-<5ùóòÛ.v» ÛEûsv³šlúÀ‘¢ œe;Ø2 ÁK<ê>h¬¼ WÎ7ñÔ†otìIPFH€2 !ú“ aV£e!P2¼4'A9G’th< (3”¤ÖøÌP’n?ºÄ0„’xHcÉ  §óÀGÂéÜ'©¨Wi°ãæš—\!>ÞEoý¶ñUB äN†`D‹õê¾Ñd›ˆ¸jp3'<7rQ5î?í‚ßê?ßÞ—¦õMùÝ6•%£!v ØýòkL—úYÓ†ŽÇídµâ!§Ó2†q;~RƒåÒÍ┓úõæcì"=‡0×w@š{‚dRÇKYÿX)ØQÀõdfRA$†Q,Œ=¢ý†xä|Æpu‘½æLàATqvr\Ãõ€c˜\øÒ Ë€îûwO}П#ñÁΣ´>4N“<ñøi®! m)“kÅop-j2+]ÊO[¦Ïƒ2m„ãüЃ™ ºÈf½Zù>ê«õf¹‹Å®"Ýcÿ4ã¹oÔíŠ7»Çî߇^ßmw š¼™8û|Oq¡hËÂrÿ׿1èZ¥ÿ¬ï-ï endstream endobj 55 0 obj << /Type /Page /Contents 56 0 R /Resources 54 0 R /MediaBox [0 0 595.276 841.89] /Parent 57 0 R >> endobj 54 0 obj << /Font << /F18 5 0 R /F34 8 0 R /F30 7 0 R >> /ProcSet [ /PDF /Text ] >> endobj 60 0 obj << /Length 2248 /Filter /FlateDecode >> stream xÚíZËrã6Ýë+¸”ªFpñ^¥ÒyLUWM’Ž]3‹®,YÝÖ„²Yé®Î×ç^’-™Þyc“G ÎÅ}á€Ò›ëÉW?4B0¯54× Õ–y©›ë›æýT1ÉÌl.èé·ÛÍfqw3ûõúíW?H•?Æ›9ÆöO}·Z¶‹ÝŠFN¾¿žü98‚7¢É7ª±Â0#}³ÜLÞÿÊ›üðmÙô®ùÜ Ý4Â(¦„Äë¶¹š¼«MÂѯNM‚ÃqeÂohÁ¥å ãJàd†Ip½ýo¾ìW÷ë-0kÝ¥ÄÂÄÖ1«MI,*¤ž3íì8¤'±Æ–¤ðT ÇFZ§”£å]§Ô’ #‘ZÁøÁ2¿®pzœÇ^âÛz6Z¯Ÿ—ÒÆY&ô8m¼`Ê©~ñÿ]´­Žgôe¼õ„.xùñ„…Ó¦Éo9ç~ññXFÁ)Aõ>Ë9_÷±žÓ£Ðj Ö—´÷ûÝúîãñÄ>›¸–’mçäu%)q_1ã.Âqµªù ¥nŒL:w’,ãÕRŠs€aVÉgÖ’ÆXKÙIýÄžÞ(0öRÞü¶8À•¼µ¦É=ÊÅ1H%p¦ôimsheõ(¤X"Îê’´Öª­fÖ]Özjh¥ž—^¸çýHé…rðÿÉVÒë2Þ#é•óžJ¯1H¥Ð hÈIë½:&Ø(´J2E}3§ý4ÓjZ÷sJ´³ÉëIbÏH³zãÔgLh>Õ jvŽCaBž¤thš4µÌŽshÑyÿy™m±¬Î¥™s²oJÁ™Á}áBÞÃ$ÃÒF%W×2S G"•ž®KÒZãÔý©ç|Òz”ÀËçE•¢QnœH+샓-,Eú2Þ#‘ΉOEzR‰°` Òz‹±>›¶'¥ü±~Oöx~W&5n™Ô.žìU8׳[Τ˜Þ®÷«åþ¯þØ~¸p<àãÒ„%_ß®ïgsܦñÿþvE~ºÀÙÀe³uèöC˜Õæ³ œÓh‹³w³þ´\lÚ™óÓOë¿kF`y)¥ãh6›+á§ÿ»]Ýõ&,zª?vÛ»ÅLL7ý}´p³½[ï·»ÕÍ¿ðÞ…ánz¿Ú}š®vå‚–»ÕbOƒÑf.ðÐ"0óª^}£ˆ%ù=Çm-8@ëéoë»ÅîKÞ,ö‹ÝÞÃÌônµ'?}&îíî÷ðé¶½Þß÷À²]ãòpÈþ¾[¯˜~¿XÒýmñ9ú¿¿ÿ¼nÛ@½ZÒd/ú9Wa™Á´`&­Ž—Ëê–`¦ô¶/,ž3¶IÂp›þjݶ wd2Ýv˺ëoh®ß÷++$æ¶ëÃk<ëåÜ÷ôá4–›éŠèÏ&ŠJÑ Úmñ+A–Ï̳‡x‡î>6ýÅ/ÿNãæÑŽù`H¥î¬ G˜”8äD@KÅ5§cSðä·Cô_?žŽÈpüK†¦4v.““‘€Û;¸f3AÄ”5 j'h/ <î% £  »èZeЪ`c±XüÍr!:½;Ô=mB0.Àëf˜Øa½‚ÁÆ—è²ÌÌL`;Áœ%­ ùÃs к#â%8ã&‹Û Ëhââzm9¹|x~2XìÆ8쇡™þÜõœÍÓ‚üyò¾¡6ŽÃþ?¼ùÏk€G ðºUôî/0Àt°å Åpý‹!qж“„µ”2 ­v†±æ TgˆÇâ¨ÿZFÂpeRsßÍ1G¯\é sšý¤ñhE¯è¢ ZfÆ&Cf^äÏvATÞ’ÌÑïÀdo›ƒqY‰ ®ü¡ÏF*Úô‘™î€5lýaÛ?]A¯±+–W]7êwš°åô7SK'«Â#ô\¯™äô-O[ñë0àŽi­h”Äc°(!eì„êœA\5¡l7]%㸿7úKÕM— IØ2·9¡èk±]s—bˆgày„{Sh¾”Ñè6ãâ†èŠ÷F*zám tÅã£Ìø¥ä£uóш(•¥²‰º:*Ú~°2aóžÙ°JUÞ´èÄ'œÐÕ.FÐÓI¿«ol>‡°9:R£ïHÃK¥»ù"HÅI!›Œ"õŸÌ–¼y fgÝ }‰‘ÂŽ“?ŸÇ=Ð$(™“çG2<ÏaGrÃCŽTR|÷%M±}Î-OØ^ƒûRÁ%)‡;Wsý%Õ“Õ¨Ýp‰O æÏ°hI¡O’Õ…@Ö—)”Á5_Ž,A»:{–}ò Eù)Z”^i­äJDK½ÑBœÐ¥6®5V=èR±€DM µ,% õ!¡@@®YȃÊÌEK ՒÐB¶$4‹qâÉã,*•K0¾P.i™¹t‰þ¨ùsdi:DzñÍýÅÒô5Ø/l*¶·ñ­+~¨ð@i=}+2ìškiô´>²†Qjf¢é€E½{À5àÇF×ÑÇcë2Î&øÈØ*HlçÊ>®ú—Œô›<~wÔ}«M_õþ¼Ûîûï–—ÛöXÕ(è¡€ïŽ|-ûî|=*ºßfÙøsÙÿádø° endstream endobj 59 0 obj << /Type /Page /Contents 60 0 R /Resources 58 0 R /MediaBox [0 0 595.276 841.89] /Parent 57 0 R >> endobj 58 0 obj << /Font << /F22 6 0 R /F34 8 0 R /F18 5 0 R /F17 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 63 0 obj << /Length 491 /Filter /FlateDecode >> stream xÚ“ÁŽ›0†ïy Ž –CÝv#­*Uªr[åà°†xC05vÐîÓ×dÈ*J‘Ú hF¿ÿ™ùìùº]%”„%,¶uÀiÀ‡2cÁö%xÉZÙUrˆvÛ§ä‘!P2F'5ƒ‚eAL×@‹ùÀ3ÙEq^¦á“¨"þvþdœQn„1ªq}¼ÿ!)°Œ)züˆXŠ}ÛØãRÕŒ§ÅUüy²_‡¢›¥üVJ3È ½Jî_eeÕYú#¼Ä©]ò'i <#×Sª‹|ûVšZT‹Yÿ=~šçÉobÊ(² bRBN9¬í¿$É8޵ëàèŒ: p|ÓVÇ ˆ ^ûdеMÚ¡MZd»ÜhL  ©¯BsÈý/€î£tžéA(3AÖK¶ÔKsvÏo‘~ð1¢?¨jÀ¨U{#ÌJFe˜\ßG±Oic1Skƒ¢SD‹ÐµVõ­ÄŒv¶w³ìEžÕÇ“»G‹Ý-‘­üTúÚhÓ`éêÊ_wòoŒÅŒ1ûŒ› D_ï¬Þ—œséšþýRq`d#»–v¦šY4Æ¯Ž·Åè¬'Zõ.¬ÒâÚN¯rœ>‹\„57€°ŠûgV¾÷ «ÅU(§]ó+îc`Œ a“võ}»ú›¹ endstream endobj 62 0 obj << /Type /Page /Contents 63 0 R /Resources 61 0 R /MediaBox [0 0 595.276 841.89] /Parent 57 0 R >> endobj 61 0 obj << /Font << /F22 6 0 R /F18 5 0 R /F35 13 0 R /F17 4 0 R /F34 8 0 R >> /ProcSet [ /PDF /Text ] >> endobj 64 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] endobj 65 0 obj [416.3 421.4 508.8 453.8 482.6 468.9 563.7 334 405.1 509.3 291.7 856.5 584.5 470.7 491.4 434.1 441.3 461.2] endobj 66 0 obj [300 500 500 500 500 500 500 500 500 500 500 500 300 300 300 750 500 500 750 726.9 688.4 700 738.4 663.4 638.4 756.7 726.9 376.9 513.4 751.9 613.4 876.9 726.9 750 663.4 750 713.4 550 700 726.9 726.9 976.9 726.9 726.9 600 300 500 300 500 300 300 500 450 450 500 450 300 450 500 300 300 450 250 800 550 500 500 450 412.5 400 325 525 450 650 450 475 400] endobj 67 0 obj [514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6 514.6] endobj 68 0 obj [500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 761.9 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500] endobj 69 0 obj [875 312.5 437.5 437.5 562.5 875 312.5 375 312.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 562.5 312.5 312.5 342.6 875 531.3 531.3 875 849.5 799.8 812.5 862.3 738.4 707.2 884.3 879.6 419 581 880.8 675.9 1067.1 879.6 844.9 768.5 844.9 839.1 625 782.4 864.6 849.5 1162 849.5 849.5 687.5 312.5 581 312.5 562.5 312.5 312.5 546.9 625 500 625 513.3 343.7 562.5 625 312.5 343.7 593.8 312.5 937.5 625 562.5 625 593.8 459.5 443.8 437.5 625 593.8 812.5 593.8 593.8 500] endobj 70 0 obj [571.2 544 544 816 816 272 299.2 489.6 489.6 489.6 489.6 489.6 734 435.2 489.6 707.2 761.6 489.6 883.8 992.6 761.6 272 272 489.6 816 489.6 816 761.6 272 380.8 380.8 489.6 761.6 272 326.4 272 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6 462.4 462.4 761.6 734 693.4 707.2 747.8 666.2 639 768.3 734 353.2 503 761.2 611.8 897.2 734 761.6 666.2 761.6 720.6 544 707.2 734 734 1006 734 734 598.4 272 489.6 272 489.6 272 272 489.6 544 435.2 544 435.2 299.2 489.6 544 272 299.2 516.8 272 816 544 489.6 544 516.8 380.8 386.2 380.8 544 516.8 707.2 516.8 516.8 435.2] endobj 71 0 obj [786.1 829.2 741.7 712.5 851.4 813.9 405.6 566.7 843 683.3 988.9 813.9 844.4 741.7 844.4 800 611.1 786.1 813.9 813.9 1105.5 813.9 813.9 669.4 319.4 552.8 319.4 552.8 319.4 319.4 613.3 580 591.1 624.4 557.8 535.6 641.1 613.3 302.2 424.4 635.6 513.3 746.7 613.3 635.6 557.8 635.6 602.2 457.8 591.1 613.3 613.3 835.6 613.3 613.3 502.2] endobj 72 0 obj << /Length1 1592 /Length2 9765 /Length3 0 /Length 10658 /Filter /FlateDecode >> stream xÚ­—eTÎ’öqw Áwww× î ÜÝ!X°àîîî.ÁÝÝ=¸Càÿ½»7Ùݯï™/óëªêzžêž>g(H”UDLl€’¶6N ,Œ,¼1Q V #3…˜ÐÐÉÂÖFÜÐ È `ááaˆ8›X™,œ¼lì¼ì1[;w 3s'µÍ?I\k ƒ…±¡ @ÁÐÉh ÚÃØÐ  jkltrgˆXYTþ©p¨.@F€‰…±ÀhfaƒÀô"S[׿—Mœíþ;ätp‰PƒDÒ@Mlm¬Ü&@S&E[P/ HÉÿQÿ{sIg++ECë¶ÿ×”þOÜÐÚÂÊý¿2l­íœ€[ ƒÍÿNUþ[œ¨­Õÿi#ãdhea,bcf0ÿ{ÉÂQÒ h¢ládl05´rþkhcò¿%€Æö/LÒÒŸ>ÉÑý×yþ+¨lhaã¤æn÷ŸmÿÉþ³üaÐt,ÜÚÌŒÌÌ, DÐç¿¿éþ¯f6ƶ&6  ÁÁ 0tp0tGÝ q ¢¢¶nž  f`É ƒô«`öþ‰ÆÎ@§½º æ¿ÙÔôn@c„å[c¾ ¯IßJ|$ò¦J¡iÁEÍšbëºg;—bÁ­ Gäìi7j5žËR1Q ˆ]_ñÃÛ½>K^øÛÇ$Ï¿¸¤z´àk\§*¸ïÛ‘>ž¢¶5ÎÝžq€+ÍlŒ–Äkæd\žæ(S‹«®‘€õh»Ô÷¤qriH¦Z} ®¥d#QAK¶/ eYwE‹ÿµ>èó5®™nõʶÝã9.;îMÒdü‹ÁƒÜy¢;ò®ÖsÌØFŸnqø®s¶BŠfTÅ«‘öq:‹¶Õõ÷´9ªz'”ÊN»•ʹÌ|­'%8<öR©0Y.d‹ðÖŽ|’Ï`51U”¾“Më¹íæZŠ÷Dcy ærRï ¡|¿¶êgQ¢Z»ÉHd,”NQª¨ÓhÈßeÙä‚—£‚%~WÔû¦9ÆÔ }•,¨ 5íF#U&ŸßÿÆ ³Ñ°t6š°,8€À)`žc/þí’×^=ܲ»®T"MôÀ~—•z„_ô‘¿öäô¿o¼)—‰’àÄÚ"®úLu·;æŽÌd&'HIc+ÉŠ¯óY—\C=<ìÅ4o`Q¸®¬†jR‰ÅúI=D [þr•¢ˆÃ)ƒQ‰AW1 Q FmÒ—ý#þª ¥kO¼‹b…Æ@ðmæœØjÖæ2X¤)ò>bÚbn±CJ;K¦é¢?~Ë—]±œ´¸¡DŸ{öŸo¦— +zz¸Ég›`/ò(æ|¥¸LŽÓ†jÐ"ýu®Ë+ž­$˜ƒuÍøÃ›¢õ²|s)ËÔ/=½½vQf›N‘™9°"‹—ŸÙ¥Ù±~ï®eZIe ž§¢g«ùÃéçœN?æÜÒŒbIøµÙ|žœ¿p¨ìaHMt&'ð°g±dÄŠÜÉq¤ã¤BËÌ—eEiÛ9 ð¿ Cath´Çäö%"cór>¤±#Š›ïì6FZóULp`;ƒÂݱã÷‰ ÂNFq 4ÌØÂ’âµÆ§ÛÇb8Í n‰ÎÓ3™©hñ?¢± ú”+±~_Ê@q\%É\ýκà~FU^<È£Xø€FÖhp*afÎu|š¿GW|ãA%ì+¹< §dÃrw½Ñõ%MØã#'‘µùD>ý wXçKô±¥<åèÑ\ÅÃ`zâ÷ ÈqÒ2‰ž‡T­¨9)˜&£Ó(Ó®¯ÍÕ=è'ŒÄÇûÍÜ•¡˜wc½ÍµÄ/KˆÜËH‹>«ð¾ÂV^å,«â5=µU©Z”r£Ê<ïÀì®”oeµlÂ7‰â·«dоêÕôr›ßÊ{®ÇÀåĺyYþ]š†Rð®°­Ï .ª3ÙNu§V:díÆ‡µdðKÆgJVí݈ iB²ìn]ôì7Lj}273u!)Ú¦æÖÞ #é”+Zi:»¤[ëúaÕ项qºB©÷Ì%cU%õ篖NJ\:)ÑùÝ‚šªµ L†»KZ–”Á³Ø²VÎí«å„±u<ò!zR~;îêòÙWÕ¢ø5òýP+`Ø3-ý ’ PãCx/¾?¶C¨ð÷º¹±ÖÊÄUÍÊxÛÖ éói"zå!ŽSÞÖ®5\5S²©¦qZ›…\D-‚Nð­X[€¢øáÏÖîŠø_èh=írB&.åïJ-°àa÷¸ïydøÓo[%~& i¦9@Ôp'$_dÈzÓ…aŒBª¯¾£•¿£Sk~u µ Ì\2M–ÞX;šCŽÑÑhÂîCŒlU<¾hP'„a¿xÐ+Ó ÇH´ [(úîÈ!"Ö -“_æ˜Y±éÇç¤Ï(+ ¼Æ”š¨ð™^žOÓº Øp±XÚü®¨Ùñ¬¿f›;}#ÙŽ³·ÐF¯hŠ*40ÿrgýOÜbãC“¬Û§õf¶ QvlÈA ­§áŽÞhoEsí]–¡þ„vÁ¦CÇ=ÕÙSlž¢ŸífÝš×Y¯îiFgÞ#‰‘Zþºs× Ø†»D´ÂâËžÖZ˜:º"vÉu©Òã3›äÓþ¢<úócÍV’;5†ˆweê O¥·=+{銢IäRøw33¤j}3£×ÇÓ]Ó²¦3Jh>×qõ•Iµ H4—Cª„©æÄMÒZSê–­«L>ÔˆȇW6(ƒC¼Šq i%•D¢p؉J:ƒâ÷±kp,ëÊÎ!íŸúÔ¦dÐ8 ´Ãmý«¥Û‡·sÞ><ÃæM!sÛ¤ ›sK¬ÙqI°ÅæPª164øý'ñ©éŒ÷ ø2›oÜèðÞˆPJö§hƒ©JÔÌ1#Œ©„,Øç¦cGìºBô7rdÂ2ÖE‡i¸wÝR­Ë5±áJƒ­i¬ —x­ǬÊ]'GGó6€L‰$!‘s‰êlåÜó°s*‚Qiï±"iÔ‚ºu‡¦”àÈ( >žZÙæÂQ¤‰§ æQ©°k£Ø/òi¾~41»9äÎo#H;9 J†àÚöûN‹%¾ 'Ò•zø‚}B€Õ ô™®Ãl·7ãé&y¥çUz–|Cw¤Vl]”BVºÕ0œ©fýYpÚvÁ]õVÁ’Êí5+½:¸ÐUdóÉ›Ü×Ò1ƒöÂǾɈܲBv;\ˆ06ݬ4)u|"h#÷ãT5¥·ýЦD³IÅ—i0ÙSÚ͇Ó~bœÎÖŽ0TR=ƒE«çÞ"9 *±’Žác–òÂX•£ß¨ü·Û.ªx¯žûÅtÈ+ó‡Eç?9›Bº/ÿLïÄôøäe±¼ý‰eåZÇÂÁŒ”Bi?cS{òñ祖.¦]«ôªZ^½&äõ®´•À¦êÄ®<ÿ‘½94Bœ­(“zLó¯;$¯';£?ä*Ã'ð¡è! (¶ÎèÌ㣴ç- ­W £žá(]¼“†µ\Pó•‰RGˆÙŽD¼ø:‡‡bͽ>ÍÉúÅ.â÷(veÔ–¾‚®»i& ÊÌ ¸ZG)¿–Äs¾3 Ï¡sv°Ô|p-# Û4—vÚ6ÍšÕjdf/{6%ò¤ô{Ït1[ô ™Ú1oyæf¬,ãØ:&UЉ¸º–?’gä2²Ûv”†ÞÙU›³ìÙCø‹MËê¿Zr ÕK´¾ñõ«òÖÁݹ ñV”p-·ñ×úž‚Y€¤]·1‹¯í½¿u×·‰Õ[(ÁG¸çDª—–Yº£©éùÍÝ™s:t"ëªi$üPÖ”K¹;Ig/fÃÁ“ê«m. £@¤E£˜Q}l¸j¸zÞænÊ6öæ2nÜmu®D>!Û%r“\dýåv*;í†L~ Ùqðˆp&ÊZÓsën©^U¼iæø’60SA5–£¼xU7Ú<ÈF¡m„—ú@pfB@gúæN¡ ìášuˆ­¥{å)¹\£ \5B‰í1g°¨–X{Šñå^;Ý_‹B˜œ®ÑúˆÂ±#‹ñtÏï‡tÍ›+ÓšY.P!R=Rtdá³k·M±Ÿð›‡S+¹…gl·3ªy= ðÌ¡i6(E©*7j]™½miÙà¤#tÁÁBÜ®w„‡jˆ¾öq§à*Ë=úxóÜl>@˜ò *É"oÛê7¨ïs–ùqH[^à*5~ÃýÏ)XKËgì*0\óÓ Õ=ÑŠÚôRD¸~ŸΗJ]lP]¾^§™ …ßßN|³S•š¯}´õ…M³Zo1Ì´Rb,ÇÊ0P9'DýžÏ&$Ôâ‰ÏÀÈ~d³×ŠŸ}®ÞyZVÅ€bФùÞøn*:’ôT‰©ÀÕOŠö­‹Ö™Þ´šïS‡ÁŒŠ–PŠÍGí€%Dô`~Y-¶ «žŸ=«ÈÚ»Ü×[¦PùtD]ë¡DA©ßníϽ‹e"jtðZ©‚ÁÒíÂ×íÊÛJœnX[ÖBSüÅIÐP!ég”Ü^új~öTêÝL,~A½&þh'£;Bä [Ä?‘2OþéƒhÕ ï”XÔG’›ùU§z4«¯þ|È9ÆÌçZWtK“‹7Î]! cYxŸiޝè\~[`ùôí%ƒ±ªÔDXbjÌ:¨œÝEWþ“¨G¸ã,Bqö=:dã3’±M\a|‡¿ K.Šm"›U?·Ož2Š{=øíLñ¥²}¬”¨T½ߦk" òq“íÔv˨ÁÊsëkRʳ™ ùª 0à{îbÕÇ*E׆ԅ—çK/yX·˜5pÄnó›ÇKÒŽI%³Î w•@4F¼òNþ–HЃ·s1&N e&Qº:*¤²μت+Ï ¦‚tÿ©ì©ÊÞBÛã×í\F¯>g.`±?¾·Éå“ñÛo„YcŽÂa›}ü–j ¦¡—K¤ÉþZ%w¹¥QJkâø€„Ï,õ ¥<í.óã6RÅú‚ÒÇ@ó^UV«ÜTÚœþ\}p»À¨TÁ©Ù·ìEÜ~˜sÌxÂXVÑu÷ ?‡‹}»·«óáPkÚ–ÔUS½½ƒæÌ<}JÁn­ÛÀ|¶¨ù’İŽkóÄ_f\˜³®‚©s„JÙÜ×±\£Gìb6 ÊÄËgµ wå*^<ßÔˆÄ_ËÌ`ó½jZ'Ì[nEÅÛ1ÅäÊ'ÐIÐêÎH rÜzôtC{>žir aâlRH’Às "‡\FüR"%x¤{ß#gP…ÀjðIxàÔUd?罞–=êÌÁ5~¦ßÇR,¨%cæÉD¥ `07ϺœxÔN 7ˆÕƒ.‡ ƒêFãÀfÉos +ª=¡ü=Š÷fÂ`g ³‰]úáü²]j'¾¬Õ¾ÅñRGÛndzÑ»çèäÌE_$Œ²<¨á! ÍGÇ­¯ˆ¯·ÕÂj\òë×˰;Oñ@×ë8ÑÂíPö›{]åÑ›á@ÏeõoïhL/é.k€7þÅãµG}Š—bmåìûc—“wN&ýï_‚Ó-8ó•¥ZßÔ—3M:ã”!Ø{˜ßÝßlDÈâ·,Zéí÷îùr¨:¨ôÝo„¬•£¢a6{Rë¿Ô½Sl&Ì$H‹aó»ÂQ™â gÖ뻥}§5"e(y¬ànf%ƒ 'êPJŸYÑfý1#ïÂSÏÁÙZ”ótóÄ#ಊvçc/µÿئѼ?eÌP6Ý­ _ iØñ0  >xjbw‚Ý÷üîb·gä61@N}o°¬òš¨•Ï)Å’ßÌé©-Jú2 §M®­Šž·ð í7ƒCÿ†ißxpÖ»ðÕe‡·ü,Q5[±Y\ó™[À+2” éèü¾›ðÃ^KZ‹ˆâd—¾oìxØžl1¤³O@‡@«$r‡Q‰úêKέkÀûX ~ÇÐÙªí”]jiðíЉ3V0ÛÎ¥’$É(ôw~³à©ïš.l±Ü÷ ,l(-!q9«ÓDBÏìÖ“É)“•A XÚ6F9åjFeÚ”»–ð¢inˆ’ÑWË4ÒR¤Ú´é¯=çR•¶\¥¤è‰>AZ„W©Oh¿¹š(“¿ßFØò27=ÔU©½$Þ]5u‹û‰Ów<LIQÖlq£ÀQÐIÜ{96~¸K+/l*ýÜG-Ú\CSÈâÎBT¼33Ko±Èx(p»ùÕ§ê~K+îÚ#GÇÈþUMHr$ŒƒÿÓÔá“àPsœ'vè¢;:ÅüþÉê1ÑõéÀJ¬R<ùæ .×¥|bež(¥©ôˆ’1żÂà o–’\IÊüHµµb˜F鯘†°´Õ>f«‰GÃNêÐù‘^SæYø¬4{p;ŽgK_Ù§Z‘’ÙÖP=£/¨âs8[ßmÛî7~’$¹v›CðÐ<0¨qæ#¼Y,ùÞÁ6˜™ÉÔã_gAkÎ#‘$¶¹5ntgêk¥âåB˜„@B&[‡·áÒì{õkO}Â\q/ºÂuˆÕ“äÒÛ·¿ç ÂôR ÑìHYÞ¡+­±­¨`b£N÷ÐÕac€s-¼ÿFU£úÛ@ÒŸ.¤Z°gÏíúøí(nž_6„1<3ï0šŠž w`!"ÍÛI™Yˆ¼á`·ÂÀ`_21&œãÙè'5GXdÿ¡sC¤~æI¶ù4UèWî_'ö»€T ¦ñͳ-Á€ `5W°ÿ*›^­“WB.Cb/2_Åý;œ ÚKé³}…[_·a&§“OjQì|³Fõ•/8k&›]Éš÷ºÿ«%qÕ¨©eÁïötU'œ)y8t³ýÞÖôê RFÒ/Ÿu¦RÅý~˜£zå—úF¶µxœùkâ ‚êÇÆä5!¬uÄq«[pÃlíe×-ùî‚™•%Ѧ58ú„I×¹2”É.…+tŽÀhf)ýøœsâT\µ­~¿+ßâ¦êŸ -ÝûÃl, „´Øç¾r#ušl»ÝÁ°Rª\º½ã2B!XGITñ¼[Š¢Â·7dÄ^”Ál`¡1XyÑt•y"ˆ^Ñ R%<–^,ðÂã~‰éL¬E´Þbª޲ È[žÖˆ3Ù„árEí;âC6g`>"$½äùÝî>„TU+¯Ü’ðMºî>J¾ê¶ÑŒ2i“[á‰C—»~X Ä’½º“µ¡²P™LàR­&!Ú©õ˜7lø‡ÅË»©÷çtïfæs§AæêU‹/"õòŒìÚ3´yë÷Ñ.ÑŒ®t 誓;{ħ¹5©V ø)0ãz闀̙ò…·m^ ë‹g+ÔÛSŸÅÁÍËBa'Ž<áMòöuŠy^.£÷Ýa¾ñ¥ýü%ž0d*¼;AcöÁv®xÒ{©öRvBâºjLã¬oŒF$Xúu>æ ÆóYÀ< [‚Ƴ„„êKìâN4k’ß|~2(ŒWEè4­»ÇNŠ“wm±à·©‹}Væƒ|‰ˆó”;ãîR!ãP̤M±Ö^PÀsý‘×7æÅÛÅø¦!€GuŠÙ%ZËXo1&nb‹Ññz˜âË–âÄĘÔJºùö"R%dr%>Qˆ°Uø'†+š V ¤lΔ‘é÷Ï/š­u2¯I‚Lçà”±GK}Ò[£¦Än„2†ç£«`omitCxá×Ce·÷˜“‡&±¿Ë›É‘ã-¥ûCÆ[Ÿn1j¿0ÃXó`“Ö4}ØÚ+q–6®Ë—¨†^`k³"ži4Ê<~oÀu¼ÂÍê¼ýhëBÚÙÏâ<éïÁ²aÄÝe8ñÌÉhÁZýÅéÅmr†¡'[áµåÎPü¤=S¦×€LçhNý 3¤ò™)ð[ù;MöSX˜ºØOÄ6¬²]‡.æžžO9´ Éïsˆüë8œs©7‡¶,~qq-ºu w˹:bI峯÷݇þ,ÿÐØb¸u´rJ?¬ÎnCsŽKiƒ\×O6RÀÁP ïøòf¾‘áT·{R7ÚÕ2ä’©Ï•šŒ&ªuÔ°Ó‹íe¹W¡¡k½ùÅ~-'±U8u {0Óáx…Ý¿ª¿c úvåø¦ l)#‡]9c¤òxZ'¸× e†==ÖÉ—½I`jì³ôyËÈI½PïãåÂ…òjÎÕY€hÄ2Bÿ”Rý«ð÷æêH£¤, Ç÷Ùqx”-6³ÐéùHŠtœu°"ü]Óný½º‘1d¦›~$/e’ê±-å€þ#«áv<Ô Ú2DÈýoŠ0ŸÇzjqýãÛõÅ>§óôêFG-hOãH4:® D%‰m×0ˆ×ÜÖ-¶iù‘%ׇoãÀ(Ï×5e? 7~ljDY|¹`ÿæqŽq̸ßLãµ—„(ae¹7"²6¶-x aÅ‘`Þ”/wpö[šŠº‚¸&Õ¯Þzà 9¬üÓbüµ¥ÚVôLhÍeÇÁôú~ÿểÍO=s_ÈÃZANý †oÔý-3\&Jû´ë£ô‰W³^ÁQV_ÎIûÓÄ/«¸0%p„¬6²â-fØõ‘ý"®;Ú£(ó,<ƒcîô…–a˜´Lž$mÓx*VÛèÃþýÜåSšKõòùgw`XŽÒ4d¹¿ÞÊ9}£kS¸W¥îžûkO÷¹f@oísî]8†×›ƒ…0u¡®ô nºi™åªò.±L]Œaäm0îN€¸å¶œ†“OíÏ$”waÍ÷iY=·•ÆÓà|q¹N¹¸d¾ÆÁc8 îG%¢ßkë‚úó³·yŒÔ£/°{§W±4¥jGoÜS˜SnM¡b'0·zxŠ]qqG[Æ8{ÙUß·+L×ä„ñw·«$ÁVÙÕÜè;Å7ëhN`.¯3­{;bXeÌÊ!gõ #eGõhVÖÒ~¢Øƒ[r¡Ù/ÛéiCüñ£ * Ä…öD|ÙµA'ÚP¶šcÄ pŽ4e–üe[Ä…U.ó8Ñ£ååœv0œ[ƒ•Ê‹­ÿ¼èº³º5©uI{ÑE÷^§±íÇ@|¯j3'£¯‡Ñ 5aš¸Øþ>©{CDÌŸÆÌÞüE¨”j"lö´¨@²L¢ÿi#w#^ÄžPjôç”r‹œ,?uòe§ÖÕÚú?¯œ@w–{B7ºã¼ÓJC[2«°2Q”¾¶Õ<ɦÖã‚Ê%º½¢á–x¡YæW\­’-!]Ç;%’ºÒ*H:.ëÈÖ”ÒTC‘¹N4ñ=øÂS”§‡8÷Ž1Š7è“瞬†§oæ#¦+±§µµÝüÝéi a5äÃ_ñé°£YúýøqDqØ逊X· ÔA/YUÌÑxÎp}Æ­'oFúFsÂ9ø¨l¿%Á™¸ h¬‚Bšk!˜ú)¿HG¬:z*º—eWsG–Hm”©¿ãdg騽<ˆÅ çSkM¢±~N†\4Æ*IDlÁµª…ó´©ÌXHzx²æì¹ŸÏ¥‘<™‡94˜±Hc^zG楸?l@dAWx[‘ P÷ ¦Ð}ÈèéW{QnŠßkUÔU­‚öÜÎý´ÌƒÕ[N¾å÷Í÷q®|ò*ÊiR¹©ð‹®ò4†‹ÐËyçž4CX^Êç—J,¤†¥$ºŒ“¡ç¬+Á BÛ¼‹—’Õ—¾T©dÓ $êÜS݃…¸ }¹‚¤¡Ó¯x¸ß8õ¦e ¤§Þò—`E‘§ýöì`ÀQw/QýÙˆÃvÜ7œ•P™=ìZ+³•–òÇèRÖnÓáÐð’&UœãÒ°nô‚7ì&“7´=&eI 1ÌDe”}«öÔqêœÁÂg»ÔÂåæÔR–†õò^Í3Ü$[ƒ%fS™‘s«¨ÏªI´èë«Ñ¸²Ãž²ÖÏÁ\·wæʯ\ú¬¦Ä€Ï,Ë´#fOÃ=0ìb¯ÄÊK”Oøþ‰«|º|Áç[ × “MBHƒ¢¯¿Ì”¥¦;Ïq QÒŠäWˆ&õðµ%´Øíh…Y¾Ä׆_œƒ¿®XL‹u,V¨g ’õd6Ö–™ˆ‹;äë˜7 2ý<b^Ï—TW¾\téë­]ß鵆êO‰ e¯PKöo¯)éáö]sÆ^|¾Ôɨª¼©Í§ÿ³èT˜IaÊó uD8Ç:ëâ¢Ï â_ü“?¤wÿk.z ᛾°_ýµ²•°† ›µ°2»xÏ÷!ôôÔÀK‚–¸ë³Úñ€h¨¥£Ô1’±Äï€e;ÿ;L<žs‘€‡„…¢Ì;«RûO-c®¹,À»[¯¼°Ç ¸Å:µk|–Cîçž%ºÞXŽÍžàá2+µØSF´-“ÀûæM¶¨xÖ½êr­ƒQN|Õª®ò=fkŠW|Í °o(Ä>(ùŸuÒVBƒë‹Ä¨«ô•!/¸iäóĦxã'ñRéžã>D•bä4ü‚^ÇaÛå_Í0:û„ÑžÕm9G… £7Nð!Ô&¨vúYEQçU¤²D‘ÓB°mý™œ¡nKA;;ª:côíŒVdk ç Âyb<1¿Š»‡ q“ÖÌ,zqÞ" À~ÄÓß²$ÆúYý, mó•9èÇ®½­ÿ‡¢»µ0aXu‹Þ÷àÄY3¾"LrÑk¨<Æ;2·°¨ˆ²ìŒCRŸÊšºÈdˆÓgKÄý¨¹#úÁ"ÍÈ×ÄVÈ—7©NÿLʼnkZ*F§¸%/ÉPÍ×´†“]šÛõé`iád¸RBjÏ=ÂQ8z`ð;\øâ‡Ûà4¢‚Ž)Î?‘ûœš…^W¿r¦õ‡9w|"Û"Ö÷ן"½Ôî÷`4"wd¢¢æ4Ö}kG5 •i­ýXóJ™l$¾ú} Ór4뇇»—§gVr¹«íÐÕ©xœö ØÑIH}"²dÄÿ­ïÊÇuÊËâü(‹…}¬v8ñáŸÌÎyyýÛ•Œ.Š·á¥^oðsƼd†™½µëœÆ¾¨8mÌÄr kkôBßç"¹u4”÷—@â€g‘uGÕÁOÈ9+¦§.¢G îûgL·Ø¨^;ý¡måph)àd­õ'÷ÓìÜ?¾keÏ‹ÕÌÄCÍv7÷ÜvêV[xÕÉ=ò˜i£D ´ìo~¯r¶·kšL€Ä7ò_K æ· ›¸xVúáÕ® ™1xK~l”QáWIªÖˆ˜K“) ÑIÞ¦€¬=üMŽÜÂ&í÷›¦` 3ˆÔ‰Ç¿©¾x*¤ÙíÖõ1£øÎBû³Å·Õæ/á«'X>Ø·+£1½¸_Ôö¤šZ— çÊb·8"Ú_—C¸Íb:ßÁïWHá¬\ØÜW]xý‰·¾$?Ööžu|R<<Ð3í‘ñw|?ˆÀoŽýýÿO`5 endstream endobj 73 0 obj << /Type /FontDescriptor /FontName /HHXQQK+CMBX12 /Flags 4 /FontBBox [-53 -251 1139 750] /Ascent 694 /CapHeight 686 /Descent -194 /ItalicAngle 0 /StemV 109 /XHeight 444 /CharSet (/A/B/C/D/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/a/ampersand/b/c/d/e/eight/f/five/four/g/h/i/k/l/m/n/nine/o/one/p/period/q/question/r/s/seven/six/t/three/two/u/v/w/y/z/zero) /FontFile 72 0 R >> endobj 74 0 obj << /Length1 917 /Length2 2695 /Length3 0 /Length 3299 /Filter /FlateDecode >> stream xÚ­’y<”kÇC DÙyÈšefÆ~ìKv !5ÌCØaÌÈšìÉž%q¢#¢Nad7ÙE8ÖHö%R–ÊòN÷œz;ÿ¾ŸçŸç{]¿ûwÿ>×u‹‹XÙÊé ñ® !G”ƒËÃÕ=s=[=8 €Ëà ââzEÄàqú("¨ÀUUá€É€«p¤BY ¡ ôð>ŒÇ" ¥'ýU„t¼AÆ …ÌQÄ+ 7Õà …lñn(è`±€Í×~€ èüA´<Ð7"à z`pè×H&8w<€ü«Œ&ùüÝò ~ÔP€5¤4@ˆÆã°t‡@-ðÔ»@j’ÿG¨ŸÍ IX¬Êû«ý_cú—åÁþW‚÷ö!A`ŽGƒÜÏR{ð¯tæ Còþ¹kBDa1n:8,Àþ*aü 1 Ú Ct»¸£°~à·:ˆCÿ‚:¹o ¦ú&VçdþÞé·® ƒ#ž ôùÇ÷«üÿ3uBLà“‡ÁàT!õûûïâO·àÜðh ÎPPRP*B}=TR‚á‡0€*éGêTBw<òu¥ÊHª÷µôªÔò¢î ŠúN*Ôõ;Q•nÿœš þ€Jó*PÏê„ý©VÞßN@ªØÿ;*(Рoøï¡ëêâ‚á@NA‰: •`¡ÿ£s# ŽøíES7÷7»c¨{ÁÐ 2:ŒwSò¼]óðšÁý—%ôÒ~w~‹ê®®¼£.¿òZýÄ áYß9Ph“#šÃSÊž¹fZE»+MóV鄼¶…Fp¼`å’.ȶeXw[qv¡mϧ4³yçÆ-Œ Ïú<“Y;½5å_OÿØl Ž¼Ç»vóèÃ?‡÷?\ó ë™eÎBŸžË„\Ì'›e€v‹S)]ŸWð÷ñ£EíÜÎÙ[œ£¼Í“^¬wTãóÍé†îhî1Á¤Üßô@`+þ´iÈ”ã}¿«²5¶Ü5:j)áU<û"'ý3eØØ0ª­a9¶®ûê ¤ÿ¤ KÆÛ#¾:Iƒ9W ãU ,nÌß”ÎbÀ ÜÆ=®“rq:™ô(ÿ^Ëœ,h?Ú"(^.yB‰'WvTÞ.nZ÷\"±h–$Þ•TZbPฌðqˆ+U;¬ÎPwBDÌÉ|fÒvƒL%@š¹CSüĤó–®/ZmÒõTIfBõ†´êêõ,Ø>§”ì;3•Iš?Ž»•ï ÑÑÝl:E‰¿ÅÁ~¾´hÓ[Žâ“‚÷mθJ3ì¸`ø€¦=ß%VÖSv4¶\åÍ—YþÒÞðßxµß/0|ºØÞiÕujÄGŽ'Éî%×(Ô¿—Ù¦t<•ý­˜ÊùÃ|!sð‘Kìd½€”5éÌËÞ®­û3 ‡ ’-zSú½m‡ÇŠœÝX€¥r~V;?’†^-ƒÇðE~Š k|EëDøâþÍßr–ÒDbb6s5FÅí¼‡b·tîŽñ ´Ô-ËcC]ØOm§Å ó׎z~Zôð³âæÈVîS\‘ÓòIÛOéyÒ;ž°ŸðÑ鱬ú*õ¬ çNÆÁ¿€!W®6U ˆÑ±!€1‡5Îhk¦ï«YÿøÜ÷çKÇ™”¼õ¾Œ²_ŸÆ´W5’:E=šhž)sf¹ñ`yµàŒ.!ù#I»äÕ·iJºí¶L4Šâ•äƒl§Ë×Û Ïïm½E†\“3ÊûÃ> ãI¥UºÈ¹bo›ëµiÙ“Ù"¿ø0ú;ÜrããË—^°>œq#ž¾Ð]5‹j2÷2ºç5=÷°%ª[%LŠm6'߸ežáÙP†‘}ªW>F/|˜>Òf~>NÍ1"Æd]ÒPuÜUä¦ïùF¿F{%o”S1¶­¹ftQÐXøÒ°DFÎv¢é“à‚V\FU©ìƒá’©p=ùUÔî¹µM}þ¥^qqwåN®¾•¢¹&Δ#‚šÜ2Økvo a®¹(çú’gœŽ™À¸…3,– ½&æÕ/ ÑXîo*5Æ<Üxwa«UQ¦s-6ßÕ«U˜¼Ö;¦\„Nß Ô³zÚ¬)#söœy?·ööÝVn8&ÊK^1BU:•Q“¿·&«-Pr@¯3xª&ÕÔ“û¡H @2ˆ?=sG 3÷‰ô.-ë¼N Q8w{•éXOÉVjüµ×œ Í­4ocYþ\ÎAeËÏrß ,ÖŠ.`ý¬ØpîêçúÒ­ãˆtΙkà .ÆUmšçLÁUæàù‡« ­[M£r±pd M,“37 §Oï襅/³±EEΪ-¯×Æß[Gô6Y Èôª6 YºL C-=[.¯Qö6ÆE2„IêNí_ꄆçØcTΉÍÿÞÚÍÔnTÌsÈ¡7üµÌb¶B~ r}õjè®{÷`‰ yIJ7Ò˜O+Ý=u(½uz'¯¼îêÏ…KcE« “^ièÐ]kY%õŠ¡¬#•_tÖ$nÝæ¼àÚÕ¯* ÚL>\ µ’[+)Œ¸‰ ›AgÖ‡M‘¬smÙ¿¬>µw€dùd'< LYv£-4 dœ+‰y¯rœ¯2Šj7y«™º§Yìg1¡q*ó¤1µ`¿k©Aˆß’}§þ*¦+²Ý.4Õ¹ ÖVë-¨fYr¥ÖŠèm6¶kµÁ8¥P*0%š>Ýž´Ëì2ÞaMOÛ?K'wïß8EÒ3”å¿P½¥ÈWCOÐÅ&¿“ÚŒˆ¥X;{a¥Ãþˆ©jŒ~îˆ< ‡4§lmŸm„#+›.¼¨ºöAâèÁÌ1–²l¿.OKzMXµ÷:&Óq×Ýò7”5WYÖ9Xjüâ¶}éUÕÕ¬¦Lób½kMùú:áƒOpˆd#“)ᕜ \qwékwq´ »ayE=ǹ‹ËÖ…'-qGj¹86NfWn¨/^°·ËK? ]¤y¶Þ½8Á™îç1'«‚œa¼‡˜7¿ÕQá^ßpõ¥ïykRFzÒàæÚ…jþOšg)=Ÿ®; h'ÄB –NT§-šŽ‹‰*$‡Ï– =]¢Ëáês–Ú‰G˜•â•}m·ÒsUíû¶ñ¬ D«t+?2øb nÄÏYÂ=gÓšx<%c6èØa¿ãx˜ˆ¿NŽ•m§ {š¸¾ö9y£rÏZä‘ÅÜ|—¹£.Å:•i?Z]a!2r–­Ó„•¸’ØA±E® oH¬Óª½)²ë¹ÈR<_[­È•3¹obíÇáòbÞ¤)D«Ÿ³éRá{®ï+”˪Ÿ§;ª¡¡sÀ™ áK$E_c¢cyUNLASö(—ã¼yJùáðþiJEM½Òdµ±l?åö©ºW•N´»öCÇE”—3ùîªÖ꣌{¿éÞy¶4»¬ÛWš\¿Ö·“F£h¹±ƒ=ÒVœcBk×gù»ôñŒ:/"Û*³®d£›íbú§ûŠîžÜ½$cî‹Âëñj‚ÂÕV­(]®+¥3Wº(¾^……ÃÉ{‡ô­úLê6eÀìJå—­ãµ >Û¯¤ç ]Ü›n«RJî0¿m*dÙ(=%½ Úâ,´î¶2þÈ«õëPžÝSMYFQbrÜ[ƒÍBâ}˜Þy2yB\Ùò-ÿ’…¢#†QIϬ³ëÕN[c*£e¤†X\ªwoÓ±éFª¥XZ>éçð‚ Èï 4^ÕAÉæ®úäñ|ŠÍ°i–ñ5jWô1“±Œ ¾1hã qÃ& ’]Í͵t4½l@;ßQI³o8©”ï7Ûý¦ÿ%,êØ½›ôró¿xý^ _91–=ŠÍÓ®{÷¨¤‰£ù„°CBÿ+Fø1µÝ¡/Ëù lv}Á’Ûj£¤lOéÂ"¶·Jîž~ßC6Ä"®ÀÝPÊ´ü¢å—¬„O) Ã2m1 Ù…Áº²d£%‹–ç*lëh»µlˆ; $Ÿ¦ëÞÎ3=¶„åéæSµÏü#6#»ßlUè:.3;m Û˜3³™ôÆÜL‡Í·%N+xji/Ú!'§±žc|ô¥ùxŠÇiÂì®lÃâ±’ºøÈ²zß8ó'ÆICFGfÔ3â!AÂá˜Pþ& ]C endstream endobj 75 0 obj << /Type /FontDescriptor /FontName /KDIXPT+CMCSC10 /Flags 4 /FontBBox [14 -250 1077 750] /Ascent 514 /CapHeight 683 /Descent 0 /ItalicAngle 0 /StemV 72 /XHeight 431 /CharSet (/C/O/a/b/c/e/i/j/l/m/t/v/z) /FontFile 74 0 R >> endobj 76 0 obj << /Length1 973 /Length2 3091 /Length3 0 /Length 3734 /Filter /FlateDecode >> stream xÚ­Sy<”í÷¶¦&…ì)![ÌŒ1y-}ÏR‰²Ì<Æ 3#[d-´(Ùe»Ê‘,Q–HÖȾ´ÐØJÖßÔû{ßúöý÷ûyþ¹¯s®û\×}Îy$DÍ-å´°D'P—H ÈÁåáªÚÄÀÊ àò0ˆ„š:RpD‚¶#Tà(Ðòvà*\YUQEI'h¢§ çâJ¤ÐÒ?HÊ€–HÂa €‰#Åô ×À8âK"Rüä-<°øqƒ X€dt ÄÊCàp‹ÃP'ÐG€@X2 8å¿ÃXoÏR—@™n ¢›”è±DÞÀ‚Ψ)‘®Òü/LýY\×7uôøQþï6ýÁч÷û ÑÃÓ›’"$þ¤žÿvgbqÞf (ŽxF‹à‚9¸¢¾Z¤Cí.b•&IÎ﨨H>)ÿéýÉCoIU¯­@áe®.7\1g‚Ñ(Ö9.øXërk€%4b«õtVŠ%ÛÌ'»‹Lm/š8<Ò¢æ†D¦=«d¿ ‹­]ªg-1þWÎ\ˆf)èß^ r¿Ò9>´? +6“¹ñÔ8<3?v»}㳑JÊmã·KYãÞl}ã>r u=ÄÁÄ'³ÿfÀF¨yB€e_lÎDC2…#¦HoZ1ɲçÇõÉe5"Bö™²ÚÕ@6Þù]>U‡’î~°/4•hwaBþÑÞxQìSnÄ*ìã)+ÌË“ÞPœÈh³N|i懙ËDlÒ¾æw­ïÎqÊ8è*¦§œÕŒRzkéžüyN–'ÀKI™Âà|Mšóغ™‚i]ÜÊÁ¬K¯‡¬¨3¶v‚øß]©3he¸}t’ý»,uo6Üo–=ÕcðõHFO7Ê ÓұVaSÌΪËõn •áÕ¥oêþ¥oòßÉ@aqR²ª‹ô[¿9ý-– Ùº8`3Ob¨‹Ií…¼<¢.\“ÇÆrgkéâP˜„8®j§|T?Ñb§ymcßÃæjR›:¡^ê£&s$ü¨A‡Óœ·Ý“E¤ð÷E@ÌÄ Jtê{êÓ0çpyá#o¾ xu2?ýd•lõ²úhps00N%JOlM=?i-RÎå2Eúðù#ç$ÂÕ×8ÐQ¼Ä4‰ÆÐx3€Q‡ÀNjm…R×+¨³Ç$kjg0Éåºg`µ’?6ÔSÚX'Îȱy¡cÌ :¦ÍN@©ßñ¦Ežw;G¹¨U™ÄÅñáDa!ۈ߭ýUY3"ƒkõW›Ýr ‡±·EûæÉ7!eh±Ü#å Eó¾È¤KrÍ„z ¸ã[]¯óÌ<¦yð6† ‰”‚XÙ€*ýå­¤uABJ;Å_ÁG\©ÃIKÁÎÌÚ>r8èÐiÁürQ[dAÛ¦3Ù~J$]ºÁ–’Ÿ#^4ª¾Ð&ã ‘Úö#X±¯!ªñ›]È;Öµs¸®¥Ü§Ñ½Ýì$EE·Ö@e‚’ëû3 “©[õ Öî ’mcýš¿5Ïõ’\S#[á„°~: áC¦é7>íÎÛ¦M™Ýn8WÝêÙþ™egd>mª³¦ÈEFÁPAýv#bЉü|)«†Öán+!ÌŠžø4ý*9αº±ÅùY¾M¿¥Kü”ë×k`ù›(>¡FØðשùNþS Yú¯}ÖÏ89tV)sìknÄ‹±ðMû|+Ûn:e6›‘ѪC̶™¹§e0Z¼=öú›ÁŽ“§ý8C0³ƒx‡nc…d}åú5«Á}œ;î]'€šÎ×ÒeYvÉ‹7=ü7ÿÒš¼±dŒ„ÌsÏGH›%ÆKåÅe:ÆW¼O8 ¦;57z-ä ?>ZtÒkMx!7“j.Óý꣱Ø>v“?KÛH’/b·ËßL=¿ö*âi5(å²úDÇÙ ä_ÖÉñ@|¾á\ì w¶]µ¡5&é`2-N«cjÓ¡vaÿ£Ù &›yö™êr9™1ɺa;¹Ë ì”æœ‹aíbëø3³Wh¸qÉßá.(õzu\Õîè‘®ÅÉè¹ì9ïÞTšˆÿÙþ=rgÔMÛLy«».Ùßw‰‰žFx'B˜cËœNàb,Ûñ³¸ïµ(ÿPi«kP´ÂY5S=«§@àß™s– %ZÕ?:*&_þ6Ÿupð%5Ÿ|¾¬xå¯kºJV¢^•Z’[C›ð| c±Ž`níd^žŠ™Škâ é<ŠÑÜ YâvÌÜÆj"žeì#r5ržÉäŽsØg,€ýݧeÚ ŸšjÞe¹Ì àÜRœ$,ØkçQ1ɹñ(c²=ÙZ“PÊ…N޽Q™9 Û˜nùš¥!7›»äûZýjw}î}0ôÎ_« â‚lñÒI_ý«*u“vÍ"ØÓ>%.|mþf-ô^_ʧ‰ê§·ÀÆÄö }ž'±ºM^¦ÁmûÅÞS(9l€ÈwßÑõRˆíé½|÷g_nÆ›0+ˆ¦0oÏxh~ùæšönJÀe"¼ïx²¤Å}íY¶ÇôŠ-£’Yä¶òÑ‹wmÇ|m<†7ë gK‡?*=/žƒÒ-T]{YÇ}=É.ò`®Ítîµj¯ãT©¬³˜bšø‹`½Øåê„G{®w?¿2«eŸTîÜž’ÅáR”a_×ê’¼)‘U¼Yzlêu˜ kz»{ùÁ‰ýÜv M÷@t—YôÝ¡ƒ%üïìàåÇûCJ·­2·eQ¦Ÿ8=äž8Dµ‰¯dêÉ.°ÉŽM|\&X”Ÿ&Qxÿ‘^ƒÞǧæ)I¦Ï9RæëŸLغVrN³qç…q€«F(öFD} óÓ£ÿÍ5õ endstream endobj 77 0 obj << /Type /FontDescriptor /FontName /XGRKZP+CMITT10 /Flags 4 /FontBBox [11 -233 669 696] /Ascent 611 /CapHeight 611 /Descent -222 /ItalicAngle -14 /StemV 69 /XHeight 431 /CharSet (/c/e/f/greater/i/l/less/m/o/period/r/s/u/underscore/y) /FontFile 76 0 R >> endobj 78 0 obj << /Length1 823 /Length2 2591 /Length3 0 /Length 3163 /Filter /FlateDecode >> stream xÚ­’{<”iÇs ãÜ&¤ò„)”13³ã˜³’Cˆ¬Å̃aÌL3C§uHØ Ê¡œv(Edc"«äÓ"¢Ô8¤)¡09æìîg÷íý÷ý<ÿÜ¿ëúÝ×õýüîºßÑYÛ”@ñ­(d†6†ÐÌíìŽ!ÿ ‡C PsèÅ RÈ^ P@`0zÀñ €DðõQh} Ì)ÔPÑ×h˜k~3¡Ó@FÄ{‘;/†ÈŸ÷"Î<d„ÂS púvƒ8t ` ñ Àô%’!:ß˜Ž‘}(úÏ2!ˆúw+¤ÑùP€Æ¦&À‡$PȤP€ú@tì)üm Ÿåÿõýp« ÉÞ+ðÛø­¤þ§ïH$…þå Rƒ °£@ù{«ø'œH ~ß=Æð"ñ¦d_h#tapÝ?ëDº1$8x?ÀÇ‹D·ê ™ð= ?¿-7kw[Û‡þzÚ­¦£‘Ìp ¥‚ü÷–Fü£ù!ш!€‡#øFþ÷÷ ÷Ý2K2žB ’}$Jð¢Ñ¼B!pþ($ 0‘LC0„O¬#Sü+?™À‡Bƒ|{WÌ€Ž÷·Ò–BÀ‘€ŽÏ¿$ Ð!þKòͤ$èÿ%ùfú–üß8ÌÌ(!Lí#p@‰‚[£ Qðˆÿ2âƒh4ÌØúåø¡þ­}ˆüwÁáPðqþYÕJ"-‹zKE4é{®ÞŒëªç\5€}xe°ã­¦ÇÜ÷Y.^Οx[6ó£m¹ÁõZ©Ú4¼é¬ÿR®Mj§&ûš³èþÖS°½ µI&0/qŠ«2A­947¨¶4\/Rqb.Tú˜$\òb`c!2 ªû5W"› ö6‚+¨;‘º¾Mí\±¦Q¸7Ú°×–~øÊUjé –ºŠI.°¸5ïa]‘1§QÒâ54œý8|ÉÉQ`¯Ò´¹zCÞH_V²Ô{Çøs.&•u ¨ËŒ6O뵌¿¿.Ÿ'ý Êj In‰ ²ÈMs¨Ï÷5”o’7ܾïž)$75{þù‹p ¹7e§d÷–w•Ý&^ž}z”Rµ ]–ŸZ+¡µ8~аHGîF£…gÊ)\Ó±÷Ãc/ź¡]£*âÎu68† ?›†.¾­°jÒíq×Úón!_™]yã Ê=ÁØYn—õ|÷ü­«ó„7—õ‘úÅ¿3DtoÈr¨Xˆè"Är_ãñöÌΊ/~y!u^+r,®u‡àe^­õÛ1¤;ïnäMwÞeЬ'Ýæ§†ñ«îää ÅiP–'S”£ "´^ŸSpwYæå}SŒ‰^ÉÚò‹òÚ+¡µÒ1§öÕÌùÙ´‡¨ey'bWÊæ+­GÔO¥ÜÔ|سûL©ôÅ™ˆyEˆ ½Y<ƒÜ÷ ^|ñlÎDËD+ô—ÝŠ\7ݬþ4gµº™¼;õ~žãªK)7Âx7«?ä›×ôòÆ›–«¯Ä–YÈ_7ÌL À >M,–­b"ÏlOwIõâ£ü©cl-ê,³hµ”Œn3üVwäÔ°ÙçIÿÒ”£k×Üym»Øqk,úŒBúy‡IÑH󢜕ýÌÈÖGuO3xŒg‰QùbÊ×£n›ôžº_HiôuÐt’oF_¸Z‘éOͤÇËáõ-E‚¹Q)½ šÛÇ-¯—Ûˆý’ø‡vxßýI¶Ë¨g‡ùìA\¨»L‚ø‹q^…¯À§`]Ѩe£fu˜¬{€ÖB¢ÀøUïv¿å†nÊ~ÍuJAôó„Åàœë’ ø.͆ Û-—/n. 6U¯¥D²ìq<‚„©Ê2+¿­?º«êZóc‹S‡åÔ'Ó~ ¦3O_k>t¬£„庽(¬¦Â{6ej …ž:xrý¼±C¼Ú<ÊMün¬GÚ+zº âç1hüÒÛ,”CãM™/£B4„ Û"×…_;C›.ßiŒgîQeã âÍÀ\pÓóËËr{«ãõË?åï.¬¬JojÏõT™ ó›ÙY¨žgy´¸“ª·Sð–oŸ"äª}¦k÷ÒØWÿ X™@3N½¹EæzAàT­H¯âêb•FGÞð moUíÕ´©„þӵŠ>ºVKŠå5­&évy,ûmo…v?M,P4`œŒ=ªxïu©—ÎŽ,ÙÌ£ÜûÂHë¡(\»aòÖÔ÷øi¹õĤút¹$LjWï ^ìÕÝ vÏ']Ч*¯‹÷ãêWß·>ÖUå¨‹Ô ¨§U]/ÀÎöº¬ËÒÔÄæ”°Ó:ó©Š¿õrm]E8½¹R㆟kVŒímÆ=N‘úÀf÷gÉzôÆætÏãš FWèäɨ“º#¬Ìj©Á=¸÷g²ï‡ÿ:íLD!o‡‡…ôÞžÖ­º¨jØc Þ†³*9¢m#+qÇøÃñ|ñÑKA,„CS‰v^ÎÓÀÝoÕâãÔ+é•\Ú¬‘{Bíd‹YúAˆ#“¬,}–ùyBQà KÀ(ß.¥k‰“;¯[m&…ßWË»*âýÀ óÉš‡Šë*^ô¶)Øœí-ß÷ÉÀþØÁc¥oÞÇkQ£÷âO_—›qê]‚ÄÊaÓõdV®ô>}#|[nøKaO%3rbYû´²Úmé?3…-U—²Ãh“b/©O«„¿$4OÆäü^6q_Ý”<£¿M=ü•{!®y5/oøytËÃîÓ¬.Û˜kœ’Ägﺛk¹ïÖ‚Nª?Ü&Vœœ(œJšé€û™ÔýIZOêzm'£‡ÐuJñV¼epGl5õT¾ªûÑ1ˤ.î;ÿŠÍe¯‹»}”®—+©Öv¹žà0ûFòìó¶ß¢'…mc~Y²íÍx,œ77r`î).Uq–qárrJ+’Í[ŸMä´+gí-û]8—йY Ü³0j¢º9é³ÃÍcsGä4=Øæ‘yØ`}kñíæGöÎ…%Š—Ì‘þ±_I']ÕOâzf4N¼"FÏß3=Q?jÅ~«•®®[ý‘íϾ}¶—wÏ%‚eTê—í%öÛJ{ð×ZÝV“Ö‘T¥Kú©¸K~oÞIœ«§7´Î(¤¼¾J!§ûIV^õ”Õv-Ý8±RyïËq±iŠªõ®cÑ™ÎY{PÂÓP£ÏhCAe_™³?”>˜Ïú±Ìj]¤ÔÅF'@^=È/“¦H ¶Å\ºùäVÿã¯þ"Ò5Õ;qKІLÏŸG Ã!>«Š«šƒ}¡šÑi˜ýšùM‡ÿ¥m endstream endobj 79 0 obj << /Type /FontDescriptor /FontName /WGYKKL+CMMI12 /Flags 4 /FontBBox [-30 -250 1026 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 65 /XHeight 431 /CharSet (/b/f/i/l/n/s) /FontFile 78 0 R >> endobj 80 0 obj << /Length1 1971 /Length2 13339 /Length3 0 /Length 14407 /Filter /FlateDecode >> stream xÚ­µUXͲµ»C`¢ÁÝ%Xpww&nÁÝÝÝÝÝ‚Cpwww ì'kí½x×þNÿ‹îê꣫zöCJ(«@Ãoh­¶¶²§a eàJÉ30héáHImzö¦ÖVßõ윿ƒ1€‘ÀÀÊÉÄÎIÏG ´¶q±556± RüMbð[mM ô¬Rzö&@Ë÷zkS ½ -€ß ÿw‡@h´uÒÂ10 M ìú@cS+8º¿†Ä¬Œ¬lÿ:Øüï’#ÐÖîÝ€üÝ$àÝ¢¡µ•… ÀhG'mý®|wòÿ‡©ÿ[\ØÁÂBZÏòoù¿Mú–õ,M-\þ'ÁÚÒÆÁh ²6ÚZýßT࿽I M,ÿ滛½ž…©¿•±@ÿï©°©3ÐPÖÔÞÀ`¤gaüWheøM¼÷í_è$…D䤩þ=Ï­Éê™ZÙ+ºØü§êßä1ÿwÇÖÔ AOKOÏðžøþ÷¿ÿiý-!+kCS«÷ Á гµÕs{¿ïÄpc˜Z@çwÃt´VÖöï[ï=ñYÛÂý'+ €ŽÿoèßÄ  ø 6à±è¾€Nè?ÄF þ È1èD?ˆ @'öAÌ:ñz÷"ñAï^$?è]]úƒÞÕeþCìïê²ô®'ÿAïz ô®§øAïzJô®§üAïgWù w=µÿÐû=¦Óû1¿ëéÙ½_3S;ó”w»úôÞ}[=s ½ÐÈþ#ÎôŸø¿'ÿYx×3ø±¼3°¶xÿµýG“ùoÄÒòÃý{ ÿï’À ïgþ—ý»m£|O7ú2ÿEÓþ›ü,LÑñ£>Ã߀ÅÇúßtkÛ¨½'ÿßë›|œæ}&.6&@«d¼Çþ¡Oÿ~³àûÌÿï ²ø¾wÏòG{ïÌGe–÷­V¦VÞ™Þ•¬,õÿ>hÆÿpð·%ÖßkZÿcÃß–Ø|,¿kØèÙ­þk¾Ì ÿýïé2¿Ææý¾XÌ‹ù½?6vÿ¨ÿùññsûK@»¿‚[Âø7hm4Ô·ø/]&æ…ÿ–fâøŸ•ÿ3üø?ÆÅðÞ“/, èøñ°¼§Û½?PÞôQŽåýÜö&¶À\À÷þØ;YÿcÃûþïtü¾ÛtúÇí{ßý1Æ÷ò.ÿÀ÷6¸~tò½’+ÐößRÿï³, `íìFóÞ Æw—ììﯽÇå8ؾÌþ__¼÷·ýÙÈôýK: à–æ­ ¸üÍ’K<…ò&K!)AŒ›¢¥ëºf~Âû-Æ€ZKü \¯UýS–ŠŽ´¹OàôŒkÚî.7&|áó#:yîußQw?ÕµWõ:UÊeφèÞï¹­qöö”Tfz}¤$^-¿?ãrà$G–ü»âô*!H·†c}wš?+›ªpª…RP@-¡ eKL î‡yÙSæär b2v°–w\«Fm‰ A‰‚ :zK0QÉbhÖÄk›ô÷µNk)ša¨é•é)ŸBû¶dÇž©ÎbOêGa)K¡Ã·ôEr˜Ôg—Kd§ÁŠØ%™Þlóp4B­ t„úºL*<9¢À}ªÝ[¤(Þ`=ÔÞRô¦JDwÝ|ñc , ƒ4ø“£\1sTmd{áJ *µ±]+Íײ'^+ß#çd"8ëÜF›Ä§º\?TªÌݧµôOhŸi%«´$z¤%ŽMØÍÍëÜ«ÿi3²ãÃjÝ6T³ fMÙ¹9ŠÇM:ן Q|ŠšG>Ï]«Á® î÷œ¸ø±‹Çœ€·ÊbR,9Dü£( …‡ÙFö¥ðô>š×xÁ]Dé!x£‹R‹.<ò# ƒTXƒ¡(7‚+1dANI_Kûž-«—õǨ m›º|’x üVj·»ÅFZpá“q vv3Y:=ˆ!/ [fK?|Z&»KjzÝD(yÝ¢‹º ®U€ž! Êk„6ºh—ŒC³p Ûö¹|Ø—/À&eŒn^ gÚÄNNn•ŸBH݇pÒ‰D{R:þâ«9¢<±aêW9ЖCÅŸ[WÉØug´8㱊f¡Œ ¿üÐën¯FOÐ:,Fb&£^ZÊŠ9p“ŽϨ%ŸG‰Ç2ø=¾&|ùìÅsxµªÔž}Œ»¦ Ì »nÊÙ,^5¡ %•°}2ã<^†FÍþ¼$”-êÕ¤Âðçqì\¥À>WtÜ ÄyêÓÝB/³cx.¶GvRvOAÍ QlÕ¨’ê2€p ¤€xKñuÓ zõÅYLºAñûžM•iÃì´º±hà¸8 ÝŠp•H™Œ–(‡m¶IHcú³o`•O&C*=¹âº’ATl¹$ëŽ,¡óBaÒZ4hK®`\>°É)ШoþóÑw~±ô'‡}jkzÞè|I½=cG˜“¬çsò™û¡‚Œ]“îñ•z$-Ç8³”oŒßx³Uöæìë[ˆwÇáoÃ;¶ Œ¨L’½Ù¯”VYÐRb­M.L3Djæð¿õöÇ»‚¶Úüp›ò¥ñ¶e& eõù‚­î®4YòÇ6o|<¬©X²}ÿ½â»Ç†è¶ˆÒI¾MHP¾“sÆ*‡×Í“j},„*T]?ßÎñºÀÕÔ(í ‡JcÆp¶ÛÔhoÙì õÐ Ó<ý–Žd<ùþm­50±,—Ñ"¤Y6å ΂Áëů"¡E-)üºjáš³t«ŸY9šRF6ÇY´5œW¿©4q•ü+ 8¶*¶ìì?ç)4÷>’@i, M‡ô>hY3©þ”ŸglÚólkG-_t•l„ößè¡"ÑrÏPÞæ›æØJ/Ÿ:‡0tà”d±¢ÕMQ½GmüyL¬å¨$ðmh–X+p‚‚w®NùBQHÈ f5KSQF–G¢ŸùÜ£*ŽH[áx–…'òEÎx±'êIRË‘ @ò)ïê«/³†œ%Ausô?0§ÝtÎ^Íp_Ï;]zßîÄ/¦9»ÛxÙFöâÏç,O/íÉÄР ÷ê’,Ç\õ«€bp(3ÈŽ¶QfÁÖŠÏ/óœwâ³±ã]ªœ ÀJùM™Mî%ñàÑHࣧ«+»¬o<òµö@˜S®} ”çúñ|´à„®óm/ ¯¶/Š i/1S:5•¯Ó±Ð¢Ë“mnÏùSWš_µ<ȰSæ°Ú-‘~ù‚Š–Ñê­N Š !¾®ûª*ô%úŽÌ/Ç øÎÔ‚UÔ?Ü5X‹L&ê6ý2aîTˆ6åÞBMPŠPØ{R—>²åaŃöD23kYõÇ߇¢´Qe® u¹ÈÃôÌ–9§9DCbí[ÞJtµM•iG˜€Êž;wl»*úݽ¯î&ÒŽ×V!DµŽ7 xñi#Pmþ892›à_ÌEh$~ · 0€ì0ùd¡en:ÍæiŠaßX-^ÍKy¡‹1lôÝàÍtÚhH¡³ÊÛQŽ4‡‹‘¸ ·ÄS⑹¢"SÎdÇ€š—‹-çŸóæL!:”©µu3’a%èMâõèïzÊJk5`àUVKÉ&Xè8Y$çæ|Mbkqê[‡ÅÛîÛB)žbâß> ­+eO™ûÍE ÎÔ$Zò†‡zä`nR…hÚ¬"ØV¦p`9‚ô¢\ÏžR¬;þµwc=¦Þ¾Zâ´&­-lö… ™R‰E[wIEZaƒÀÁÿ¼rN<Óý)‹P†Âëßðò(pÚâèÆEˆ#®¿ôeË tÐ~xë~w9·OÕÅ×Î¥3Ã%›¸>N,™ý¡Ð?mCÖVÌ.7‡w{¥z1 ë³¢ˆOêÝñùt“]zYnk¸ÁsÖ¶©Ãõ3:ð]8= Љ#c:¸ßæ,I6 Øè„£h˜»*4þý:ë®’* WBt¬-Uƒ` O·×˜vúÍ-T™o}F׼˔󆾳#pp&ìY1”ôèSµZϲg‡ ¾ŒpyfK@dÌå᳚^î"éB L9#Ü̬^Ò¨|W2î'ší©íT[Äu)Ó'MH‡ü£$ÝN¸õàÕ p‹W2 ÒµÃÉô‡,ybø¼E¨ŽLJ6» ~X4ž¤˜ þJ8Í“>42Ìs·³Qm¥JQz>bÑÝ7"ÿqгE×Ó‡{W¾xÏ[OÚt¶¸bXa1s†àÍïgÁ\^UùmžˆYÖcžŸÚг§Hï­,pù}/¶éQY°«ù$ò6$\¨›Øº­`‹^-”ѺÀ("Át¹,“ ?Ï),.8ó¨t·œRØðFо5!tt]ø*—6ä—|wþ¬R|mŸ°™m-peo˜ÜAf[ í7àøºñdC|™Óï@û0ùuÍÈŒƒS™R—°NVˆFv8ä5ͪÎýí4¼AαªñÏ8Q¼)½2mGþ1 =Æ´¦^éø`Ê6_ µ)G$ÿë÷$E¦b¹%çzŒñË7ØE¡ìºö:?þ2ÒºÏv+]M¹2ÏÝ鹭ー͞²»z´8+ü'nk¯cGbü픈p»;~]ˆ÷Íîè#*­ÎoÀUÎÚhÐgúQ…¿e_¡8¹!êžÙ#QÏ Ï:l²Ú†93œ`9 ìi³{’=²ýG¼àc@±Ô7ô9S‡*…§è j¯k³[‚¿€¬:UÌ2Ú !H{Žb¼u¬—NãöDx²,ú„DÈå¸Çýù•t_j¼|MÎQ*ëv°Z,µc˜Ù2âÑû-À+K`U_zŸ ƒ¯ 0“·Ç¿'“MŒNr˜R¼«6L“ë~@-?У”£,,’ãd~IT9ÄghèLŸ „º^½j0%x7M½N¸Äî©Ëø‰sšçjç̘lÿrî"ÏìÅ|ËDGe HÓ¢?7EНNµÙÄ›1oÚ¼&4æå‘`¢uÆQ*Ê­¢ñ’DJA-ä2 «ÐÌV~ÒshÒ, ŸÕœj Ô˜5Z“bo´ë´&黄BP»½Øabžå„„µ—nÌb¨°¿4x¡8´øªòÖ¥Ld@×-¸å¼F>h£1§ÄˆOZýú2î­ÿˆ¶ë3eÇ^¡Ö] 'ýâ¦ÒŒª«*´«Å}ËåI°RÜKò‚]¿3ý‚Á«°U(ŸJ\¬ÁìE&v,Ÿk+Z¬îŠÈ 1DÙ`«ªö<“–÷¶wÞâ×íP²VÀNz¤Vg‰ysL¦¬®?‡í™ Ý ªe¬Miœômîã9’LJR¸“Q®]I’8IQ2’°ËC‰$2üĶØ=Ù¼?¾‹š rž¢výñM[6ãdÍêSÉ­6"±x) 3·D¢*o¢þ³Lº0× ©Ã\­g&\is´ï€H “B¾ÞV(¥:i¼&¦Ñʵ˧ä`m ™D厳\ÒðÇ_ò}›¤s/\Jí§÷¢.^1Om¯¼Ü«ò^Þe?m&€8Û \‡9ÆřÏ?â, ”ß׿¢B"|å32 ™8*:Y$Ø—-sú8±D}Ì ÓîCwú‡9hñv$D¹zúe‘¹åàeRü(†‰vNüË}3ÔgV’ìL¬¡¤.ì}'ç¡ÆÏwÝо‚ç~~±zìÚGDŸ³†Á™¡kü‰¼VñÍfG…Ò¨Õÿ³!.·,¾”´jä–òâž¼wÎnöã7 ”3Fæ ¯H˃Úʾz÷{‡nÜA°ùÍÍbÞ¡ƒ=oÛNpôÕÃÈYÐìZœ½ yHˆ¡ùŽBs.yÑBC…ôÅ¿6"ÇX7ÕD5äøP8<1ãwa´éâRÛzSRœËHâf…Í5šbZ êøÁRS1[e÷à+WùF5¶˜ªËå'½ì†G¬x5 dêÊ2ô2¥Š‚» ì°†ZG•E`zZ™|ÂhuK t ö¨¸ª°yv@^€ÖñaÉý23¼rÖ[ ­C¤ ˜LÝ›çØEÃmøùµÁ=B4Sã»Ç—®„ÐæÅº(ΜÀlÐbÛæÇŒˆì†^„"€&£k9áÈE²õÌ+Åw”úðĈ9Kä:ÀË—+°e[e%Ææûîyå5îÖ6ºä¯ˆ–óS<—#ôaRš>NÏÈ¡‹<•·:þîådÉòDã€JžNÔ1aÊÓˆ¡ 7òýG-š¯`I%™?Ë…üŽíkq~ŸÌŽgŸ=‹«"çjÃûÃZÅ‚±Ò³íg\‘W?v¤ˆ–&Ÿò‡À¬‰ŒJþñms*½¦ãØÌm4…´ÈàaÙfJf$:mQØ,!ëµ7H=µ¼tøScryJ²nÆö9~æBœ#”ÐZ Ë.BIZÉvG˜>½8#1rKk ¾Ú: Bk›>‹??ê21JÚmº0Sk„D¯n‹Êk#mÚ Ï¾»13UO÷8ªN-X8ÃXôÁ)Ïÿ)Ë©>óÖ¦Ä]Û;p“K&ÝòꛄTr\ÃÀè+¶èƒà%‹SÊsÕpŸÖ\Ьü²Zp ׇ–º‚¬ò}a™ WåôÄÿåLz­Ïô§Z5,7Ñúcˆ[€ ù©¤¥ë‚Y'd Do¢¯£Uq¥xÄP?µùv•å–ÿ{mûø(„ù]á5!h Ãp7Œ_ßD–{‚*Ê>øŒ!òI†ù&û üù^ ´õé~,ü|Éã•q!í2ú‰ü¬IAϳ”Ó¼s;¸u+úoDúæ„õ8 Š6¤Ñ¹h|‰m Ó+Ÿi9²ÓïŒ]ïŸê`"þ+(÷k'ÑǨ×bÑ+†ËŒf2ö_T­w\P=µ ÆL'!­Ÿ^¾nfzÊ¡_µPB'E³Ïn›pY*GɦNJò´sÖBÁƒR‘DèÏN3˜I¹”U”n­Ñ²ß¡…-r(sªÛ,x¬fU4©ßC(=Xœaa7HbFrºñéxÙa¬«ü¶±-ƽ=Û‰ÄÀI¹àdʦ›MsŽ ¼ïdæa  [8|Y^^ß—d€F,ÇÀP—õÜh´´×¦þvÄ €¾OTÕã±ÞéXàæ@1(MÝãoʽ5vÚ¼™ IÈŽ/±,°O²£ ú“D²h¸ ÄÓ HwÞ ÊÀq¯a¢XÒFsðÍÎná±ûEê;SúŸpfr8_æi\¢^ãL°¼ºC*5ey®éòÌÓ¦BaÊ:AŒ¼¢vœ-ýÙ3Ô´G½ûê­wuóÂÕÄÚ«%Kb?u*™¬Óˆ˜Ð&s9U‘žÂÙò“’iÔžÉÄkÿ¢’im÷F6õ3ÜÏv×B£òOÝ=3aß wuãÒ±}Eb1¸MYÖúžÒ. W¡·r0a~þçÂ~:W©4N–²ŽƒE«½oÉHœ}Lïh°@"žsLÒè..·­‡~Øô§3e-6u½Mäû, ±]m£Ç©éd£éRç¥{÷ë¥ÊŠŸþ¹{##`bËõ›úB°ž@š£Õã@Q äÄ ,™jW¡¡“˜Ãè´Ö—Î<ÌLâµÏdÆ[ŒáHŸ¥rƒ¾?ÓE°ÍzGŽ(Û{Mà÷\OWè Y Ÿ ½¾)Âò±íšùç¯Õ« N³f£¨ŸI†îD¬·á køeÐöMA;<—^Óæž]O#ruôÁ¡Få¡¶ô®ÒX\˜¾’ •0rÄ5‘Ù‡h˜¹0ÌGRûù°ƒ£R3G›+DäOʯ—j`éÉ;â ¡çp×ÕzËtÿ0YÙm.½âJ‰¶¥ýÝGKîû´¼®x5JMòš¿« c {ÍçÍI].µ»ð—×m¬AZõ)1ë•o¢Ðâd6H:ßôóš½7–ÃïS ó#kÞÛ_\(kJ;<Eù}x™­DZ/­*^(2ÿ)§%ܺ:ÁxÔ?õ‚qy¹åÄå¤Þæ(‰rÖ©àÛ¦ÉuÐ×v/\‰¤ô‹ ò¹„k“tò¶’1‘\ÿÒ\±üûOÄ,É9s·„3±§çdú}uÙ€UyzjóéÚ3J±Çjƒ)yçääíg¶ÒŸæ7Iˆ=qCYˆ3UœjÉûbö63$7âÈìØ³/<:­ñ0b:»u’]K¹œä†äšÁz˜f9Üß-ÒsìXPMr6ñPüb['VqÊš×”l¥Àƒ ÐûƒJ§AlÃ.¨ßw?‹¿ŽiÄý¶¦=8D«KnE„žñ,,iÐÁEÀš%AÒ^c…‰^ýC«ýe=ó³pCöp5•¹ÝÞëæ3QÖ5‰K¡,Éò¾«³F¯ vä;tv¦Nü‚ y„Ë ·3¢ÀùO’áÄ6wû+ê9/÷'j`ûf&Ù—=m’’ñGA›FA¾t ™6Ö¯éyó_¬6M½fV8h0r;Cý»,NöìŒÙ¦HDmwx0»f墣ým=9î^ávòŸ4 R|D1(üùBϽwègÎr—<¤ùml(Ç®`‰W›VjäxJÊÂCzm;">· ö0ìëÞ3ªIZMgÝvô³8†{Áƒê/:Ëaf¯–å gÃõò7(¬´Í§iB>¿>ŠàÃ2-Áqz¹ûJÙÞE<¡€Ø¸®TzrOë&ú=ˆD Üóó’ %{¾#/_ÍÙõ ¶·)ãÝHA‡áÞý.>W]9—Âo^¤ ,¿Eýo¿ÇèŠ ¦W»ä&Cãì«îÐZxé¤ÃbßVøsØÞN?i£×:¯á©D!,=‘AmB&ÅÇÖ×ê0«g÷ЇZNU'FLÿôKšüáÈÊvÖïbÿÀÎ@Á>Ø@°6c<˜àË{ÛcI¯ˆ… ÷¹«"âЦÿ+:¼ï°Òs—¸R:(x¾øÕ(—G4ÆÅ³ ìk)J:enÌÀ«Ôï-×L©töÏl„0sß‚€üM„7*[œ >Ü«%h4g>"'ÒoVQ;…Ó±äJBs„ÞAãtOåFbõ Õ#örQ4·Ùú+Ññ%Ê;œ¥ÝŸ¦»¾òR-ɲç 9’;bd’‡Á)RGÁ{ÊÇB¬Û•>cbØ'dØÑ ÷ e9‰°ƒZ°i~[Û•¾¤ï@‚Qi±‰ò. $qÊN¶÷iÅñÀ² ˜S«A®G:j[ÐTã–/…½£äýlL•¾qÎ)¥ZÄœf®Eˆ±S]뽤‚LtqØã‡Ê¤Beji‰K4ÅV‘½81ΖYYH0y–}Õ<¾Â*‘öú*ÛÏäÔéÕÁÁ±«7…Ãw¦ÿ"gµÁ`‡žÍ‘+gÆ®%Æ…^=,m·¡]Ä¢>—†Õž«CüÙ‰Þç8l^¤¡¡P…Ê*B–µ‘ i´“Ý<ìðR·Þ†©­Íï&&åY¼lÞmÛ¶3¹­tB7é.%n•PÇ;üH®ÿ-}ÿé ÙX¤&ãS‰,Œ‘ÔLäó4c·ÿ½ãíù§ÉåÍ™lË{(*¦m]¨@ã´»÷'t}çp¯ $naq¡Âl>'̉FÌÓ’/‡·Š!ö×ä€ê š43ÀsƤÂrs­Ý½[Ú®ÔœKçåû4™|ïMn¸¬.Q{-ú‚¡êàÞÜŸduÎX¥‚ck‰‡ æü³]-Í¥^©GøG ÄZŸƒÆã![6Ò2Rq)ãøžáqÿžžØo„E,Cà÷ëƒÌv àÂÎÁ þ~Çõû~’tö 3ã K" ´%íåc÷'sÅŽ æ±!Î!0ˆ½¦é(°¡4ÕP«•ïDcí&6…ˆ¢’Î_, ÚÇü Z°x 씯ˆÊ rÙç>•-)±^oPh†3mb¬¿âKabƒSèb²(‰6»=ª~ Z“’ö2”Fy£¨ežD“ˆÈ÷«`‡·†eI%?ÌÙ×z~æ—ô¦œzÐ!ä¯rîìl± ÂS¬iR¹¨q?ÈûµR‰†/š½}«C‘ ÇUV˜-ï‚z•ˆvõ|o”jÔ¨I]MÿcÜ0éWÏdZÒX{Þ5tWËè–Ÿ³dÎ éVH0–”˜߉„+ÍáM±³ÃhNÑq f’RYÚÙ óÊf YLÓußÅ­¢Ï¥Y`†ëbƒQµ*|{zÈÑ GÅÕ6—s³‡Å/ë.,fTpÙÈY Ø%²óº“ÍRs¥8#¸ÎËÖex¬˜T½ä‚ß0nâ'W««P° ;aè1'˜ Ó¤ÌÉ툑âŽfmq{¢iK|ŽÐÀƒŠ Ù|™•?\¡º6-AOHù_…œ¿üQfÙÓ¯m’¾7ñMár°Zf zÝ6¢hÕ?ðÍW–Ÿÿ¼þâõçL((î­‡®ò=ðË„ OO 3nSÉ㎹l#œ›æ' —¶øøfD]Ää„f?G¯Ø›Ò.½O ÷YFK÷úyH_«ÍåÛ ÓùÚ„¦¨iŒd·Suà‚ðœæED›º—”ÉÝOä‚Xí­QÈ©Õ+•—Œ¦Ê>czi´à "Tr¾Ž&C»A"z‚×a!½JÅÐc"kòá¬=qZs¸o‡û7í1¿Ëµ†ž!î$‘ö9ŽíYoo /}²«$œ‰^ÝB/½Mµd¦o®´’¾Ÿ„„ò!k >GïöEø|n¶$é?ÉæÊ>ÕÎõkó~œ·ÞÉ=ìw ·–ž#õ^üR¹ò«Û3(C܆ºÎ‰ÜÓÕwz`$ÄÞs;3­:.!vÎûkÆ)Awªe„9ü8–%Sç#‘®– 5N`B-݃Ἄ‹l¹t”î êH&„v3¦æÖ‚ô'€ªœYƒPŠª$.ͼè!éõUÒÛËäæZµfü¢ËŠ/©¨l¡·Ü`rTb+%ãt¦Üòœk68çн@‚W´VžºíÕo ]ºÓsgu¿Ÿå£¬†‰_J0¯$MÝ£9©ýöK1ʨ "óZ`-; µ¾TÀC}öå æØ›ð¿ÕÀS",þ&Œ¼ü69*Õ¨EE™ÖÝ­,]‹3Qgu"3Ý÷ѳp¼äIè…à£<êOÈ’vîÇc&oÞù‘Æc“*RÒš‹Ò](6¿$pÎpñ ¦4µœ@vÎ’ ‘Sº­mzôç&Ô¡Ñ2õ…L‰uHU;$¹­U€=âÉ€×Þ,gó–BŽlóØÿ¢µL°Hh¬Ä¿bsôöÐè8 ™h n)ÒâS>ï|D”åðµìxç¢pW†æ§!odÒËâ3¯8Œ\Ì:V Qm0’ÌAûÔoCùuní6ÄêFŒo– &¤Â‹|“ä™m\Þ›LÕäÛ†±ù½™­Ü5•ÓPÛk½Á9Ìը÷¨x:Ê7;;ÝÀo mÌÜÌe>±æÒí¯‰F9x2÷ì’_R‡¤¾ižZbì  ¸È¤-Pé­`]¬ù HK—ŽÚ]™§ÀËNíþ?J’* endstream endobj 81 0 obj << /Type /FontDescriptor /FontName /KCEGQN+CMR12 /Flags 4 /FontBBox [-34 -251 988 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 65 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/N/O/P/R/S/T/U/V/W/Y/a/asterisk/b/bracketleft/bracketright/c/colon/comma/d/e/eight/f/ff/ffi/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/plus/q/question/quotedblleft/quotedblright/quoteright/r/s/seven/six/t/three/two/u/v/w/x/y/z/zero) /FontFile 80 0 R >> endobj 82 0 obj << /Length1 798 /Length2 824 /Length3 0 /Length 1377 /Filter /FlateDecode >> stream xÚ­’kPWÇÕ‘ˆãƒbä%WœH²hˆ€¶†G,HB R@*uInÂJÈÂf£ È£ŠÄZEP|#jGð1ò¨¢hAaªµ F* U«Œ¼ªµÝ€Ö)~íì—=çû?‡1O,qåËðh(ÀU¤+ÂBÄ”K¦‘‡ƒP…Ô÷þo͸ËüTR\†©ÀëP‚@u4jƒ¨ˆ ’€©dP  –"f³T8I”5É@Ž4ãXŠ‹JcÕJTcÔÆÒ\*K9ÉSn`+Œ; ˜ ¡¦g>~¸·7®Mruó®î‚¸›üŸB©†  ŠÝ-ʾ÷±£,‡P ¥4C .õJ_·»b뉿#?˜°ÍFJŸL/‡W¥ìÅdÉîþày ²øÙ¡Îòmµôئ9R¯]Ä9«\QNÔ«Ã'ËõK·§qkXw%tÝf}þ´·ÎŽÏük¾*(ÚÒiãYC<Ú“5ßÅðj~jƒù~ÙïÕG. µ·Lµ0dÇBkžá¸iÛÄÙt]Ûï·íû«Rw×/“>ÿå^ ¿˜®è›äŸO~…>¦­‘¯ojrîæ_i~Ò¹aŽìÍŒ œšHm¯]¦Cãe¤D; O±Ijý9Þ”~+³'÷ÐÀÆ 3Z÷Õ¶ÆÚôúNv^ÚŠKv¶ ż¶npå¦à´/št¶»ÊêúºÇ¡gN!?1µ>š2\‚ÆUî´óíML8vaÙP(=7™µ²¢ ââ µS[.X"_4|òF˜‰nLÖ» 5åƒùU1ÛzØô®¾Å7ZW?J‹›`nµocðšJZn*x;9÷JW{öÕx$±ìX@ºË_ F"æÈî•n\éVko{~ÉÐwÊo-é‰6Ù‹ùÃYsO^æ4V\–W˜r§4¤×ï)ú$衼H4黢_^Ø!ê|Ø‹gô~*»ÓR²Ýöæ,¡é‘÷œúkN+·Vf›´G–:Ï ,z~Ô3Ð[XöÍ ³¹“³iŽ/l.áoÚ\']Û„¾¾&Ì´p¶7°¹½àʾûÕ¿M 8ÄÎ:܈-%sE •é³OUµNô“ÌJ{š_ÙËÙvµf-÷k´?zlç¶ò|‡Ks¡ÌP–½viÝ€¨ðÁ6§¢=ü;žW_ÝdjÂÌ;qúLénq“eWÄêð„ˆ7÷ ¢RÞŽ¹Y™ÕÕ÷^ténb>óq‘ý}XYÂwkñYË(13»J'¼ùté®Í˽õ·£†ÏýdáY°:(R ±¨Xkõ&³àòБ]¡Ì»ôU933Búƒ¿ž–â2³ÛÆ|¤b­¨µOŒM8­Ùr«~>° ´8غ£0)ƒåYf:y×®ÈÒÞñAF¥Éà‹ÊéNË™‚¹)ÍÍÚ0Ôg§ñóú|švÖÝ©õÕë3;7t¥ú^»óëõÒD)³æø†)—{Jn”ÒN2ÿ£˜$ endstream endobj 83 0 obj << /Type /FontDescriptor /FontName /XSRIDF+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 85 /XHeight 431 /CharSet (/backslash/bullet/greaterequal) /FontFile 82 0 R >> endobj 84 0 obj << /Length1 1073 /Length2 5131 /Length3 0 /Length 5810 /Filter /FlateDecode >> stream xÚ­“w<•ÿûÇ‘½egt+3çàØ{“ŒBÆ9‡£ãŽcï=C2""B%[„p‘‘UöEY!²>}ǧßç÷ïïqÿs?¯ëº¯×ë}½¯›Çø–¨* ã× q¢DP70Ó…ˆ˜’O ·Ç!1h {\€ÈÊBUO'"ˆCäÀRrP J>@ãæ‹E:9ãAu¡¿Š¤UW8éh ìqÎp׋Žö(àÆ Çù‚U 0ýë ÀîÇzÁa J€!q€Ü ‰¦ûË‘.¤ÿ†yºý'åÇz\˜/L a4Ê€Á”b†˜ -ø…“ÿSÿl®å‰BÚ»þÕþ÷”þOÞÞ‰òýwÆÕÍÇ‹þg©ü_æ à0¤§ë?³º8{ÒQí„‚¢IXò_q¤‡Ò3Fâ„=Êþ;GÃþéäbz¿}ˆé«ªÝþ÷µþNÛ#Ñ83_78þ»ú7Cþæ‹!a‘>À]0 †\^<ÿy³ù‡˜&ÚC¢q¨`ÅÚûR‚/Z‰C¡€?@¢apîsáX „Æà.>.& 0XÊ¿nUJSÿ+ô›¤!€˜öß$uq‚ÿÒÅ%ŠÙÿM2€˜Ãß$ ˆ9þ— `0 û/ºÂÿ@ @Ìé”Äœÿ@( †ü/Tïÿ²¨?ðB×õo„\è¢ÿÀ ]Ì(ˆ¹ý%/çv±“˜?ŒB.¬`ÿÀ‹Üx¡íõ7Š_ˆùüÝý~ãÿ]55Œ¿¨„ *…üeS†‚ÿW¡£' Gã~ÿn+õF /¶÷;RNŒbå#\2j£^i ¾"òàÌ,Žèkެɔ}Ÿ•¿ü [7`çÞaˆdpA–ЧoÜ,ƒ! ó쵪]þ·Ä"Ǻh˜„žeÝ"ÛrünmKÔÛÙFçšûuâê²[ðÖäõŸs^Í$åúké|ö8â—c£§»A÷ƒûç'¨SÚä6ê§ÁÍWç’{Öµ1˜‰ÂnV묟Œgìm3Ã÷§i2eãs .¾Ø¾«]ž¶%ø²Ã~júñû€Ÿ¦Æ—v§VZȪV•u‡3ó›uw|šRZ 9Â.Sq~gŸ¶ˆ®¸EV.ÖKÌÚ‰Ñ09­&Äé-É” åñŒ8¿Æðõ½ ›ò÷P7·OirbÔ½f©uº$OSWü%¤(¬>äúHvpYháç·NyE¨¸¼©nyæôFÄR¯]| ꜚúæI)u|OûÜÇ”ƒE)žkrÃWÌkúl7WñÏâ¿Ô5cu°ŸÑSbÜ'XT­s·µ;Øj’}¿m~wA€¾ð æ=2k5|6!йNèF›õg÷›¨c¦-ÚÜ•`Šæ#É;6Š®™ü%m cSŒ‚pnuÿc­Ižt»©„Ý7ƒR¹û¶$wx‹ÎÍ}NàÑ0¤nŸøÜqTIý1ò%Š$¶êlZœÑ½-Ñ{6Ãnóó}c¨ Á)Døªž.=­§½|Ô5§·áÓduÇS·çn–?y‡<èh—‡~Èé}½ž¯pêubÔ$ûH{ígª£Ù<ã¸Ý‰†Ë9™ÆÏI>ï€ôÒ꘡UèLïÂõc/ßúº-$šâJމ Õ"ÌíŠ*ÞèÅå;:»¤¯‹_(A?7P ¹¼³2ì© J9›¸keͳÒBSÌû‰Ì¾WÚö^}B³(ŠæC‚JøÜ‘§å½f?¦It‹e1pôh°šÍôzeñ¨w®lÙ#6#yìÕÁ2×DRùO>Ä>6eÅz¿ºÌÂëá¤,·¾Äd‹F'È}¦MRþ"B»²Fÿ$lËŽÊ2ØŒ‹iö ¨¡ë?â'ü8ÌbÆpd*äi—²ppGžöêQ&*xK9Sîwç×ë.Ic§Ech°¢¯Äé±ð¯]—ÚAþ®ï/ZÍÔ>^âOõ÷ÓéÓ9àbd??¯:ºh€½7$ò#8Zj¼Ðãîç»Þ}‘­ U¬ÍR·8õ£õdÑPu%ý Ú'1 ›³5v„4þ.ˆbäCï fÿ2°ÉUüvôŽg·¯%ñ#²'$ÔAg«Î²òwJZŽÞŽ¿­moIwS(Ë¥Z|ÿ}íZôÃZ—;²zàH8'ÙG3»y׸’»_ÿ˜Ç¨³MAɽ+ñàé æ XT{΢ÝRzøµ‰ÕPä’ù[˜×ôcG¬±–R›ãÈ×Ä›{} b^'%ºGºŒœãõƒBK"›¥Î(ËE ¢“ý²cßmšÛ­ƒ]Wokväå÷Qt®¢VÜÅ·ýKm'û®XxÅ¿aÓG'зqzðn ªµyˆ,°FaæÞ”§Wø4ô&ðc^êQ~É:zÒYlfú|"3ôðŒÊ"×"ñîsE²µa8œ÷µß3Ýï¨,7ÞÐDžyü/©¼1ívƒšõ¨ÓJÝp5º¤#‚¨7û'ˆºév8ùoM£¦64ží`@º§¡å–P°À,­ÖºÈÒÈNÂÜâ1Åa3Ý;î¦éoÝI)„;¿B¯SèÅÄŠy´ŽSݲmüH"Õ^±¾È—½ùª[G÷Ö ›„Jk”¯Íã7Å—­«+Åw¯c<ÚjÄ„FcsÒ X¬ãƒús”=qú‡ÜPÍYZˆjL¾³S]ñWf “úÄ¥°aWíÝ ½‡¼‚u0oœeÃ'é]¶èKÂmIÏŽ¯ŒÜ½¯‘(UK±æon“g²ÂT †½!{n¦ bEJ oÞ#%ÄÙðj¥€4 ·ÞÕ°ºõ°îÆ›2.‚ÄÑ÷Oµ³á'µœâ§Ô%+W8çõlà§,Óã—Ák÷˾hŠÕAÔ±…J7FXÞÙ­’í–hpr}k5Ž…†¦xñgúÅñÕèâš«kêº:ÁÅ\sã<«NVÉôˆ¹’äÙ:Žað‚ü¡6q¦´ne3Þ,û¦§“aÄ!ý´EÃ']s먒œ¦Îˆ®¹)8jÌ'ZË­°™bøý:mª¡Â³±‡˜Ìajg~»ë*ß¹½¤Í”½U|¢U;Ð÷Aåûü ÍÍ*z!¨ïËiðãÐEÿî°”›t¯ªw‚ØÐ qcÖÐwš†‰·#žòž‘©M÷âÞ\éÅíaäÀ ¶Ä5S\5–jód['ò·0C–êØCÐÏw”Mì?.SR’OM‡ÇÄ!ì+»“X~¼6+×hQ?OÚ÷–½Ä\ðx«º¡¯š¡´–]ä#¡§¢eD ã@¡r_Wœ"Áƒ2ľw$ÍLsÊ ò% G“´±æQ»ôt~[÷ÅTˆâ 5t½Û¡çýí+Š•NDJùìQÞ·×*•ø<_ÖÅÏî‘Ph‘Ÿ5”Yß®ÒË[dÓõ˱¯N=¾¼oÒÔ¼¥qbc6,z2ÆÚ¸•¡Ÿšz‡ƒï•&K×n×èS°óêX/FåÃyPå/Ï[~Äš)1¦ ¾[´þBs’ô‡iÚÐoΠÔ,1-ºuþ±Ú|—/cwÉãFÜQíRЍ¨ïÃFºR9d¹éX,«¶ý˜¢ Ù­d}OkÓ_O¬IÕ`23p—1h n9ÚÑHüoZmŠÕí({y6¿­ßzüCØv7#°²ê”×e(@ÓO–V<ʲ$ͬ]~1êœgÕ{%Ú=Ã_SO\ý½«D˜æ`£(÷¢“dÖÐiâì^•Cí¬I´$ÕM~ñן­ˆ–M<Ãä™gä4`¹Ö·©ô\uèßxrï1fkZ Fƒ:–Ê<>ÿ¤›øqK #9¬‚º½·&÷PVù JåPÍH1‰7¸xÊy舂QX%,ÑXÓÆWã±K‡:ì—-“t ¥î“ÍÏTÙ_pѽà«ÅÏ·—¯qT1‹ýòšoº¤¨éb.ŒubmŸY­»!Õ™:#ÇÏóD'ñsËÝdsRã·Š9çÑ_^Ù€›œß?(…ŒgJ?. >ÐÍIè î;7öΈ1>~"ÈQØÆmz’Ïí°(¶<×ÚB±6Ü|ÒWûúŒÆ$š,*ã4¤IúÖWë§aô•*à<¡¸ üGç3ó¤/ …ŒÅdc‚¾òÉütçJ„V]»YZ[ ®]Võ|`ij¸ÒÕþã|‡è¾Yø1~D±¦‰*›IN…Z|úµ¼¿6põ›,|Ç4¯[8’ü%×Ù§(¨“v$ÜqlÍ$ DÄ¥?Ÿ„uM¯©´:œëí‚‚“™'˜ò *"üMcCÆd—~¥Fï è‡÷Ñ’Œ€VZËáâ§òcáßæ³¿oRœíÆæ ;ɾ±hZâèa³ÀßÊpï':õG[†OÝT•%—åNõ#‰—+Gœ|£Ûg‚Çm(úÊT8|û¦_`×U—š$aIˆðŒ»}u¡Iý²«#íK -"².TÌä¢{Çù¡Ma.ã§[è­o£øÓ|ž-GÔ-Ç@©vZâ}à0CN²!²èB¹ Ï+_ËR1ß‚ІRf„ؼXo ¤s\Õ¿§ãŸkóÔ›‰wþ’ù¢gÅ4ÄC:²W…7%ôS¯(ô%v,k:ä8Ó…ƒ¼‘ý‚}bR)ÏEëÌ$¢+¹;l :o6»RÓ&OQW"RH}Ï2çu¾Kϯ¿—ºãëyT©$‹+€œo4*}’ÌPq²"ÇÏiµïe>£øö)OóF>¸ªÍ¿f=¾Ö´öcô5޽+‹©;;xBÁUÂ}º*f‰¢·”\‰uÅ×ÚUQQº #ž¼GÓ]kyå-ŒÔ½ êèïa9ìÆaÐ4î-*QN!©cÈ—X}ƒ+Ïã~m3yh•îäV {44xb¿r£%‚F÷â7¡‰Z\,õ+¤ÞàúÝûU2ÔßU¿~Íl̺úà[òÞ Ù39ÄäÄ=wšî—-&hÊøò’ <£)Xhóšqi˰Ä*¨Ò««UcN“%e½.ÜÔô{ÓホfÏBÝïUorô/šžàbà¦%ïù£§àž>{ñôE>ŸzäÙ@Xº»‡ëN^mH©0¶ò‹î¾¤ÆÉå܉q_æ²ÑÖ µ¸ªg¹q½¢Gö!Ç|S)›ž“„íÄZKn…;…sÇŽÛrDD}™l4Êc j€˜~YÇXÇÌvtÅ•b÷³Í«ŒÜœIJ‚^ÆÏ]í»þø«%!y}Ûsµ<-ºáÆó² vÃHã^„l7„ _/!—n ®)²ØÂzR“êÝ{ÈQõÍRfžøê­fÞ×!MÔ½G¤â¯6tcX„G_"»OΦiþ=¿öWsæ—¬Ú×ÝTSQ Ä·}ŽÓƒ ÍÀulŸƒèÈ™ÏÜ\Wµãˆ\æFnÑUY -Ä7÷1«,zȨ¯¶Ëè:¸«Ý™³íÍo¿÷ ïåvó·c¥ñNÿéf}?¦Ãª>Dò ƒ€îÉTÇk©Š Á,çÃ|ûŽO ÒJÈÈ7º»W*«öØíe Pë>¯Ú-$r%-EýÝ6ÅX{_fÓµ_öyI-H›VÞtÎ2"ܤiŒjÖ¡ÆÀzb¶D¦³£òEcŸrZ›ýz§ÇðV6±úG>-󃼽,Ÿµ Ë›;9wUñhïõ)Ξ¾žk ¥.7“'oË1RJ‰)“çƒe›_¸x•fÄ’üRŽªM¿$ *ò¾«ì·¿n#¼3°J^(n4tlãEŠÄp5NKsFä³5×Ì£ßΆ´³R/YkW@†~ʸÝSx Q 2€´÷¼{6'¡¼¦*Ï×#3äYûË%h$L™Ú]¸¾«*1Æ…ˆœúÌt m‡0rÎËκ‡¼7±òAuò”Ë[‡òÄ#P3zPÝ8Ù‡võí»Kϲ»ãŠ}ϾSZ…©ÙÔùÏÊ*ÿ„R. endstream endobj 85 0 obj << /Type /FontDescriptor /FontName /LAAMOU+CMTI12 /Flags 4 /FontBBox [-36 -251 1103 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 63 /XHeight 431 /CharSet (/C/G/L/a/b/c/d/e/g/h/i/k/l/m/n/o/p/period/r/t/v/x/z) /FontFile 84 0 R >> endobj 86 0 obj << /Length1 1887 /Length2 11092 /Length3 0 /Length 12144 /Filter /FlateDecode >> stream xÚ­—u\”Ýööéî–éî‘”né`¨¡;¥»%%餻$‡îxçyÎ9žóû÷ýðßµÖ^×µ×¾ï=3t/U5X%-Àf@°ƒ++'§@JIS““ ÀÉÆFG'å 4uÞ˜º…œ‚‚œI7+€“Oˆ‡Wˆ‡ vôrYY»¥˜þ*âHÚAæ¦%SWk =´‡¹©@lºz±$íìê­p¨]€Îî@ 64NN€ÈÜ`´9 ±ÿåHÞÁ àÿWØÂÍñ?)w ³ Ô€j’ µhv°óX-ÑØ•ÁP- ÔÉÿSÿÛ\ÆÍÎNÙÔþ¯öOéÿäMíAv^ÿ®Û;º¹J`  ³Ãÿ–êÿeN hr³ÿ߬¼«©È\ÒÁÊàøWä"òZ¨‚\Í­®ÎnÀ¿Ã@‹ÿõÛߨÕuÞ)Ik±üû@ÿNªš‚\5½ÿéúWõßÌùÌÐñ8ƒ<úlœÐBèßþ3ü1is°ÈúDðòLM½Ð ”x>œƒÐô„fgs»B— 3ñX‚Ñþ:O>^»ä_¡€ýõ3ñØ¥žIÀþæ™ìÒÿ?€]æ™8ì²ÏÄ`—{&n»ü3AÕß>T]ñ™ êJÏUW~&¨ºÊ?$UW}&¨žú3Aõ4ž‰À®ùLP=íHÚEï™ ê¦ÿ'´ÔÔÅrÙYÿ‰ópý†>b Ûç¥P«fφ™³©¹-ÐÕhéúçþ'þ¯—äŸtoæÿ/´™9Øúªý£ÉóWÄÞþwPë TòÙ#ß_ää}Ïž  ¶-Ÿ%þ"°›óy¨7«çмÕ_·ðϨ ëgOÐs´ör´:üQþ@èmþ@è|mÿ@è6ÿ4ý3rB÷÷Ggè5Å~Ö†Ö‚€¤¡~ŸÓÐµŽ¦Î@‡ÿš>ç¿£ÿ={n¨+G ³9ÐáR¾¿c ðó„y óq´ssy^†“Øhaö¼ nÁÿ[ƒ“ZüÇ$9¡szîÄ ]ä´ý÷™óþUtÿc¼¼Ð&.Ð+âKPç.v¦.Ö4†–å…îØÕÚø<(^èd\=À,€öp{~¡šnÐëÃÙÅìüçx¡GåþB {üñ¢@›zþPU¯?z4ÞÏž¡¼Îÿrð¯ÐׯÁž>¬œV.èxy¹x w¯ß•™»9CÐõï'è5ü¶Aïl Ðh޶06±Io+ó—.œøŒÈ ûÚª1A¹¶cº=øG"¬]ñÐ['æÕÝ»/YøX;ˆ;T¿É\¢¾ûªÊœ9%dÌ>ìdy#Ó½ÈRòÚv¤þ|ˆÝÒ0syÄ «2µ:\–ò®¨÷ÃYßa¾*ãÍ]äå—0úîuÙ!|üº2YvZá¡5ôÜ/Õq2œÊ"xÂW.!¥õöµ¹Ôº4„`;qf-…´žS‚vgtí ë>ŠË$7v¶zIC—ó‹÷*Óxl3jÒl™Œ3ä–Ðåglö©Îºé6k~÷µéV€W¦ß5|²!3‰wê¯C‚øÚ®†Ï\¶¯¸újt­Â)çkãa8 Wµcbù9K¼*QË vzó™züµ#X­!üƒ¾îD)çœ6·bÜOþèìTt ¼c˜¹>cø¶H'iÞm±JÃí™á²pÇt,V¾µiž#¡+¿Ù¥{Õ›Óü%u‰Œ&ÁG=›Ì=Óµ‡2Ë+üƒìóŸNèM§…º_Ê Eüõ†æÚ {£!Ýã¨ÍÌLÒEÆç‰à#Ù‡TÜÃÓ«i­6Èà±n¨¬»PïYõÞÔS- ü´?WÐbΦ&7P‹¾ü^ˆƒ\û®êÙ!B´¬µ‹Üê7°xŽÆ˜öÊ4Þ7QA’ѤJûÓ0%Ü&XÄXt<Ç^9—ØW«àûj²±¼·pb-Rky¶»t®(ß–¬Ã9‹nϪî=6íd{|¿óÜœ_·É‘u&#¬À W¶bâÚRet]’Ž:/Æhßäñk¯‡büd½Öyºä÷‘º@)üÉ™x{ýÜ‚±ÈK05;̾ã]ëÑ×J4Iõ4G‰ØT‹{¸7¡Št>!®#ÿ~S—”$ŽÛ5CØôëG<£9Gƒ¶m*ýäšáЉì¯M>¹\ÅKéíËõ£‹ÆÔó#ý×¾39×ü…•[b}Ú¶¹ ÇQBQJÏÑØ ½sª— tȵAóéGUdÄÙ Ñ"DWº6÷”‘µaíaIá²æíÍå-À8ƒg̸ëC3×Gíל ß ŠK#ܸaˆ¯LŠ<®þÀ©ù"¡ÏûØyèÛMA|TCÌ/Êc*ÜHÜPzõÖÛôcµêS³’ ”…èji%ƒï¸$8 ó Ï{ á$ð ö7rœx#â£?úõà%iî¨_í&)¼ögq&ãdƒÀ>ª4šˆ¨£^Y>|Æ%›cà骩Ѿ#²íqÉ=u8 7KÁ~ã9N#Ý‘»™ÐeÎéWJë@u /¾+öIšÀ…ÆÚ¦á}³„Ø[Ø8«Ïð¾ÈnVW3­¨Gc{.Öi syh¾ÀíÍÒî®y]äÃýŠiû›€Œß/×ùkRwJ˜uÒ[8ý„X£Ú+ÃÆÌÒúŽ…½Ð¹}î.‘Ú?ðQ+·b¥¯Kƾ. \šºIHó30yä×S?µ~Jm™;»l¾cE–£Z/_‚c“ötç詺8Q+Èî°¼–TEO}kÐôѰ¶éjí#©­Ç›Mx^d˜tA䯮GI¿ š*ë(Ï4Ër!Ç’9¶œ>¬!¢R¥‚¯;‰§_²ö®Áî’;„»ƒí4êÃ>¼þ*•/àF”º&öDäì`fžßÕütñ™Õ± ~ß$d{ÿ“+.‹Ç"z%i„B˜4e<,hÔ.ñÕ>Éünq„£¹‡iÎch÷Ë/6•_ꎨšU›ÐO¾Ì«¤^ȱHû©ƒ›°G†ÛúÑdì½gôúEþÈ]ý¡aY\š=náÞãéÞè©©]LCø¥Øu‘úkLÕ—CaJa£Žär-;ˆ6déDó4ßO;Q[©f]Û8a³væ´—³Ê‡z^gqo¥Rì&CĪíÙ85øn$Ò‡ö'ƒê.¾”mzH†;¸0ìÊp½³éŸÙ)0ÍŒä%BŠ¡b ¯°ÿ*÷ÔlÕ½‰ëŸ#ùùæÅÙ"ç‡Ö#Éõ{I‘Ôlå¥U‡-ÙÒ1‹8ygÊfâýåéÑ&êW@¦·¢ñï¿×T eÁ}â½[õ¢%]xÊ”¡R›´²VÏ3¯(rµûÝL8a¨N ¡õ}Rx¹GiÁÔ<÷D±\½Á#¯Ldõ™â=]îc±ˆûlê'9øc4î[EÙ.ôû=ÓVÎCVZÙ^šBsªæ&ß—Œ‹ñy69ùáM± M¥n©”!y±AÎG•²$a‹½2`F°ì)¡±Év ~By!É NzWg¶[8]sn=Q¨w±¬»:é“Sû ZVhÛÈ·Ã¥¸Èá°c­;_¸ÒÙ¿¨©"}8Ýc:Ä^„÷vÀ±1 ‚ßù´Œ¥o£¡êgíGG©š¦ˆÈ1[´œÕ|¹ËñÒâ}Ï‘r³)ú*~¶»Y-Jw®«˜ÍÜmÊ’ä‘ϯÞòOº½H9_=: ±åqmÍ"ÖcÀó‹å·ÑU]Ü0#ëq™Ösâš™ÜÁ\ÞÜS¯Mð^ ÿX¹QÿÃÛÙ;¨·D'Ä“‘äàh ¡P~<­{9W(ö£4 þúGW ÀLHYÜduæPª@“÷–qÁ;1½¯Õö7™tË Ã…zä]¸Óñ‘6Œà›ž„B†òr«…NžÖ°Í¿Ê‚d£œÇc“ásl·Ú±‚¹ÞºÅ«»ŽÖãB çâ¿å§y¬7ć7.¤—eZ1}úEÉàôÆ7F¨)'¦ÄrúÉ»yœ£$2ë¦;“!¿-  #Ï-6š™ç¨Ù¨Ú¨/nW8N®&ÚH+nˆ÷ZÍ‘êtç[èaÚ‰Ñ>õL Ìý´¯n<Í ¹¦–|ÉðÂÂç7Æ¿i~êŠ`k5–A ‡_|–:WÞ˪{Ië¡1{ࢠ0×"Ø–!ûûFàЛÜiüÀ‹Ÿ[¤t•8 °Ðc¸¨KÑ|p)¶¶~xó ºª7.6½Z™<0dì™s‡æ>þ›Iz_oTQ_šó7²uílq³âªëêgaë*ւƪXT,J­x¯‹æ¤/HSVº1p¶Ê¶ N0Rý|  ˜Þ΂(G|{Óɳη”cq²èk‘¯¦7ŸlMg6wt‹d¦3f4% þ(].XÒ#Ô£í®;¸ÃÌÎÅjQ˜ˆ__aùt–7/¶ÂÊn§=ʾÓ]áÇ[²ƒyg(ÁòR„yPÂ’€0úí— {ÿ”½gGxdÜÞÆ¸¿´B2±€y°÷°OŠÄòË¢,¹¸Þe-zP¸›>ÙHCY82.3x«x¥¥;¶SšÀ(¯2"1áb1ó$ùËa*€9ˆÌ½Ð–OÔÿmò˜ _yº½}h³X^wnæÈ²Âàc›™nÛuiXb—E¿-„¦Ìä:¦MŒIh½FN®;ª:Ÿ2x •nÕ”<ÁÈœ¯Bш?……Ac]b7ªÏ«®îV´¡bŠ&Ó=ã2µÁ͆BÊð‘ë'@8@‹^û]UVqCö:Ÿ4â÷É=>-NÕ½îéÞˆ›”Zùˆ1ÃÃéØZåÝ«°qq˜5ܶÓs/œ#•kºHwô5—‰ k=Qô9#4jÔ,eGÙ®ù À'¢‚_®ùvRˆþvàŠ´-²$S1$ks‰ðæ&í¯º‚» ÜûÕ{ûZqÇ·Ÿðr€c|¸!é Ë,D¾¦ÁœvR 6')ð£q‹wL Idœ}ñcó…õÎ æG,6|ú`¹Òwæ\­‹ïÉ(¢)vN'Øß ßµLƒK2ä®dÚú¥‡+MzÛ3ùÇ)®|ÈWtÀçÉ­›¶ÖTJÁnìËXÉ~šm ‡|g¨Ÿïe ÓBHœTTcGz•W±ÀL—™ úK…/µMÇÝ‘—)ç”>º>–øë–æ<¶œVö0‡ÞŠsrœg¶:fܨP+œ+¤ð adùŠ`›»_ÁÏ”¤Wg&+jÅt/ÃE›ñœ,ÅÁ‡è*!ª”b2^ÓÁ¨Ôöv—¹G#¬§ã2q× wü3@­wûì݃]?ÄåÑ¢`Ó8C4á¡—²[Í…@ÇÝÓ0?ˆ»YpÆ-eÔç4©®3ãPOö$£µrË"®Ñ¾§+e^ñ¦Ž}®(‘zìª ê^¼™hUÛ îÙ½ C‰´¶¹Z¨E;AQV¬³Ü}sðbM3ðÂI¥ÖÇÈ'z0YÑíoGF|¯V>s…Š?br§ûqô¬‹  3¿a$ÇۙͥNûѯD&×Ì%;E>ëÞ"»lÎâleYMM ‚Õ0,I·HåSaT™¨i|Q4ÀEä¡­÷Ve»ßé…]éW«#™`cÇŸÖ;ówŸéÊ$BrBOÌ Ô6ÝжWœà0w%è¥ù30øèà·+ýZDô‰)Û‚™ã…òN™¤ÞòË-Pá?øû^öŒ|4+dž ° «&¤ £³´’Tlî˜7Ó‡%Ñ*>'‹ß°ˆVúí“¡ˆ!Xù)â‡þ6tçåjÂ|,þ†iy€é©ˆ¨Ò.K·Ä¹G¼q®W¸öÙF›8ßæ´ŸH$F6ÌÕGz—h5ntÇ'¦v gç§ÐüN<áþW‡ß÷Ãâ«R?®_}Yzç2æÇèvN"{;Ì´:g‚Ãü^ݰ­'Æ~Å¢áݨÖÑzQR­ém~xKé÷Šõ‚kA‘³ž^ï>›Â¾D7% meéwäê7´}$C¶Gß ÉBÏÂË›ª+†Íå€ñU%òÄ€ãÒ5 ƒv)%“–¤ê ô+š€hßþX?LÛ]-8Å—ó“\§Êûq-Ü¿ c8öô2úœÜXrZg¹ýû®„ô!õˆÑ”g£ŽÞX†–‘'O Ê­VŠ&´%u)‹gh -÷>>µ¾¬êÄ!X { Ó 9C¹ÏÒù—Ìcd¿°¯b3ÊεVŽ–¿ÇKdÈÛÅV+ÃéÝ%ŒlMˆSÑr!µ™-»MçÂýzyZ¡i'ïý° NäCßǸ…‡"'¼´ÇÊ@÷õ­\/`š`¸ž#Iv9ЬPô|dW‡±`§&`ëb~ˆ3O†«NPã"Þf`Õ­}Ú¬WšJ<¡û“ŽÂŽK©>DŒ3 Ö¦-^cÏOʆÆ®1í'9«±6 ÏÇÁxnØÇß™4HPÎyH¤lwžþú&‹?·mlŽøòxOúe=í5í×’ ‰©°¬OD'®*²C'cÆšå\,=Ÿ®ÇI\Ñô¶ÐM8Úø¹OÕ&…æµ¼!iFõÈp?š°ö8¤s$ãGU EQoyƒÅ+C[ç)dí‡âaÉŒH~«‡½‰-Y5wáüA[j–ŠåÐÏÚÜzï­h.ÝŸõèùaC¼]Ì~'Ö’\ô u©m¨ fbŒÞ{ÿnÛp<8À@6xÌÊ œºÀÞÔѯ®=1âô­ä+ílª~k‡¯ó«óÀ7gðW¼r¾œÚ¶Ï©øÜúp‡ÊÃÞßèÞ2ÞðÐ1·Ê¡µw ‘EŸ&qÌâH¨üèšð‹*¦ig–ºbò—á…§^êQÑÏv>¿ÙÇ—OCvíž.]-ë xÏKõ­’ ò4(í[,3M#=ºGC‹ÀàÀ†È®Ã˜ݔ˛£L+_~ú]„Õl2‡Ú%xC ø5z+vný”µ2+ýø– o w¹Õ_ãuŒ‘*é²GŸu÷­˜uǦ|ZOÎö†ùX—‘‹“¾–œÐìH¨þ‹ÊBG±‘\PŸÈå­Ü‘há‚ÉDVØÙ‰¹JxxÕ‘‡Ç“\ҔęF†;>üNRh¡¸Æž©ya‚áÆ3“Nï+†ôdÏáRÚD·qÄl îM~dӬДCØmK×åŸ24ÔŠ?Â'ã’¢M!€âKÓ§+XäzÝñŠþ@ò´NÙxïýw°ªÈ«ƒ•ޝŸ~@Z|Á?$Ëöf?×’ ²™ ÜxöLà¸ÌÍxL¥½Ãœ|)Dà0½È1°Ìy VÞ‰Ê>ÎÇa†"ï`ß Û±J[É^Ý )åìuLýPÎÞȱ¨1ttFŠóúaåDµ¬¹>TÿM*P¨Ù:ˆ¾?>æÁ?DóM!q ßMp eŸ©¢•½d»ô6 ê¬à[ñ5mé£ L1Ôp0}»{I&¹åëv ÎÄkVÇÙ¯·ï¿¨è(cò†'(Xê?ÎGÖÜÐ2$iø­‘òËœýЍP ƒ™bÒy¢V—Õú›–“¡o<(— þㇴˆÏaºwÑ­´¼Í{zD&<+[\J_:QvE ÇûCß?Ùûkûìr¨µ¸1¼A–¨ŸüLÞÖ¿ÉÕ¦ÀJ @î¹S§‹ÁwãÞ2ðY£J`Zi}Íøs4jYwÄ h~,Ý\BÆïÀ_L£C ¼y`i~ù=5•M•6 ü÷B‘â†åÞÝqÏ~òc3λ¢Î°ñÌ8ÉÐÒ1²€¯ãÄÍyùÉXƒÌMð ˆìB­ßЍ{R9ÕIœ‡%áVØ›f4f#×Bäá€Ñwï9e×hú¨,Gnec*#qók=êîß3t)Vf½†þr”æ.‹Îéöl-]¥à¿ùçÄÄ1'²%×…j¼›aÏBí«£îé§qÐ%º¹W€~½¨ê, ¸tÅ}gjkð“öË*ûUšgjì;’­µÛ“ øV­«DŒKŸJEô†Ÿ.ê¦íÁ,I Uz²ùGN¯½°ü&?E½¨8¸åÞY/¬­£u0I÷vïÆ¬gë`‰ïÝGK”6ÔÓ¦™Lì%[`pã|¢ÓæGºµcµÛ¾uξ oYK‡û@Ÿ¿#B£®¡Ðü‰á·,‚Òš+zOP+œ“¨ËBa÷÷‰ÀÏ$0ÀióÝÅ›¥•XY©_Mâ_ÙÕ„÷qê+úH_i$#§1grˆò‰ûvÂq6…q]žºS´<ú ýÌÿ-[C›5Ë+ÄK3S"|›»×^iIµõ>¾À#'¨Ôƒm¤¸9scµ¥8 (­ß_c¥$S¾WTNæN¥Eó>" ³Â4ÓLü\ŽTaOxD2< 1fBÜE=â:ÄŠïŒð/À¾{¿Ü/6¨Óµœ½×Ê)OAU5Éhì`d˵Š3,RyQ5+ÞX9N0 #äŽo¸o•†óx@Õ¢2_r£»ÀXÃÆ9>´oecMÅ®§·> -:š!5GHüýa»O+zñc´¾N¿‘­±º?@_ÈppòúHF‚HŠT•ç ­$!ôgÃ[tõ kQž%1¦WùÉ3ºê!šzÙòG©§8¾5àüh~Ò-枪À›é0ÓÜĪtäj,%^Û­–|C±[¿çÕŸÞEÍgŸ"ªSìÅ*¶ˆÚ{z° š¤þŽ”gÚ·öê:cÊ-íÙÅ“çjÍØšƒ †õjÅbúØ 8Ì$‡ê“Ù Ë–òí­ M„Å\ úm×.*¸À}ÇIêY.›J6Ÿ lC”ßã•£DGϦ±;8U¨Ãâ·¥@âAÑ@•NÞ`6²1!}Wë)ÑA“—Îä7t4ðÙ¶T –‚ŒZ¸ÓZøåS04þòCÊò¤Î` yo~þ‚iÜׄ¥üâ§’1_þE¸%kp¼møˆ©:µØ?w/\ümÎã|ļ»ðç [ÜË¡õ—õ?ÎtèüPcÞz¥øÝNã{º„t$úÜÂ!æ$V|a–€Ø~85£c¯Áh“§\ 3éèûÛIÃ.·ÚÕbrÎ!G*H ÔNP€´ª>àï\éÄ ²ûþ€ˆ#Q`kg‚áÊô¢YKRJÈ»2‹Ü¿ÅúOz"‹=çò´¢T›­&«¾aÍúS^2±qˆ.¦vª_µ`·<'Ê5ùöêÒïÅ$uñ#HʹŽ/ÖB¯TH(Ê‘jJÿ¸å 1‡õÖH_Ê6¬â!ÒoиL\¨&ó›9åÁ+qTnéU˜p÷Z‘ñ\_¶Ò”¬ðiZíÎîà=çªQð¤Â<èˆÃþýªÕŽqn~¬uÚ›L•î°r!”Ί„ì¦'®>¼] SÊy9…ßUY̆õK`8žnÇÅÐ]ŠtÀ¼Ý— FVVí]?>¦TÒ™µ¼\ÌǸÌÒ¦ _H¢%Û‹+¶¥Ë~Ãc†ý‚rÁ@Žßf–YEõW$6Z´ßp°Z OÔ¨ªt{™ 8öÄÎâÏ«Š¢Ã74Þ»ŸË}ÂN²ÿU $áw˜žOÒ_g:ª‡ÿ¬õ:NUÏxãó "û~‘fÔ|€Rå“ÑÒl“û1óèS,ã:q1˜ëÅ1Ï"Ÿ‹ –4¥Ob€6|ˆ^ÔD>U”Ô¥Îa¶•ÉJêoU«*lÄ æ¨4£Xé©Gg9€û—Ñ|w‹¸°_cΓalÄ?z…iÌV,?ݽ®¨«¾*Å5ÁºF¸Å¶€‹út)pÄÉn–c·ýi?s;ˆI(‚ ;þ;FiR¹'$õÍo‘ºäã/Û4äJ1Q{ntZ°’m)0¸õ¤Q¥V;ø.æëMæŒL´(ç t•HY츹P™§§—¥Ñ_©a«›‹ù‰6ÊY.7±­–“äÀªu<†3úúVýè£çÀ1Ü š÷Ñ„{Å ‚ÇIYú¶Eü‰;-ñÓ«à¤ýÌ­×áè{îñ‹Ã•&0þ®kC¼Ã9·øY 3QÛHÔ aÆ-:-‘W:àJ´qé]$~8韺öÉ5ô)ó§ó„&gkÍ2H¹9é+Ÿù ŒÐI¹Qq’ºLC0Œ©úÙ 6n“:,%‚×OQƢ狳…ˆjïŒåjÛDί…=ë6]¬z×)»~¬Ò(X– Ã)Í#6lI¶“R‰ýP[ñp髽ù*õVþ¬EËɸ‡PžE.-™×ëgðÒ­«8H(€ ºÒ°¨€S]¾q“zݺÂ%ò0"ðÅ:Ð{3º±—ùeŸ¾ J:Í ©Âùâm²™Ä‹ GÊ(ØKGcŸÁ…¢ÜéÁ®(à2ÃŽ,¿² ;EÆ.Ø—9Žï2¤ë=P¶ –¿ØS” ZÆß£G®–Yí»:G2àxî±óqsšmu¸4eãÂ{<ø÷u·VkWöSüß2]øE”È{<:góÁ!üŒÈ£Ž«à½ÑRÔOW^ûþå=…ÀÃÖÝO ]Ï´AÕ“$¤½f½Ù¾#˜·‘#ó¶}Aµ$3;kô×e¼¸¨™"s]j)=l ü*|¤Ÿ>ÈäøŸnN"]-VIýŽ?R ¨*8jmÕ3DX…ýö‰¥¡åívI¢}ˆ†“Ý·%ÉS—í—ä]—–y$öè”*&fkÉôšøF«½“+ÛéÛAwð¯ØÛaTÌñ¢—ïCòŽ/ômök‰mÈ+Q³5œcm5û~#X1ñ„‹^ h¶Ù…øí¬DýÐÒ0ÆÔ“Œcy aeüL–Äíš83teø µ]ï„Ù¼f%>»Óëõ««÷E$& i>Šª Ö½çDõÝýéa” ÕÒ¹~q‡J¢'¨Y®y’ßJ=wÕL$Á§]³k ½‡¼õŸäÕQr«xNt®»ó/ÃfÔg_ôXÌ}7²ÁCZñËD +f´`5Y?×Ùž€°Ç''Ó2Ca.Uß@¯ï<쨰àÃuˆ9=ôøØ©’ÅþÍÒ÷f¹ägGÓDWÍgÂä@Ïß$m¼y*³ªb£™Å÷as èBh|¸ÎÝiæ‘ü®X ÛCƒÚÉôÙ”½3ŸÕä¦C™Ã@ø‚0À#ÙðSKEoU«wCïç\-ÛeI1ɽµ™èL¾R3¿uGŸñ0GÈÓ0Fì°-^³Ž ‹©w¥‰~A Ä6SÛ#(IšnÖšC_UqÔX0Ü„–Ä@§c3v”!Ý÷–4à^«å!xõ—(¬^/T^%Blã©ä#Ý=ÐCeK‘¬E'kk|ÎOÈ +ÜçMU`ÌÅ̽´_~rÔv)0ÚNàfQmhm5žr]jÀ×Ô?%Ü0Š…ˆfI1Œ ÅêÝ3mÜß2T} qÒñõõªk~E|+ªˆ°Q#7ãúFØš`Úbð\ONÞWVçâ4<,ù5kãjˆ^Ôຠy+­ä.ÑȲÑãQxðcöYjÌY|¬‘QQ†‡oGk{Npß̼ s–î¨(æ”f9:zõ2&ÑU»!¸û!ÈEî÷+y‚’ažM—’'#·>Ñ9_{(+`S0mT«qÌêkæ°ù·¢R¬˜ÆU™ñ)sfÖ<¶u¤<† ˜œ‹>-_¡¡vË ÕDmæÇÔTƒ Ô§ÅïÑõ¿'S,&Dš¤3ÖŒm¥*³UÊ;–Pã“á#4À°³Çº&µ§«×Ήðo)-„´ß^ïÊ´}ñÂ&!O7 ™”¤Sü!b©pGÐrQð˜Œ%¸PmL1¿ãŠõ+QN¸¾ÙZ׬€çHaÐ-JõM|^GŸ©³°ã·ˆ¿¶×~ìŠJ†¯×­õ`jä#ý(Àˆ+zo\¾ˆ&9[[8%{ˆ7dOyÊl6°çЉ O Jô¾ï3i“&F««YÉrö¨‰ž¬(fxŠï²Ä¥Âœ¯…RdEl^¹ìùï¸_}.µ`{›ÆÑµºHO©Ç¦»-Y_X„“Ù@:Ÿ4Ԝإpƒ)ãaú5_3 ŸEï²ÍÏ«°‚¥ñ,ˆ ÂôËiy /¾«»Š™ìGÒtÿJœŽœáENÙ¼Àwõ>´!Ę@¢÷týKJH¦¼°rÒ¼4/­D),W¦ºóénÝkð]‡l³ßòeµö û) ÍšÛ°câGÕA> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HHXQQK+CMBX12 /FontDescriptor 73 0 R /FirstChar 38 /LastChar 122 /Widths 69 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KDIXPT+CMCSC10 /FontDescriptor 75 0 R /FirstChar 67 /LastChar 122 /Widths 71 0 R >> endobj 24 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XGRKZP+CMITT10 /FontDescriptor 77 0 R /FirstChar 46 /LastChar 121 /Widths 64 0 R >> endobj 23 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WGYKKL+CMMI12 /FontDescriptor 79 0 R /FirstChar 98 /LastChar 115 /Widths 65 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KCEGQN+CMR12 /FontDescriptor 81 0 R /FirstChar 11 /LastChar 122 /Widths 70 0 R >> endobj 7 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XSRIDF+CMSY10 /FontDescriptor 83 0 R /FirstChar 15 /LastChar 110 /Widths 68 0 R >> endobj 13 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LAAMOU+CMTI12 /FontDescriptor 85 0 R /FirstChar 46 /LastChar 122 /Widths 66 0 R >> endobj 8 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RWYMEU+CMTT12 /FontDescriptor 87 0 R /FirstChar 34 /LastChar 126 /Widths 67 0 R >> endobj 9 0 obj << /Type /Pages /Count 6 /Parent 88 0 R /Kids [2 0 R 11 0 R 15 0 R 18 0 R 21 0 R 27 0 R] >> endobj 35 0 obj << /Type /Pages /Count 6 /Parent 88 0 R /Kids [33 0 R 39 0 R 43 0 R 46 0 R 49 0 R 52 0 R] >> endobj 57 0 obj << /Type /Pages /Count 3 /Parent 88 0 R /Kids [55 0 R 59 0 R 62 0 R] >> endobj 88 0 obj << /Type /Pages /Count 15 /Kids [9 0 R 35 0 R 57 0 R] >> endobj 89 0 obj << /Type /Catalog /Pages 88 0 R >> endobj 90 0 obj << /Producer (pdfTeX-1.40.3) /Creator (TeX) /CreationDate (D:20090909151335+02'00') /ModDate (D:20090909151335+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) >> endobj xref 0 91 0000000000 65535 f 0000001408 00000 n 0000001297 00000 n 0000000015 00000 n 0000244884 00000 n 0000245308 00000 n 0000244744 00000 n 0000245447 00000 n 0000245728 00000 n 0000245868 00000 n 0000003520 00000 n 0000003406 00000 n 0000001520 00000 n 0000245587 00000 n 0000005105 00000 n 0000004991 00000 n 0000003645 00000 n 0000006573 00000 n 0000006459 00000 n 0000005230 00000 n 0000008999 00000 n 0000008885 00000 n 0000006686 00000 n 0000245167 00000 n 0000245025 00000 n 0000010751 00000 n 0000044691 00000 n 0000010637 00000 n 0000009136 00000 n 0000043892 00000 n 0000046259 00000 n 0000103715 00000 n 0000103144 00000 n 0000046144 00000 n 0000044828 00000 n 0000245975 00000 n 0000102212 00000 n 0000126155 00000 n 0000169902 00000 n 0000103600 00000 n 0000103270 00000 n 0000125356 00000 n 0000171900 00000 n 0000171785 00000 n 0000170029 00000 n 0000173625 00000 n 0000173510 00000 n 0000172013 00000 n 0000175912 00000 n 0000175797 00000 n 0000173727 00000 n 0000177648 00000 n 0000177533 00000 n 0000176026 00000 n 0000179711 00000 n 0000179596 00000 n 0000177751 00000 n 0000246084 00000 n 0000182245 00000 n 0000182130 00000 n 0000179802 00000 n 0000183033 00000 n 0000182918 00000 n 0000182347 00000 n 0000183147 00000 n 0000183469 00000 n 0000183593 00000 n 0000183961 00000 n 0000184537 00000 n 0000185091 00000 n 0000185585 00000 n 0000186196 00000 n 0000186545 00000 n 0000197322 00000 n 0000197703 00000 n 0000201120 00000 n 0000201359 00000 n 0000205211 00000 n 0000205481 00000 n 0000208762 00000 n 0000208992 00000 n 0000223519 00000 n 0000224036 00000 n 0000225530 00000 n 0000225778 00000 n 0000231707 00000 n 0000231976 00000 n 0000244240 00000 n 0000246172 00000 n 0000246245 00000 n 0000246296 00000 n trailer << /Size 91 /Root 89 0 R /Info 90 0 R /ID [<99D2EF2496F39CACCF5A09EA47AA45F5> <99D2EF2496F39CACCF5A09EA47AA45F5>] >> startxref 246567 %%EOF ocamlviz/doc/ocamlviz.10000644000175000017500000000067011246704041014735 0ustar tonkartonkar.\" Hey, EMACS: -*- nroff -*- .TH OCAMLVIZ 1 "August 2009" .\" Please adjust this date whenever revising the manpage. .SH NAME ocamlviz \- monitoring tools for Objective Caml .SH SYNOPSIS .PP \fBocamlviz\fP is a set of tools to monitor Objective Caml programs .PP See http://ocamlviz.lri.fr/ .SH SEE ALSO .BR ocamlc (1), .br .SH AUTHOR Ocamlviz was written by Julien Robert and Guillaume Von Tokarski. ocamlviz/doc/fig.ml0000644000175000017500000000621511251431226014125 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Mlpost open Num open Command let init1 = let node name dx dy fill = Box.round_rect ~name ~dx ~dy ~stroke:(Some Color.black) ~fill (Box.tex name) in let program = node "Program" (bp 5.) (bp 29.) Color.lightgreen in let ocamlviz = node "Ocamlviz" (bp 5.) (bp 30.) Color.yellow in let net = node "Net" (bp 5.) (bp 30.) Color.lightblue in let database = node "Database" (bp 5.) (bp 30.) Color.lightgray in let display = node "Display" (bp 5.) (bp 29.) Color.orange in (program,ocamlviz,net,database,display) let archi1 = let program,ocamlviz,net,database,display = init1 in let boxstructure = Array.make_matrix 4 2 (Box.empty ()) in let boxserver = Array.make_matrix 1 2 (Box.empty ()) in let boxclient = Array.make_matrix 1 3 (Box.empty ()) in boxserver.(0).(0) <- program ; boxserver.(0).(1) <- ocamlviz ; boxclient.(0).(0) <- net ; boxclient.(0).(1) <- database ; boxclient.(0).(2) <- display ; let server = Box.tabular ~name:"server" boxserver in let client = Box.tabular ~name:"client" boxclient in let clientn = Box.tabular ~name:"clientn" boxclient in boxstructure.(0).(0) <- Box.tex "Server"; boxstructure.(0).(1) <- Box.tex "Clients"; boxstructure.(1).(0) <- server ; boxstructure.(1).(1) <- client ; boxstructure.(2).(1) <- Box.rect ~name:"etc" ~stroke:None ~dy:(bp 30.) (Box.tex ". . .") ; boxstructure.(3).(1) <- clientn ; let structure = Box.tabular ~vpadding:(bp 10.) ~hpadding:(bp 100.) boxstructure in let p1 = Box.east (Box.get "server" structure) in let p2 = Box.west (Box.get "client" structure) in let p3 = Box.west (Box.get "etc" structure) in let p4 = Box.west (Box.get "clientn" structure) in let xp1 = Point.xpart p1 in let yp1 = Point.ypart p1 in let xpic = Num.addn (bp 15.) xp1 in let ypic = Num.addn yp1 (bp 10.) in let pic = Picture.shift (Point.pt (xpic,ypic)) (Picture.tex "Binary Protocol") in let a1 = Arrow.simple (Path.pathp [p1;p2]) in let a2 = Arrow.simple (Path.pathp [p1;p3]) in let a3 = Arrow.simple (Path.pathp [p1;p4]) in (Box.draw structure)++a1++a2++a3++(Picture.make pic) let _ = List.iter (fun (name,fig) -> Metapost.emit name fig) [ "archi",archi1; ] ocamlviz/camlp4/test.ml0000644000175000017500000000307011246756105014760 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) let laref = ref 0 let laref = ref 0. let laref = ref "" let laref = ref true let h = Hashtbl.create 17 let () = Ocamlviz.wait_for_connected_clients 1 let rec fib v w = if v > 0 then fib (v-1) w else 0 let f () = () let rec f a1 _ = e (* let rec f () = g () and g () = f () *) let rec length = function | [] -> 0 | _ :: l -> 1 + length l let f x y = x + y ;; let g x = 3 ;; let h arg1 arg2 arg3 arg4 = g arg1 + f arg2 arg3 + arg4 let () = while true do ignore ( fib (h 1 2 3 4) 5); done; Ocamlviz.wait_for_killed_clients () (* -------------- *) ocamlviz/camlp4/pa_ocamlviz.ml0000644000175000017500000001655011246756104016313 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Camlp4.PreCast open Syntax let fun_idents = ref [] let getfilename loc = let filename = Loc.file_name loc in let regex = Str.regexp "\\." in let nb = Str.search_forward regex filename 0 in Str.first_chars filename nb let fname f _loc = (getfilename _loc)^"_"^f exception CannotModifyThis let rec binding_map isrec _loc b = match b with | <:binding< $x$ and $y$ >> -> let x = binding_map isrec _loc x in let y = binding_map isrec _loc y in <:binding< $x$ and $y$ >> | <:binding< $p$ = $e$>> -> let orig = <:binding< $p$ = $e$>> in begin match p with | <:patt< $lid:f$ >> -> begin Format.eprintf "patt:%s " f; match e with | (* int ref *) <:expr< ref $int:x$>> -> let lexpr = <:expr< Ocamlviz.Value.observe_int_ref $str:fname f _loc$ (ref $int:x$)>> in <:binding< $p$ = $lexpr$ >> | (* float ref *) <:expr< ref $flo:x$>> -> let lexpr = <:expr< Ocamlviz.Value.observe_float_ref $str:fname f _loc$ (ref $flo:x$)>> in <:binding< $p$ = $lexpr$ >> | (* string ref *) <:expr< ref $str:x$>> -> let lexpr = <:expr< Ocamlviz.Value.observe_string_ref $str:fname f _loc$ (ref $str:x$)>> in <:binding< $p$ = $lexpr$ >> | (* bool ref *) <:expr< ref True >> -> let lexpr = <:expr< Ocamlviz.Value.observe_bool_ref $str:fname f _loc$ (ref true)>> in <:binding< $p$ = $lexpr$ >> | <:expr< ref False >> -> let lexpr = <:expr< Ocamlviz.Value.observe_bool_ref $str:fname f _loc$ (ref false)>> in <:binding< $p$ = $lexpr$ >> | (* Hashtbl.create *) <:expr< Hashtbl.create $int:x$>> -> let lexpr = <:expr< Ocamlviz.Hashtable.observe $str:fname f _loc$ ( Hashtbl.create $int:x$)>> in <:binding< $p$ = $lexpr$ >> | (* function *) <:expr< fun $x$ -> $ee$ >> -> let rec iter ee args = match ee with <:expr< fun $x$ -> $ee$ >> -> iter ee (x :: args) | _ -> let rec repl_args args n = match args with [] -> [] | arg :: args -> <:patt< $lid: Printf.sprintf "xxx%d" n$ >> :: repl_args args (n+1) in let args = repl_args args 0 in let rec iterinv ee args = match args with [] -> ee | x :: args -> iterinv <:expr< fun $x$ -> $ee$ >> args in let rec appli ee args = match args with [] -> ee | x :: args -> match x with <:patt< $lid:name$ >> -> let ename = <:expr< $lid:name$ >> in appli (<:expr< $ee$ $ename$ >> ) args |_ -> assert false in let lexpr = if isrec then let ee = appli (<:expr< $lid:f$>>) (List.rev args) in <:expr< let rec $binding:orig$ in Ocamlviz.Time.start $lid:f^"__tobs"$ ; Ocamlviz.Point.observe $lid:f^ "__pobs"$; let v = $ee$ in Ocamlviz.Time.stop $lid:f^ "__tobs"$; v >> else <:expr< Ocamlviz.Time.start $lid:f^ "__tobs"$ ; Ocamlviz.Point.observe $lid:f^ "__pobs"$; let v = $ee$ in Ocamlviz.Time.stop $lid:f^ "__tobs"$; v>> in fun_idents := (f, List.length args):: !fun_idents; let ee = iterinv lexpr args in <:binding< $p$ = $ee$>> in iter ee [x] | _ -> raise CannotModifyThis end | _ -> orig end | _ -> assert false (* let is_function b = match b with *) (* let expr = Gram.Entry.mk "expr";; *) EXTEND Gram str_item: LEVEL "top" (* [["let"; f = LIDENT; arg = LIDENT ; "=" ; e = expr -> *) (* <:str_item< let $lid:f$ $lid:arg$ = 2 ;; >> ]]; *) [[ "let"; "rec"; b = binding -> begin try fun_idents := []; let b = binding_map true _loc b in let str = List.fold_left (fun str (id,_) -> <:str_item< let $lid: id ^ "__pobs"$ = Ocamlviz.Point.create $str:fname id _loc$;; let $lid: id ^ "__tobs"$ = Ocamlviz.Time.create $str:fname id _loc$;; $str$ >> ) <:str_item< let $binding:b$ ;; >> !fun_idents in str with CannotModifyThis -> <:str_item< let rec $binding:b$ ;; >> end | "let"; b = binding -> begin try fun_idents := []; let b = binding_map false _loc b in let str = List.fold_left (fun str (id,_) -> <:str_item< let $lid: id ^ "__pobs"$ = Ocamlviz.Point.create $str:fname id _loc$;; let $lid: id ^ "__tobs"$ = Ocamlviz.Time.create $str:fname id _loc$;; $str$ >> ) <:str_item< let $binding:b$ ;; >> !fun_idents in str with CannotModifyThis -> <:str_item< let $binding:b$ ;; >> end (* List.fold_left (fun str (id,nargs) -> *) (* let rec iterinv ee nargs = *) (* if nargs = 0 then *) (* ee *) (* else *) (* iterinv <:expr< fun $lid: Printf.sprintf "a%d" nargs *) (* $ -> $ee$ >> (nargs-1) *) (* in *) (* let rec iter nargs = *) (* if nargs = 0 then *) (* <:expr< $lid: id$ >> *) (* else *) (* let ee = iter (nargs-1) in *) (* <:expr< $ee$ $lid: Printf.sprintf "a%d" nargs$ >> *) (* in *) (* let apply = iter nargs in *) (* let body = (\* <:expr< *\) *) (* (\* start $lid:id^ "__tobs"$ ; *\) *) (* (\* Ocamlviz.Point.observe $lid:id^ "__pobs"$; *\) *) (* (\* let v = $apply$ in *\) *) (* (\* stop $lid:id^ "__tobs"$; *\) *) (* (\* v>> *\) *) (* <:expr< *) (* let t0___obs = start () in *) (* let v = $apply$ in *) (* stop t0___obs; *) (* v >> *) (* in *) (* let ee = iterinv body nargs in *) (* <:str_item< $str$;; let $lid: id$ = $ee$;; >> *) (* ) *) (* str !fun_idents *) (* | *) (* "let"; "rec"; b = binding -> fun_idents := []; let b = binding_map _loc b in *) (* List.fold_left (fun str (id, args) -> *) (* <:str_item< let $lid: id ^ "___obs" $ = Ocamlviz.Point.create $str:id$;; $str$ >> *) (* ) *) (* <:str_item< let rec $binding:b$ ;; >> !fun_idents *) ]]; END;; ocamlviz/camlp4/Makefile0000644000175000017500000000037711246756101015112 0ustar tonkartonkarpa_ocamlviz.cmo : pa_ocamlviz.ml ocamlc -c -dtypes -I +camlp4 -I +str -pp camlp4of str.cma pa_ocamlviz.ml test: pa_ocamlviz.cmo test.ml camlp4 pa_o.cmo str.cma pa_ocamlviz.cmo pr_o.cmo test.ml > test_pp.ml cat test.ml test_pp.ml ocamlc -c test_pp.mlocamlviz/src/ascii.ml0000644000175000017500000002160011251411607014466 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Format open Thread open Db open Protocol let rec go_file_tree fmt i v = let fct s = for j = 0 to i do fprintf fmt " " done; fprintf fmt " -%s\n" s in match v with | Node (s,l) -> if List.length l = 0 then fct s else begin fct s; List.iter (fun j -> go_file_tree fmt (i+3) j) l; end let go_file_h fmt = function | Int i -> fprintf fmt "%s " (string_of_int i) | _ -> assert false let go_file_value fmt = function | t,Int i -> fprintf fmt "t:%f " t; fprintf fmt "value:Int %s " (string_of_int i) | t,Float f -> fprintf fmt "t:%f " t; fprintf fmt "value:Float %s " (string_of_float f) | t,String s -> fprintf fmt "t:%f " t; fprintf fmt "value:String %s " s | t,Bool b -> fprintf fmt "t:%f " t; fprintf fmt "value:Bool %s " (string_of_bool b) | t,Int64 i -> fprintf fmt "t:%f " t; fprintf fmt "value:Int %s " (Int64.to_string i) | t,No_value -> fprintf fmt "t:%f " t; fprintf fmt "value:No_value " | t,Collected -> fprintf fmt "t:%f " t; fprintf fmt "value:Collected " | t,Killed -> fprintf fmt "t:%f " t; fprintf fmt "value:Killed " | t,Tree tr -> fprintf fmt "t:%f " t; fprintf fmt "value:\n";go_file_tree fmt 0 tr;fprintf fmt "\n " | t,Hashtable (l,nb,empty,max) -> fprintf fmt "t:%f " t; fprintf fmt "value:Hashtable (";go_file_h fmt l;go_file_h fmt nb;go_file_h fmt empty;go_file_h fmt max; fprintf fmt ") " | t,Log l -> fprintf fmt "t:%f " t; fprintf fmt "value:Log\n"; List.iter (fun (t,l) -> fprintf fmt "%f : %s \n" t l) l let go_file_status fmt = function | St_active -> fprintf fmt "status:active " | St_killed -> fprintf fmt "status:killed " | St_collected -> fprintf fmt "status:collected " let go_file_tag fmt {id=id; name=n; value=v; status = st} = let _,st = st in fprintf fmt "{id:%d name:%s " id n; go_file_value fmt v; go_file_status fmt st; fprintf fmt "}\n" let go_file_table fmt= let ts,size = Db.get_heap_total_size () in let ta,alive = Db.get_heap_alive_size () in let tm,max = Db.get_heap_max_size () in let size,alive,max = match size,alive,max with | Int64 s,Int64 a,Int64 m -> Int64.to_string s,Int64.to_string a,Int64.to_string m | _ -> assert false in fprintf fmt "\nGC:\n"; fprintf fmt "\nsize:%s\nalive:%s\nmax_size:%s\n"size alive max; let l = Db.get_point_list () in if List.length l <> 0 then begin fprintf fmt "\nPoint:\n"; List.iter (go_file_tag fmt) l; end; let l = Db.get_time_list () in if List.length l <> 0 then begin fprintf fmt "\nTime:\n"; List.iter (go_file_tag fmt) l; end; let l = Db.get_tag_count_list () in if List.length l <> 0 then begin fprintf fmt "\nTag_count:\n"; List.iter (go_file_tag fmt) l; end; let l = Db.get_tag_size_list () in if List.length l <> 0 then begin fprintf fmt "\nTag_size:\n"; List.iter (go_file_tag fmt) l; end; let l = Db.get_value_int_list () in if List.length l <> 0 then begin fprintf fmt "\nValue_int:\n"; List.iter (go_file_tag fmt) l; end; let l = Db.get_value_float_list () in if List.length l <> 0 then begin fprintf fmt "\nValue_float:\n"; List.iter (go_file_tag fmt) l; end; let l = Db.get_value_string_list () in if List.length l <> 0 then begin fprintf fmt "\nValue_string:\n"; List.iter (go_file_tag fmt) l; end; let l = Db.get_value_bool_list () in if List.length l <> 0 then begin fprintf fmt "\nValue_bool:\n"; List.iter (go_file_tag fmt) l end; let l = Db.get_tree_list () in if List.length l <> 0 then begin fprintf fmt "\nTree:\n"; List.iter (go_file_tag fmt) l end; let l = Db.get_hash_list () in if List.length l <> 0 then begin fprintf fmt "\nHash:\n"; List.iter (go_file_tag fmt) l end; let l = Db.get_tag 3 in begin fprintf fmt "\nLog:\n"; go_file_tag fmt l end; fprintf fmt "\n#######################################@?\n" let rec print_tree i v = let fct s = for j = 0 to i do eprintf " " done; eprintf " -%s\n" s in match v with | Node (s,l) -> if List.length l = 0 then fct s else begin fct s; List.iter (fun j -> print_tree (i+3) j) l; end let print_h = function | Int i -> eprintf "%s " (string_of_int i) | _ -> assert false let print_value = function | t,Int i -> eprintf "t:%f " t; eprintf "value: %s " (string_of_int i) | t,Float f -> eprintf "t:%f " t; eprintf "value: %s " (string_of_float f) | t,String s -> eprintf "t:%f " t; eprintf "value: \"%s\" " s | t,Bool b -> eprintf "t:%f " t; eprintf "value: %s " (string_of_bool b) | t,Int64 i -> eprintf "t:%f " t; eprintf "value: %s " (Int64.to_string i) | t,No_value -> eprintf "t:%f " t; eprintf "value:No_value " | t,Collected -> eprintf "t:%f " t; eprintf "value:Collected " | t,Killed -> eprintf "t:%f " t; eprintf "value:Killed " | t,Tree tr -> eprintf "t:%f " t; eprintf "value:Tree\n";print_tree 0 tr;eprintf "\n " | t,Hashtable (l,nb,empty,max) -> eprintf "t:%f " t;eprintf "value:Hashtable ("; print_h l;print_h nb;print_h empty;print_h max; eprintf ")" | t,Log l -> eprintf "t:%f " t; eprintf "value:Log\n"; List.iter (fun (t,l) -> eprintf "%f : %s \n" t l) l let print_status = function | St_active -> eprintf "status:active " | St_killed -> eprintf "status:killed " | St_collected -> eprintf "status:collected " let print_tag {id=id; name=n; value=v; status = st} = eprintf "{id:%d name:%s " id n; print_value v; let _,st = st in print_status st; eprintf "}\n" let print_table fmt= let ts,size = Db.get_heap_total_size () in let ta,alive = Db.get_heap_alive_size () in let tm,max = Db.get_heap_max_size () in let size,alive,max = match size,alive,max with | Int64 s,Int64 a,Int64 m -> Int64.to_string s,Int64.to_string a,Int64.to_string m | No_value,_,_ |_,No_value,_ |_,_,No_value -> "0","0","0" | _ -> assert false in eprintf "\nGC:\n"; eprintf "\nsize:%s\nalive:%s\nmax_size:%s\n"size alive max; let l = Db.get_point_list () in if List.length l <> 0 then begin eprintf "\nPoint:\n"; List.iter print_tag l; end; let l = Db.get_time_list () in if List.length l <> 0 then begin eprintf "\nTime:\n"; List.iter print_tag l; end; let l = Db.get_tag_count_list () in if List.length l <> 0 then begin eprintf "\nTag_count:\n"; List.iter print_tag l; end; let l = Db.get_tag_size_list () in if List.length l <> 0 then begin eprintf "\nTag_size:\n"; List.iter print_tag l; end; let l = Db.get_value_int_list () in if List.length l <> 0 then begin eprintf "\nValue_int:\n"; List.iter print_tag l; end; let l = Db.get_value_float_list () in if List.length l <> 0 then begin eprintf "\nValue_float:\n"; List.iter print_tag l; end; let l = Db.get_value_string_list () in if List.length l <> 0 then begin eprintf "\nValue_string:\n"; List.iter print_tag l; end; let l = Db.get_value_bool_list () in if List.length l <> 0 then begin eprintf "\nValue_bool:\n"; List.iter print_tag l end; let l = Db.get_tree_list () in if List.length l <> 0 then begin eprintf "\nTree:\n"; List.iter print_tag l end; let l = Db.get_hash_list () in if List.length l <> 0 then begin eprintf "\nHash:\n"; List.iter print_tag l end; let l = Db.get_tag 3 in begin eprintf "\nLog:\n"; print_tag l end; eprintf "\n#######################################@?\n" let () = let _ = Thread.create Net.read_data () in let f = open_out !Options.output in let fmt = Format.formatter_of_out_channel f in while true do Unix.sleep 1; go_file_table fmt; if !Options.terminal then print_table (); done; close_out f (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/binary.ml0000644000175000017500000001313011251411607014661 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) exception IncompleteMessage let buf_int8 buf i = Buffer.add_char buf (char_of_int (i land 255)) let get_uint8 s pos = int_of_char s.[pos] let buf_list8 buf_item b list = let len = List.length list in buf_int8 b len; List.iter (buf_item b) list let buf_bool buf b = buf_int8 buf (if b then 1 else 0) let get_bool s pos = (get_uint8 s pos) <> 0 let get_bool_pos s pos = (get_uint8 s pos) <> 0, pos+1 let buf_int16 buf i = Buffer.add_char buf (char_of_int (i land 255)); Buffer.add_char buf (char_of_int ((i lsr 8) land 255)) let buf_int24 buf i = Buffer.add_char buf (char_of_int (i land 255)); Buffer.add_char buf (char_of_int ((i lsr 8) land 255)); Buffer.add_char buf (char_of_int ((i lsr 16) land 255)) let str_int16 s pos i = s.[pos] <- char_of_int (i land 255); s.[pos+1] <- char_of_int ((i lsr 8) land 255) let get_int16 s pos = let c1 = int_of_char s.[pos] in let c2 = int_of_char s.[pos+1] in c1 lor (c2 lsl 8), pos + 2 let str_int24 s pos i = s.[pos] <- char_of_int (i land 255); s.[pos+1] <- char_of_int ((i lsr 8) land 255); s.[pos+2] <- char_of_int ((i lsr 16) land 255) let get_int24 s pos = let c1 = int_of_char s.[pos] in let c2 = int_of_char s.[pos+1] in let c3 = int_of_char s.[pos+2] in c1 lor (c2 lsl 8) lor (c3 lsl 16), pos + 3 let buf_int31 buf i = buf_int8 buf i; buf_int8 buf (i lsr 8); buf_int8 buf (i lsr 16); let x = i lsr 24 in buf_int8 buf (x lor ((x lsl 1) land 0x80)) let buf_int63 buf i = buf_int8 buf i; buf_int8 buf (i lsr 8); buf_int8 buf (i lsr 16); buf_int8 buf (i lsr 24); buf_int8 buf (i lsr 32); buf_int8 buf (i lsr 40); buf_int8 buf (i lsr 48); let x = i lsr 56 in buf_int8 buf (x lor ((x lsl 1) land 0x80)) let str_int31 s pos i = s.[pos] <- char_of_int (i land 255); s.[pos+1] <- char_of_int ((i lsr 8) land 255); s.[pos+2] <- char_of_int ((i lsr 16) land 255); s.[pos+3] <- char_of_int ((i lsr 24) land 255) let get_int31 s pos = let c1 = get_uint8 s pos in let c2 = get_uint8 s (pos+1) in let c3 = get_uint8 s (pos+2) in let c4 = get_uint8 s (pos+3) in let x = c1 lor (c2 lsl 8) lor (c3 lsl 16) lor (c4 lsl 24) in x, pos + 4 let get_int63 s pos = let c1 = get_uint8 s pos in let c2 = get_uint8 s (pos+1) in let c3 = get_uint8 s (pos+2) in let c4 = get_uint8 s (pos+3) in let c5 = get_uint8 s (pos+4) in let c6 = get_uint8 s (pos+5) in let c7 = get_uint8 s (pos+6) in let c8 = get_uint8 s (pos+7) in let x = c1 lor (c2 lsl 8) lor (c3 lsl 16) lor (c4 lsl 24) lor (c5 lsl 32) lor (c6 lsl 40)lor (c7 lsl 48)lor (c8 lsl 56) in x, pos + 8 let get_int63_of_31 s pos = let c1 = get_uint8 s pos in let c2 = get_uint8 s (pos+1) in let c3 = get_uint8 s (pos+2) in let c4 = get_uint8 s (pos+3) in let x = c1 lor (c2 lsl 8) lor (c3 lsl 16) lor (c4 lsl 24) in (x lsl 32) asr 32, pos+4 let buf_string31 buf s = buf_int31 buf (String.length s); Buffer.add_string buf s let get_string s pos len = try String.sub s pos len, pos+len with e -> Format.printf "%s len : %d pos : %d @." (Printexc.to_string e) len pos;assert false let rec get_list_rec get_item s pos len last left = if len = 0 then List.rev left, pos else let (item,pos) = get_item s pos last in get_list_rec get_item s pos (len-1) last (item :: left) (* let get_list8 get_item s pos = let len = get_uint8 s pos in get_list_rec get_item s (pos+1) len [] *) let get_list16 get_item s pos last = if pos > last-2 then raise IncompleteMessage; let len, pos = get_int16 s pos in get_list_rec get_item s pos len last [] let buf_list16 buf_item b list = let len = List.length list in buf_int16 b len; List.iter (buf_item b) list let mask_16_bits = Int64.of_int 0xffff let int64_low16 n = Int64.to_int (Int64.logand n mask_16_bits) let buf_int64 buf n = buf_int16 buf (int64_low16 n); buf_int16 buf (int64_low16 (Int64.shift_right n 16)); buf_int16 buf (int64_low16 (Int64.shift_right n 32)); buf_int16 buf (int64_low16 (Int64.shift_right n 48)) let get_int64 s pos = let n0, pos = get_int16 s pos in let n1, pos = get_int16 s pos in let n2, pos = get_int16 s pos in let n3, pos = get_int16 s pos in Int64.logor (Int64.logor (Int64.shift_left (Int64.of_int n3) 48) (Int64.shift_left (Int64.of_int n2) 32)) (Int64.logor (Int64.shift_left (Int64.of_int n1) 16) (Int64.of_int n0)), pos let get_int64_of_63 s pos = get_int64 s pos let buf_float buf f = buf_int64 buf (Int64.bits_of_float f) let get_float s pos = let n, pos = get_int64 s pos in Int64.float_of_bits n, pos (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/binary.mli0000644000175000017500000001067011251411607015040 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) (** Low-level functions for the binary protocol. *) (** Coding functions *) (** {blank_line} *) val buf_int8 : Buffer.t -> int -> unit (** [buf_int8 b i] encodes a 8-bits integer [i] in the buffer [b]. *) val buf_int16 : Buffer.t -> int -> unit (** [buf_int16 b i] encodes a 16-bits integer [i] in the buffer [b]. *) val buf_int31 : Buffer.t -> int -> unit (** [buf_int31 b i] encodes a native 31-bits integer [i] in the buffer [b]. *) val buf_int63 : Buffer.t -> int -> unit (** [buf_int63 b i] encodes a native 63-bits integer [i] in the buffer [b]. *) val buf_string31 : Buffer.t -> string -> unit val buf_bool : Buffer.t -> bool -> unit (** [buf_bool b i] encodes a boolean [i] in the buffer [b]. *) val buf_float : Buffer.t -> float -> unit (** [buf_float b f] encodes a floating-point number [f] in the buffer [b]. *) val buf_int64 : Buffer.t -> Int64.t -> unit (** [buf_int64 b i] encodes an int64 [i] in the buffer [b]. *) val buf_list16 : (Buffer.t -> 'a -> unit) -> Buffer.t -> 'a list -> unit (** [buf_list16 f b l] encodes the list [l] in the buffer [b], with the function [f] specifying how to encode an item of [l]. *) exception IncompleteMessage (** {blank_line} *) (** Decoding functions *) (** {blank_line} *) val get_uint8 : string -> int -> int (** [get_uint8 s pos] decodes a byte in [s] at the position [pos]. *) val get_int16 : string -> int -> int * int (** [get_int16 s pos] decodes two bytes in [s] at the position [pos] and return a 16 bits integer along with the new position in [s]. *) val get_int31 : string -> int -> int * int (** [get_int31 s pos] decodes four bytes in [s] at the position [pos] and return a 31 bits integer along with the new position in [s]. *) val get_int63 : string -> int -> int * int (** [get_int63 s pos] decodes eight bytes in [s] at the position [pos] and return a 63 bits integer along with the new position in [s]. *) val get_int64 : string -> int -> Int64.t * int (** [get_int64 s pos] decodes eight bytes in [s] at the position [pos] and return a 63 bits integer along with the new position in [s]. *) val get_int63_of_31 : string -> int -> int * int (** [get_int63_of_31 s pos] decodes four bytes in [s] at the position [pos] and return a 63 bits integer along with the new position in [s], made from the 31 bits integer. *) val get_int64_of_63 : string -> int -> Int64.t * int (** [get_int64_of_63 s pos] decodes eight bytes in [s] at the position [pos] and return a 64 bits integer along with the new position in [s], made from the 63 bits integer. *) val get_float : string -> int -> float * int (** [get_float s pos] decodes eight bytes in [s] at the position [pos] and return a floating-point number along with the new position in [s]. *) val get_string : string -> int -> int -> string * int (** [get_string s pos len] decodes [len] bytes in [s] at the position [pos] and return a string along with the new position in [s]. *) val get_list16 : (string -> int -> int -> 'b * int) -> string -> int -> int -> 'b list * int (** [get_list16 f s pos last] decodes [last]-[pos] bytes in [s], at the position [pos], with the function [f] that specifies how to get an item, and returns a 'b list. *) val get_bool : string -> int -> bool (** [get_bool s pos] decodes a byte in [s] at the position [pos] and return a boolean along with the new position in [s]. *) (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/bproto.ml0000644000175000017500000002577511251411607014724 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Binary open Protocol (* msg: nb_byte : 1 | 2 | 1 | 4 | name length ------------------------------------- declare | 0 | tag | kind | name length | name | ------------------------------------- nb_byte : 1 | 2 | ------------------ send | 1 | tag | Value | ------------------ nb_byte : 2 | 4 -------------- bind | 2 | tag list | -------------- Value : nb_byte : 1 | 4 --------- Int i | 0 | i | --------- nb_byte : 1 | 8 --------- Int i | 1 | i | --------- nb_byte : 1 | 8 --------- Float f | 2 | f | --------- nb_byte : 1 | 4 | length ------------------ String s | 3 | length | s | ------------------ nb_byte : 1 | 1 --------- Bool b | 4 | b | --------- nb_byte : 1 | 8 --------- Int64 i | 5 | i | --------- nb_byte : 1 --- Collected | 6 | --- nb_byte : 1 --- Int i | 7 | --- nb_byte : 1 | 1 ----------------------------- Tree | 8 | # nodes | List of nodes | ----------------------------- nb_byte : 4 | length | 1 | ----------------------------------------------------- node (s,l) : | length | s | # children | List of # children | ----------------------------------------------------- nb_byte : 2 -------------- child | index of DFS | -------------- example tree : A / \ B C / \ D E | # nodes | length D | | 0 child | length E | | 0 child | length B | | 2 children | node 0 | node 1 | ------------------------------------------------------------------------------------------------------------- | 8 | 5 | 1 | D | 0 | 1 | E | 0 | 1 | B | 2 | 0 | 1 | -> ------------------------------------------------------------------------------------------------------------- | node 0 | node 1 | node 2 | | length C | | 0 child | length A | | 2 children | node 2 | node 3 | ---------------------------------------------------------------------- -> | 1 | C | 0 | 1 | A | 2 | 2 | 3 | ---------------------------------------------------------------------- | node 3 | node 4 | *) module HB = Hashtbl.Make(struct type t = variant let equal = (==) let hash = Hashtbl.hash end) module HG = Hashtbl.Make(struct type t = int let equal = (=) let hash = Hashtbl.hash end) let buf_kind buf k = let i = match k with | Point -> 0 | Time -> 1 | Value_int -> 2 | Value_float -> 3 | Value_bool -> 4 | Value_string -> 5 | Tag_count -> 6 | Tag_size -> 7 | Special -> 8 | Ktree -> 9 | Hash -> 10 | Klog -> 11 in buf_int8 buf i let buf_tree buf n = let i = ref 0 in let h = HB.create 17 in let res = ref [] in let rec buf_node (Node (s,l) as n) = try HB.find h n with Not_found -> let l = List.map buf_node l in let j = !i in incr i; HB.add h n j; res := (s, l) :: !res; j in ignore (buf_node n); let buf_elt buf (s,l) = buf_string31 buf s; buf_list16 buf_int16 buf l in buf_list16 buf_elt buf (List.rev !res) let buf_bind buf l = buf_list16 buf_int16 buf l let buf_printf buf e = let t,v = e in buf_float buf t; buf_string31 buf v let rec buf_value buf = function | Int i -> begin match Sys.word_size with |32 -> buf_int8 buf 0; buf_int31 buf i |64 -> buf_int8 buf 1; buf_int63 buf i |_ -> assert false end | Float f -> buf_int8 buf 2; buf_float buf f | String s -> buf_int8 buf 3; buf_string31 buf s | Bool b -> buf_int8 buf 4; buf_bool buf b | Int64 i -> buf_int8 buf 5; buf_int64 buf i | Collected -> buf_int8 buf 6 | Killed -> buf_int8 buf 7 | Tree v -> buf_int8 buf 8;buf_tree buf v | Hashtable (l,nb,empty,max) -> buf_int8 buf 9;buf_value buf l;buf_value buf nb;buf_value buf empty;buf_value buf max | Log l -> buf_int8 buf 10; buf_list16 buf_printf buf l | No_value -> assert false let buf_msg buf = function |Declare (t,k,n) -> buf_int8 buf 0; buf_int16 buf t; buf_kind buf k; buf_string31 buf n |Send (t,v) -> buf_int8 buf 1; buf_int16 buf t; buf_value buf v |Bind l -> buf_int8 buf 2; buf_bind buf l (* Fabrice: I added a global buffer [tmp_buf] for message encoding. In [encode_one], a message is first encoded in the temporary buffer, to compute its size, and the content of the temporary buffer is then added to the final buffer, after its size *) let tmp_buf = Buffer.create 65000 let encode_one b msg = Buffer.clear tmp_buf; buf_msg tmp_buf msg; buf_int31 b (Buffer.length tmp_buf); Buffer.add_buffer b tmp_buf let encode buf msgs = List.iter (encode_one buf) msgs let get_string31 s pos last = if pos > last-4 then raise IncompleteMessage; let len,pos = get_int31 s pos in if pos > last-len then raise IncompleteMessage; get_string s pos len let get_printf s pos last = if pos > last-8 then raise IncompleteMessage; let f,pos = get_float s pos in let s,pos = get_string31 s pos last in (f,s),pos (* let get_array l i = *) (* let a = Array.make i "" in *) (* let idx = ref 0 in *) (* List.iter (fun elt -> a.(!idx) <- elt ; incr idx) l; *) (* a *) let get_kind s pos = let k = get_uint8 s pos in let kind = match k with | 0 -> Point | 1 -> Time | 2 -> Value_int | 3 -> Value_float | 4 -> Value_bool | 5 -> Value_string | 6 -> Tag_count | 7 -> Tag_size | 8 -> Special | 9 -> Ktree | 10 -> Hash | 11 -> Klog | _ -> Format.eprintf "kind:%d@." k;assert false in kind,pos+1 let safe_get_int16 s pos last = if pos > last-2 then raise IncompleteMessage; get_int16 s pos let dump msg s pos last = Format.eprintf "%s: pos=%d last=%d:@." msg pos last; for i = max 0 (pos-10) to last-1 do if i = pos then Format.eprintf "|"; Format.eprintf "%03d " (Char.code s.[i]) done; Format.eprintf "@."; for i = max 0 (pos-10) to last-1 do if i = pos then Format.eprintf "|"; Format.eprintf "%c " (let c = s.[i] in if c >= 'A' && c <= 'z' then c else '.') done; Format.eprintf "@." open Format let get_tree s pos last = (* dump "get_tree" s pos last; *) let get_elt s pos last = let n, pos = get_string31 s pos last in let l, pos = get_list16 safe_get_int16 s pos last in (n, l), pos in let l, pos = get_list16 get_elt s pos last in let h = HG.create 17 in let i = ref 0 in List.iter (fun (s,l) -> let n = Node (s, List.map (HG.find h) l) in (* Format.eprintf "get_tree: %d -> %s@." !i s; *) HG.add h !i n; incr i) l; HG.find h (!i - 1), pos let rec get_value s pos last = let t = get_uint8 s pos in match t with |0 -> begin match Sys.word_size with |32 -> if pos+1 > last-4 then raise IncompleteMessage; let x,pos = get_int31 s (pos+1) in Int x,pos |64 -> if pos+1 > last-4 then raise IncompleteMessage; let x,pos = get_int63_of_31 s (pos+1) in Int x,pos |_ ->assert false end |1 -> begin match Sys.word_size with |32 -> if pos+1 > last-8 then raise IncompleteMessage; let x,pos = get_int64_of_63 s (pos+1) in Int64 x,pos |64 -> if pos+1 > last-8 then raise IncompleteMessage; let x,pos = get_int63 s (pos+1) in Int x,pos |_ ->assert false end |2 -> if pos+1 > last-8 then raise IncompleteMessage; let x,pos = get_float s (pos+1) in Float x,pos |3 -> let v,pos = get_string31 s (pos+1) last in String v,pos |4 -> if pos+1 > last-1 then raise IncompleteMessage; let x = get_bool s (pos+1) in Bool x ,pos+2 |5 -> if pos+1 > last-8 then raise IncompleteMessage; let x,pos = get_int64 s (pos+1) in Int64 x,pos |6 -> Collected, pos+1 |7 -> Killed, pos+1 |8 -> let tr,pos = get_tree s (pos+1) last in Tree tr,pos |9 -> let l,pos = get_value s (pos+1) last in let nb,pos = get_value s pos last in let empty,pos = get_value s pos last in let max,pos = get_value s pos last in Hashtable (l,nb,empty,max),pos |10 -> let l,pos = get_list16 get_printf s (pos+1) last in Log l, pos |_ -> assert false let get_declare s pos last = if pos > last-3 then raise IncompleteMessage; let tag,pos = get_int16 s pos in let kind,pos = get_kind s pos in let name,pos = get_string31 s pos last in tag,kind,name,pos let get_send s pos last = if pos > last-3 then raise IncompleteMessage; let tag,pos = get_int16 s pos in let value,pos = get_value s pos last in tag,value,pos let get_bind s pos last = get_list16 safe_get_int16 s pos last let decode_one s pos last = if pos > last-1 then raise IncompleteMessage; let typ_msg = get_uint8 s pos in match typ_msg with |0 -> let tag,kind,n,pos = get_declare s (pos+1) last in Declare (tag,kind,n), pos |1 -> let tag,v,pos = get_send s (pos+1) last in Send (tag,v), pos |2 -> let l,pos = get_bind s (pos+1) last in Bind l, pos |_ -> dump "get_msg" s pos last; assert false (* let decode s first last = let rec loop acc i = try let m, nexti = get_msg s i last in loop (m :: acc) nexti with IncompleteMessage -> List.rev acc, i in loop [] first *) (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/bproto.mli0000644000175000017500000000324111251411607015055 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) (** Binary implementation of the protocol *) val encode_one : Buffer.t -> Protocol.msg -> unit (** [encode_one b m] encodes a message [m] in the buffer [b]. *) val encode : Buffer.t -> Protocol.msg list -> unit (** [encode b ml] encodes a message list [ml] in the buffer [b]. *) val decode_one : string -> int -> int -> Protocol.msg * int (** [decode s first last] decodes messages using characters in [s] from [first] to [last]; returns the messages together with the position right after the last decoded message. *) (** DEBUG *) val dump : string -> string -> int -> int -> unit (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/db.ml0000644000175000017500000003127111251411607013770 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Protocol open Timemap type status = St_active | St_killed | St_collected type tag = { id:Protocol.tag; kind:kind; name:string; tmap : value Timemap.t; mutable value : float*value; tmap_st : status Timemap.t; mutable status: float*status; } let tags = Hashtbl.create 17 let bind_table = Hashtbl.create 17 let point_table = Hashtbl.create 17 let time_table = Hashtbl.create 17 let tag_count_table = Hashtbl.create 17 let tag_max_count_table = Hashtbl.create 17 let tag_size_table = Hashtbl.create 17 let tag_max_size_table = Hashtbl.create 17 let int_table = Hashtbl.create 17 let float_table = Hashtbl.create 17 let string_table = Hashtbl.create 17 let bool_table = Hashtbl.create 17 let tree_table = Hashtbl.create 17 let hash_table = Hashtbl.create 17 let time = ref 0. let record_window = ref 60. let offset = ref 0. let log_size = ref 200 let set_record_window t = record_window := t let get_record_window () = !record_window let get_current_time () = !time let set_observe_time t = if t > !time then invalid_arg "set_observer_time"; offset := !time -. t; if !offset > !record_window then offset := !record_window let get_observe_time () = !time -. !offset let get_offset () = !offset let set_offset t = if ((!time -. t) < Timemap.get_min ()) then offset := !time -. Timemap.get_min () else offset := t let get_log_size () = !log_size let set_log_size i = log_size := i let max_heap_size = create No_value let heap_size_tag = {id=0 ; kind=Special ; name="heap_size" ; tmap = create No_value; value = (0.,No_value) ; tmap_st = create St_active ; status = (0.,St_active)} let heap_alive_tag = {id=1 ; kind=Special ; name="heap_alive" ; tmap = create No_value; value = (0.,No_value) ; tmap_st = create St_active ; status = (0.,St_active)} let log_tag = {id=3; kind=Klog ; name="log" ; tmap = create No_value; value = (0.,No_value) ; tmap_st = create St_active ; status = (0.,St_active)} let () = Hashtbl.replace tags 0 heap_size_tag; Hashtbl.replace tags 1 heap_alive_tag let clean_up () = let diff = max 0. (!time -. !record_window) in Hashtbl.iter (fun _ t -> Timemap.remove_before t.tmap diff; Timemap.remove_before t.tmap_st diff ) tags let add_tag id kind name = if not (Hashtbl.mem tags id) then begin let tag = {id=id;kind=kind;name=name;tmap = create No_value; value= (0.,No_value); tmap_st = create St_active; status = (0.,St_active)} in match kind with | Point -> Hashtbl.replace tags id tag; Hashtbl.replace point_table id tag | Tag_size -> Hashtbl.replace tags id tag; Hashtbl.replace tag_size_table id tag; Hashtbl.replace tag_max_size_table id tag.tmap | Tag_count -> Hashtbl.replace tags id tag; Hashtbl.replace tag_count_table id tag; Hashtbl.replace tag_max_count_table id tag.tmap | Time -> Hashtbl.replace tags id tag; Hashtbl.replace time_table id tag | Value_bool -> Hashtbl.replace tags id tag; Hashtbl.replace bool_table id tag | Value_float -> Hashtbl.replace tags id tag; Hashtbl.replace float_table id tag | Value_int -> Hashtbl.replace tags id tag; Hashtbl.replace int_table id tag | Value_string -> Hashtbl.replace tags id tag; Hashtbl.replace string_table id tag | Ktree -> Hashtbl.replace tags id tag; Hashtbl.replace tree_table id tag | Hash -> Hashtbl.replace tags id tag; Hashtbl.replace hash_table id tag | Klog -> Hashtbl.replace tags id log_tag | Special -> match id with | 0 -> () | 1 -> () | 2 -> Hashtbl.replace tags id tag | _ -> assert false end let get_log () = Timemap.find log_tag.tmap (!time -. !offset) let replace_log value = let remafter diff l = let rec fct cpt acc l = if cpt = 0 then List.rev acc else match l with |e::l -> fct (cpt-1) (e::acc) l |[] -> assert false in fct diff [] l in let _,v = Timemap.find log_tag.tmap !time in match value,v with |Log l,Log l' -> let len_l = List.length l in let len_l'= List.length l' in let diff = len_l + len_l' - !log_size in if diff > 0 then if len_l >= !log_size then let l = remafter !log_size l in Timemap.add log_tag.tmap !time (Log l) else let l' = remafter (!log_size - len_l) l' in Timemap.add log_tag.tmap !time (Log (l@l')) else Timemap.add log_tag.tmap !time (Log (l@l')) |Log l,No_value -> Timemap.add log_tag.tmap !time (Log l) |_ -> assert false let replace tag value = let old_value = tag.tmap in let t,v = Timemap.find old_value !time in match value,v with |Int i, Int i' -> if i <> i' then Timemap.add tag.tmap !time value |Float f , Float f' -> if f <> f' then Timemap.add tag.tmap !time value |Int64 i, Int64 i' -> if i <> i' then Timemap.add tag.tmap !time value |Bool b, Bool b' -> if b <> b' then Timemap.add tag.tmap !time value |String s, String s' -> if s <> s' then Timemap.add tag.tmap !time value |Collected , _ -> Timemap.add tag.tmap !time value |Tree t,_ -> Timemap.add tag.tmap !time value |Hashtable (v1,v2,v3,v4),Hashtable (v1',v2',v3',v4') -> if v1<>v1' && v2<>v2' && v3<>v3' && v4<>v4' then Timemap.add tag.tmap !time value |Log _ , _ -> replace_log value |_ , No_value -> Timemap.add tag.tmap !time value |_ -> assert false let change_value id value = let tag = try Hashtbl.find tags id with Not_found -> assert false in begin match value with | Killed -> Timemap.add tag.tmap_st !time St_killed | Collected -> Timemap.add tag.tmap_st !time St_collected; replace tag value | _ -> replace tag value end; begin match id, tag.kind with | 0,_ -> (* max size for heap *) begin let _,value2 = Timemap.find max_heap_size !time in match value,value2 with |Int64 i, Int64 i2 -> if i > i2 then Timemap.add max_heap_size !time value | Int64 i, No_value -> Timemap.add max_heap_size !time value |_ , _ -> () end | 2,_ -> (* execution time *) begin match value with |Float f -> time := f |_ -> () end | _, Tag_count -> (* max for tag count *) if (Hashtbl.mem tag_count_table id) then begin let _,value2 = try Timemap.find (Hashtbl.find tag_max_count_table id) !time with Not_found -> assert false in match value,value2 with |Int i, Int i2 -> if i > i2 then Timemap.add (Hashtbl.find tag_max_count_table id) !time value |Int64 i, Int64 i2 -> if i > i2 then Timemap.add (Hashtbl.find tag_max_count_table id) !time value |Int i , No_value -> Timemap.add (Hashtbl.find tag_max_count_table id) !time value |Int64 i , No_value -> Timemap.add (Hashtbl.find tag_max_count_table id) !time value |_ -> () end | _, Tag_size -> (* max for tag size *) if (Hashtbl.mem tag_size_table id) then begin let _,value2 = try Timemap.find (Hashtbl.find tag_max_size_table id) !time with Not_found -> assert false in match value,value2 with |Int64 i, Int64 i2 -> if i > i2 then Timemap.add (Hashtbl.find tag_max_size_table id) !time value |Int64 i, No_value -> Timemap.add (Hashtbl.find tag_max_size_table id) !time value |_ -> () end | _ -> () end let interp = function |Declare (t,k,n) -> add_tag t k n |Send (t,v) -> change_value t v |Bind l -> List.iter (fun e -> Hashtbl.add bind_table e l) l let list_of_table t = Hashtbl.fold (fun _ tag l -> tag.value <- (let ti,v = Timemap.find tag.tmap (!time -. !offset) in (ti,v)); tag.status <- (let ti,v = Timemap.find tag.tmap_st (!time -. !offset) in (ti,v)); tag::l) t [] let value_of_tag t table = try Timemap.find (Hashtbl.find table t).tmap (!time -. !offset) with Not_found -> assert false let get_tag id = try let tag = (Hashtbl.find tags id) in tag.value <- (let t,v = Timemap.find tag.tmap (!time -. !offset) in (t,v)); tag.status <- (let t,v = Timemap.find tag.tmap_st (!time -. !offset) in (t,v)); tag with Not_found -> assert false let get_point_list () = list_of_table point_table let get_time_list () = list_of_table time_table let get_tag_count_list () = list_of_table tag_count_table let get_tag_size_list () = list_of_table tag_size_table let get_value_int_list () = list_of_table int_table let get_value_float_list () = list_of_table float_table let get_value_string_list () = list_of_table string_table let get_value_bool_list () = list_of_table bool_table let get_tree_list () = list_of_table tree_table let get_hash_list () = list_of_table hash_table let get_bindings t = try Hashtbl.find bind_table t with Not_found -> [] let get_tag_size t = value_of_tag t tag_size_table let get_tag_count t = value_of_tag t tag_count_table let get_point t = value_of_tag t point_table let get_time t = value_of_tag t time_table let get_value_int t = value_of_tag t int_table let get_value_float t = value_of_tag t float_table let get_value_string t = value_of_tag t string_table let get_value_bool t = value_of_tag t bool_table let get_heap_total_size () = Timemap.find heap_size_tag.tmap (!time -. !offset) let get_heap_alive_size () = Timemap.find heap_alive_tag.tmap (!time -. !offset) let get_heap_max_size () = Timemap.find max_heap_size (!time -. !offset) let get_tag_max_count id = try Timemap.find (Hashtbl.find tag_max_count_table id) (!time -. !offset) with Not_found -> assert false let get_tag_max_size id = try Timemap.find (Hashtbl.find tag_max_size_table id) (!time -. !offset) with Not_found -> assert false let get_percent_time id = let t = get_observe_time () in let time',t' = get_time id in match t,t' with |f, Float f' -> if f<>0. then (time',Float (f' *. 100. /. f)) else (time',Float 0.) |_,Killed -> (time',Killed) |_,_ -> (time',No_value ) let get_tag_percent_size id = let _,s = get_heap_total_size () in let t',s' = get_tag_size id in match s,s' with |Int64 i, Int64 i2 -> let i = Int64.to_float i in let i2 = Int64.to_float i2 in if i <> 0. then (t',Float (i2 *. 100. /. i)) else (t',Float 0.) |_,Killed -> (t',Killed) | _, _ -> (t',No_value) let get_tree t = value_of_tag t tree_table let get_hash t = value_of_tag t hash_table let get_hash_percent_filled id = let t,v = get_hash id in match v with |Hashtable (Int l,_,Int e,_) -> if l = 0 then (t, Float 0.) else let lf = float l in let ef = float e in (t, Float ((lf -. ef ) /. lf *. 100.)) |Hashtable (Int64 l,_,Int64 e,_) -> if l = 0L then (t, Float 0.) else let lf = Int64.to_float l in let ef = Int64.to_float e in (t, Float ((lf -. ef ) /. lf *. 100.)) |No_value -> t,No_value |_ -> assert false let get_hash_mean id = let t,v = get_hash id in match v with |Hashtable (Int l,Int n,Int e,Int _) -> if l = e then (t , Float 0.) else let lf = float l in let nf = float n in let ef = float e in (t, Float (nf /. (lf -. ef)) ) |Hashtable (Int64 l,Int64 n,Int64 e,Int64 _) -> if l = e then (t , Float 0.) else let lf = Int64.to_float l in let nf = Int64.to_float n in let ef = Int64.to_float e in (t, Float (nf /. (lf -. ef)) ) |No_value -> (t, No_value) |_ -> assert false (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/db.mli0000644000175000017500000002257111251411607014144 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) (** the Ocamlviz interface for clients *) open Protocol (** The status of a monitored value *) type status = St_active | St_killed | St_collected (** This is the client side type used to describe a monitored data . [tmap] is the array containing successive values of the tag [id] over time. [tmap_st] is the equivalent of [tmap] for status. *) type tag = { id:Protocol.tag; kind:kind; name:string; tmap : value Timemap.t; mutable value : float*value; tmap_st : status Timemap.t; mutable status: float*status; } (** {blank_line} *) val add_tag : Protocol.tag -> kind -> string -> unit (** [add_tag id k n] adds to the database a tag whose id is [id], kind [k], and name [n]. *) val change_value : Protocol.tag -> value -> unit (** [change_value id v] replaces the value of the tag whose identifier is [id] by the value [v]. *) val interp : msg -> unit (** [interp m] matches the message [m] and calls [add_tag] if [m] is a [Declare] message, or [change_value] if [m] is a [Send] message. *) val clean_up : unit -> unit (** [clean_up ()] cleans up every stored values from every timemaps that are older than the record window. *) (** {blank_line} *) val get_current_time : unit -> float (** [get_current_time ()] returns the current time. This is the last time datas were received. *) val set_observe_time : float -> unit (** [set_observe_time t] sets the observation time of the data base at [t]. It is an alternative to [set_offset t']. *) val get_observe_time : unit -> float (** [get_observe_time ()] returns the observation time of the data base. *) val set_offset : float -> unit (** [set_offset t] sets the offset of the database at the time [t], which means that the difference between the observation time and the current time will be [t]. *) val get_offset : unit -> float (** [get_offset ()] returns the difference between observation time and current time. *) val set_record_window : float -> unit (** [set_record_window t] changes the size of the record window with [t] in seconds. This means that the database will now record [t] seconds of execution. *) val get_record_window : unit -> float (** [get_time_window ()] returns the size of the record window in seconds. *) val get_log_size : unit -> int val set_log_size : int -> unit val get_tag : Protocol.tag -> tag (** [get_tag id] returns the tag whose identifier is [id]. *) val get_bindings : Protocol.tag -> Protocol.tag list (** [get_bindings id] returns a list of tags who are bound together. *) val get_heap_total_size : unit -> float * value (** [get_heap_total_size ()] returns the total size value of the major heap that is the closest to the observation time along with its last change time. *) val get_heap_alive_size : unit -> float * value (** [get_heap_alive_size ()] returns the alive datas size value of the major heap that is the closest to the observation time along with its last change time. *) val get_heap_max_size : unit -> float * value (** [get_heap_max_size ()] returns the maximum size value of the major heap that is the closest to the observation time along with its last change time. *) (** {blank_line} *) (** The following functions return couples (time,[value]) for the given [Protocol.tag]. *) (** {blank_line} *) val get_point : Protocol.tag -> float * value (** [get_point id] returns the value of the monitored [Point] [id] that is the closest to the observation time along with its last change time. *) val get_time : Protocol.tag -> float * value (** [get_time id] returns the value of the monitored [Time] [id] that is the closest to the observation time along with its last change time. *) val get_percent_time : Protocol.tag -> float * value (** [get_percent_time id] returns the percentage of the monitored [Time] [id], related to the observation time, that is the closest to the observation time. The time returned is the one returned by [get_time id]. *) val get_tag_size : Protocol.tag -> float * value (** [get_tag_size id] returns the size value of the monitored [Tag] [id] that is the closest to the observation time along with its last change time. *) val get_tag_max_size : Protocol.tag -> float * value (** [get_tag_max_size id] returns the maximum size value of the monitored [Tag] [id] that is the closest to the observation time along with its last change time. *) val get_tag_percent_size : Protocol.tag -> float * value (** [get_tag_percent_size id] returns the percentage of the monitored [Tag] [id], related to the major heap size, that is the closest to the observation time. The time returned is the one returned by [get_tag_size id]. *) val get_tag_count : Protocol.tag -> float * value (** [get_tag_count id] returns the cardinal-number value of the monitored [Tag] [id] that is the closest to the observation time along with its last change time. *) val get_tag_max_count : Protocol.tag -> float * value (** [get_tag_max_count id] returns the maximum cardinal-number value of the monitored [Tag] [id] that is the closest to the observation time along with its last change time. *) val get_value_int : Protocol.tag -> float * value (** [get_value_int id] returns the value of the monitored integer [Value] [id] that is the closest to the observation time along with its last change time. *) val get_value_float : Protocol.tag -> float * value (** [get_value_float id] returns the value of the monitored floating-point [Value] [id] that is the closest to the observation time along with its last change time. *) val get_value_string : Protocol.tag -> float * value (** [get_value_string id] returns the value of the monitored string [Value] [id] that is the closest to the observation time along with its last change time. *) val get_value_bool : Protocol.tag -> float * value (** [get_value_bool id] returns the value of the monitored boolean [Value] [id] that is the closest to the observation time along with its last change time. *) val get_tree : Protocol.tag -> float * value (** [get_tree id] returns the value of the monitored [Tree] [id] that is the closest to the observation time along with its last change time. *) val get_hash : Protocol.tag -> float * value (** [get_hash id] returns the value of the monitored [Hashtable] [id] that is the closest to the observation time along with its last change time. *) val get_hash_percent_filled : Protocol.tag -> float * value (** [get_hash_percent_filled id] returns the filling rate of the monitored [Hashtable] [id] that is the closest to the observation time. The time returned is the one returned by [get_hash id]. *) val get_hash_mean : Protocol.tag -> float * value (** [get_hash_mean id] returns the buckets' mean length of the monitored [Hashtable] [id] that is the closest to the observation time. The time returned is the one returned by [get_hash id]. *) (* LISTS *) (** {blank_line} *) (** The following functions return lists of value of a certain [kind]. *) (** {blank_line} *) val get_point_list: unit -> tag list (** [get_point_list ()] returns a list of every tags whose [kind] is Point. *) val get_time_list: unit -> tag list (** [get_time_list ()] returns a list of every tags whose [kind] is Time. *) val get_tag_count_list: unit -> tag list (** [get_tag_count_list ()] returns a list of every tags whose [kind] is Tag_count. *) val get_tag_size_list: unit -> tag list (** [get_tag_size_list ()] returns a list of every tags whose [kind] is Tag_size. *) val get_value_int_list : unit -> tag list (** [get_value_int_list ()] returns a list of every tags whose [kind] is Value_int. *) val get_value_float_list : unit -> tag list (** [get_value_float_list ()] returns a list of every tags whose [kind] is Value_float. *) val get_value_string_list : unit -> tag list (** [get_value_string_list ()] returns a list of every tags whose [kind] is Value_string. *) val get_value_bool_list : unit -> tag list (** [get_value_bool_list ()] returns a list of every tags whose [kind] is Value_bool. *) val get_tree_list : unit -> tag list (** [get_tree_list ()] returns a list of every tags whose [kind] is Ktree. *) val get_hash_list : unit -> tag list (** [get_hash_list ()] returns a list of every tags whose [kind] is Hash. *) val get_log : unit -> float * value (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/dot.ml0000644000175000017500000000352511251411607014172 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Format open Protocol module H = Hashtbl.Make(struct type t = variant let equal = (==) let hash = Hashtbl.hash end) let color v l = if List.memq v l then " color=\"chartreuse3\" style=filled" else "" let write_to f ?(colored=[]) v = let c = open_out f in let fmt = formatter_of_out_channel c in let h = H.create 17 in let idx = ref 0 in let rec visit (Node (s, l) as v) = try H.find h v with Not_found -> incr idx; let n = "node" ^ string_of_int !idx in H.add h v n; fprintf fmt " %s [label=\"%s\" %s];@\n" n s (color v colored); let l = List.map visit l in List.iter (fun n' -> fprintf fmt "%s -> %s;@\n" n n') l; n in fprintf fmt "digraph {@\n"; ignore (visit v); fprintf fmt "}@."; close_out c (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/graph.ml0000644000175000017500000004053711251411607014511 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Cairo type kind = Undefined | Int | Float | Byte | Percentage type style = Full | Dashed | Empty type elt = { name:string option; tag:int; fct:unit-> float*style; mutable y_prec:float; mutable r:float; mutable g:float; mutable b:float; mutable visible:bool; mutable graph:float array; mutable drawing:style array; } type t = { mutable data : elt list; mutable draw : bool; mutable area : GMisc.drawing_area; mutable idx : int; (* 0..steps-1 *) mutable max : float; mutable max_changed : int; mutable min : float; mutable min_changed : int; mutable steps: int; mutable grid_divx: int; mutable grid_divy: int; mutable lborder: float; mutable rborder: float; mutable vborder: float; mutable xaxis: int; mutable yaxis: int; mutable timer : GMain.Timeout.id option; mutable time : float; mutable period : int; mutable kind : kind } let update_max t = let max = ref (-.max_float) in let index = ref 0 in List.iter (fun e -> for i = 0 to t.idx-1 do if e.graph.(i) > !max then let _ = index := i in max := e.graph.(i) +. 1.; done; for i = t.idx to t.steps-1 do if e.graph.(i) > !max then let _ = index := i in max := e.graph.(i) +. 1.; done; ) t.data; let temp a b = if a > b then a-b else t.steps - b + a in let _ = t.max <- if !max>0. then !max*.1.5 else !max*.0.5 in t.max_changed <- (temp !index t.idx) let update_min t = let min = ref max_float in let index = ref 0 in List.iter (fun e -> for i = 0 to t.idx-1 do if e.graph.(i) < !min then let _ = index := i in min := e.graph.(i) -. 1.; done; for i = t.idx to t.steps-1 do if e.graph.(i) < !min then let _ = index := i in min := e.graph.(i) -. 1.; done; ) t.data; let temp a b = if a > b then a-b else t.steps - b + a in let _ = t.min <- if !min>0. then !min*.0.5 else !min*.1.5 in t.min_changed <- (temp !index t.idx) (********* adds a function f to the graph t *********) let add t tag ?name f typ (cr,cg,cb) = let elt = { name = name; tag = tag; fct = f; r = cr; g = cg; b = cb; y_prec = 0.; visible = true; graph = Array.make t.steps 0.; drawing = Array.make t.steps Empty; } in if t.kind = Undefined then t.kind <- typ; t.data <- elt :: t.data; update_min t; update_max t; elt (********* remove the element e from the graph t *********) let remove t e = t.data <- List.filter (fun a ->not( a.name = e.name && a.r = e.r && a.g = e.g && a.b == e.b) ) t.data; update_max t; update_min t; if (t.data = []) then t.kind <- Undefined let set_color e (r,g,b) = e.r <- r; e.g <- g; e.b <- b let get_color e = (e.r,e.g,e.b) let get_nb_fct t = List.length t.data let get_kind t = t.kind let string_of_byte b = let temp b x = let s = Int64.to_string b in let l = String.length s in let s1 = String.sub s 0 (l-x) in let s2 = String.sub s (l-x) 3 in Format.sprintf "%s.%s" s1 s2 in if b > (Int64.of_int 1000000000) then Format.sprintf "%s GB" (temp b 9) else if b > (Int64.of_int 1000000) then Format.sprintf "%s MB" (temp b 6) else if b > (Int64.of_int 1000) then Format.sprintf "%s KB" (temp b 3) else let s = Int64.to_string b in Format.sprintf "%s B" s (********* handles the y-axis legend depending on graph type *) let ylegend_function i t = match t.kind with | Undefined -> "" | Int -> let f = t.max -. float i *. (t.max -. t.min) /. float t.grid_divy in string_of_float f | Float -> let f = t.max -. float i *. (t.max -. t.min) /. float t.grid_divy in string_of_float f | Percentage -> let f = t.max -. float i *. (t.max -. t.min) /. float t.grid_divy in let s = (string_of_float f) in begin try Format.sprintf "%s %%" (String.sub s 0 5) with Invalid_argument a -> try Format.sprintf "%s %%" (String.sub s 0 4) with Invalid_argument a -> Format.sprintf "%s %%" (String.sub s 0 3) end | Byte -> let f = t.max -. float i *. (t.max -. t.min) /. float t.grid_divy in string_of_byte (Int64.of_float f) (********** draws the 2 axis, the grid, the legends ************) let draw_background cr t width height = Cairo.rectangle cr ~x:t.lborder ~y:t.vborder ~width:(float width -. t.lborder -. t.rborder) ~height:(float height -. 2.*.t.vborder); Cairo.set_source_rgb cr 1.0 1.0 1.0; Cairo.fill cr; Cairo.set_source_rgb cr 0.0 0.0 0.0; Cairo.set_line_width cr 0.2; Cairo.set_dash cr [|2.|] 1.5; for i = 0 to t.grid_divx do let x = t.lborder +. float i *. (float width -. t.lborder -. t.rborder) /. float t.grid_divx in Cairo.move_to cr x t.vborder ; Cairo.line_to cr x (float_of_int height -. t.vborder); (* x-axis legend *) if (i mod t.xaxis = 0) then begin let interval = int_of_float (float (t.steps*t.period) /. 1000.) / t.grid_divx in Cairo.move_to cr (x -. 5.) (float height-. t.vborder +. 10.); let s' = (t.grid_divx -i)* interval in Cairo.show_text cr (string_of_int s') end; done; for i = 0 to t.grid_divy do let y = t.vborder +. float i *. (float height -. 2.*.t.vborder) /. float t.grid_divy in Cairo.move_to cr t.lborder y ; Cairo.line_to cr (float_of_int width -. t.rborder) y; (* y-axis legend *) if ((* i <> t.grid_divy && *) i mod t.yaxis = 0) then begin Cairo.move_to cr (float width -. t.rborder +. 5.) (y+.5.); let s = ylegend_function i t in Cairo.show_text cr s; end; done; Cairo.stroke cr (************ draws a function above the background **************) let redraw_fct t e cr width height = if e.visible then begin let idx = t.idx in let gr = e.graph in let dr = e.drawing in let absc = (float height -. t.vborder) in let dx = (float width -. t.rborder -. t.lborder) /. (float t.steps) in let x = ref (float width -. t.rborder) in let max = t.max in let min = t.min in let h = float height -. (2. *. t.vborder) in set_dash cr [||] 0.; set_source_rgb cr e.r e.g e.b; set_line_width cr 1.; e.y_prec <- absc-.((h *. (gr.(idx) -.min))/. (max-.min)); move_to cr !x e.y_prec; for i=idx to t.steps-1 do let ord = e.y_prec in let next_i = (i+1) mod t.steps in e.y_prec <- absc-.((h *. (gr.(next_i) -.min))/.(max-.min)); begin match dr.(i) with |Full -> line_to cr ~x:(!x-.dx) ~y:ord |Dashed -> begin Cairo.set_dash cr [|3.;2.|] 2.; move_to cr !x e.y_prec; end |Empty -> move_to cr !x e.y_prec end; x := (!x -.dx); done; for i=0 to idx-1 do let ord = absc-.((h *. (gr.(i)-.min))/.(max-.min)) in let next_i = (i+1) mod t.steps in e.y_prec <- absc-.((h *. (gr.(next_i) -.min))/.(max-.min)); begin match dr.(i) with |Full -> line_to cr ~x:(!x-.dx) ~y:ord |Dashed -> begin Cairo.set_dash cr [|3.;2.|] 2.; move_to cr !x e.y_prec; end |Empty -> move_to cr !x e.y_prec end; x := (!x -.dx); done; stroke cr end (************** updates the graph by getting a new value for every function **********) let update_values t = t.time <- Db.get_current_time (); let idx = t.idx - 1 in let idx = if idx < 0 then t.steps-1 else idx in t.idx <- idx; List.iter (fun e -> let x,st = e.fct () in if x > t.max then begin t.max <- max (if x>0. then (1.5 *. x) else (0.5 *. x)) (if t.max>0. then (1.5 *. t.max) else (0.5 *. t.max)); t.max_changed <- 0; end ; if x < t.min then begin t.min <- min (if x<0. then (1.5 *. x) else (0.5 *. x)) (if t.min<0. then (1.5 *. t.min) else (0.5 *. t.min)); t.min_changed <- 0; end ; e.drawing.(idx) <- st; e.graph.(idx) <- x) t.data; let _ = if t.max_changed = t.steps then update_max t else t.max_changed <- t.max_changed +1 in if t.min_changed = t.steps then update_min t else t.min_changed <- t.min_changed +1 (************ draws the background and the function on the drawing area ***********) let redraw t = try let cr = Cairo_lablgtk.create (t.area)#misc#window in let allocation = (t.area)#misc#allocation in let width = allocation.Gtk.width in let height = allocation.Gtk.height in draw_background cr t width height; List.iter (fun elt -> redraw_fct t elt cr width height) t.data; with e -> Format.eprintf " *** exn in redraw: %s@." (Printexc.to_string e) let expose t ev = t.draw <- true; redraw t ; true let refresh t () = update_values t; GtkBase.Widget.queue_draw (t.area)#as_widget; true let stop t = match t.timer with | None -> () | Some timer -> GMain.Timeout.remove timer; t.timer <- None let reset t = t.idx <- 0; t.max <- 0.; t.max_changed <- 0; t.min <- 0.; t.min_changed <- 0 let clear t = List.iter (fun e -> for i=0 to t.steps-1 do e.graph.(i) <- 0.; e.drawing.(i) <- Empty; done; ) t.data; reset t let get_timer t = t.timer let get_period t = t.period let get_steps t = t.steps let get_gridx t = t.grid_divx let get_gridy t = t.grid_divy let get_xaxis t = t.xaxis let get_yaxis t = t.yaxis (********** creates an array of size stp from the old array elt.graph of size ostp ************) let new_array t elt stp ostp = let a = Array.make stp 0. in let a' = Array.make stp Empty in let idx = t.idx in let _ = if stp >= ostp then (* new array is bigger *) begin Array.blit elt.graph idx a 0 (ostp-idx); Array.blit elt.drawing idx a' 0 (ostp-idx); Array.blit elt.graph 0 a (ostp-1-idx) idx; Array.blit elt.drawing 0 a' (ostp-1-idx) idx; end else begin let diff = ostp - 1 - idx in let bool = diff <= stp in let borne = if bool then ostp-1 else idx+stp-1 in Array.blit elt.graph idx a 0 (borne-idx); Array.blit elt.drawing idx a' 0 (borne-idx); if bool then let diff = stp - 1 - (ostp - 1 - idx) in let borne = if idx > diff then diff-1 else idx in Array.blit elt.graph 0 a (stp-diff) (borne+1); Array.blit elt.drawing 0 a' (stp-diff) (borne+1); end in elt.drawing <- a'; elt.graph <- a let new_period t p elt = let a = Array.make t.steps 0. in let a' = Array.make t.steps Empty in let idx = t.idx in let oindex = ref idx in let op = t.period in let tp = ref 0 in let otp = ref 0 in let ograph = ref 0. in let odrawing = ref Empty in let b = ref true in let rec fct i = let incrindex () = incr oindex; if !oindex = t.steps then oindex := 0; if !oindex = idx then b := false; in let maj_old () = ograph := elt.graph.(!oindex); odrawing := elt.drawing.(!oindex); otp := !otp + op; in let affect () = a.(i) <- !ograph; a'.(i) <- !odrawing; tp := !tp + p; in if !b then if otp = tp then begin maj_old (); affect (); incrindex (); end else if otp > tp then begin affect (); end else begin maj_old (); incrindex (); fct i end; in for i=0 to t.steps-1 do fct i done; elt.drawing <- a'; elt.graph <- a (* let float_of_value = function *) (* Protocol.Int i -> float_of_int i *) (* | Protocol.Float f -> f *) (* | Protocol.Int64 i -> Int64.to_float i *) (* | _ -> assert false *) (* let go_tp_elt gr t elt = *) (* Format.eprintf "t:%f@." t; *) (* let a = Array.make gr.steps 0. in *) (* let a' = Array.make gr.steps Empty in *) (* (\* let tm = *\) *) (* (\* match elt.ttag with *\) *) (* (\* | Simple -> Db.get_tmap_tag elt.tag *\) *) (* (\* | Max_count -> Db.get_tmap_tag_max_count elt.tag *\) *) (* (\* | Max_size -> Db.get_tmap_tag_max_size elt.tag *\) *) (* (\* | GC_max -> Db.get_tmap_tag_GC_max () *\) *) (* (\* in *\) *) (* let oindex = ref gr.idx in *) (* let tp = ref t in *) (* let b = ref true in *) (* let period = float gr.period *. 0.001 in *) (* let tmin = gr.time-. (float gr.steps *. period) in *) (* let incrindex () = *) (* incr oindex; *) (* if !oindex = gr.steps *) (* then oindex := 0; *) (* if !oindex = gr.idx *) (* then b := false; *) (* in *) (* let rec fct i = match i with *) (* |0 -> () *) (* |_ -> incrindex ();fct (i-1) *) (* in *) (* Format.eprintf "\n\ntime:%f tmin:%f idx:%d@." gr.time tmin gr.idx; *) (* if !tp > gr.time *) (* then *) (* begin *) (* for i=0 to gr.steps-1 do *) (* if !tp >= 0. *) (* then *) (* begin *) (* if !tp > gr.time *) (* then *) (* begin *) (* (\* let _,v = Timemap.find tm !tp in *\) *) (* (\* a.(i) <- float_of_value v; *\) *) (* (\* a'.(i) <- Full *\) *) (* end *) (* else *) (* begin *) (* a.(i) <- elt.graph.(!oindex); *) (* a'.(i) <- elt.drawing.(!oindex); *) (* incrindex () *) (* end; *) (* end; *) (* tp := !tp -. period; *) (* done *) (* end *) (* else *) (* begin *) (* fct (int_of_float ((gr.time -. !tp) /. period)); *) (* for i=0 to gr.steps-1 do *) (* if !tp >= 0. *) (* then *) (* begin *) (* Format.eprintf "tp:%f @." !tp; *) (* if !tp > tmin *) (* then *) (* begin *) (* Format.eprintf "oindex:%d i:%d@." !oindex i; *) (* a.(i) <- elt.graph.(!oindex); *) (* a'.(i) <- elt.drawing.(!oindex); *) (* incrindex () *) (* end *) (* else *) (* begin *) (* (\* let _,v = Timemap.find tm !tp in *\) *) (* (\* a.(i) <- float_of_value v; *\) *) (* (\* a'.(i) <- Full *\) *) (* end; *) (* end; *) (* tp := !tp -. period; *) (* done; *) (* end; *) (* elt.drawing <- a'; *) (* elt.graph <- a(\* ; *\) *) (* let go_tp gr t = *) (* List.iter (go_tp_elt gr t) gr.data; *) (* gr.idx <- 0 *) let set_preferences t ~step ~divx ~divy ~xaxis ~yaxis = let old_steps = t.steps in if(old_steps != step) then begin List.iter (fun elt -> new_array t elt step old_steps) t.data; t.steps <- step; t.idx <- 0 end; t.grid_divx <- divx; t.grid_divy <- divy; t.xaxis <- xaxis; t.yaxis <- yaxis let set_timer t i = match t.timer with | None -> t.timer <- Some (GMain.Timeout.add ~ms:i ~callback:(refresh t)) | Some timer -> GMain.Timeout.remove timer; t.timer <- Some (GMain.Timeout.add ~ms:i ~callback:(refresh t)) let restart t p = if p <> t.period then begin List.iter (new_period t p) t.data; t.idx <- 0; t.period <- p; end; clear t; set_timer t p let resume t = set_timer t t.period let set_visible e b = e.visible <- b let create ?(width=350) ?(height=200) ?(timeout=100) ?(steps=500) ?(grid_divx=5) ?(grid_divy=5) ?(lborder=10.) ?(rborder=70.) ?(vborder=20.) ?(xaxis=1) ?(yaxis=1) ?packing ?(kind=Undefined) () = let area = GMisc.drawing_area ~width ~height ?packing () in let t = { draw = false;data = [];area=area;idx = 0; max = min_float ; max_changed=0; min = max_float ; min_changed=0; steps=steps ; grid_divx=grid_divx; grid_divy=grid_divy; lborder=lborder ; rborder=rborder ; vborder=vborder; xaxis=xaxis; yaxis=yaxis ; timer=None ; time = 0.; period=timeout ; kind=kind} in ignore (area#event#connect#expose (expose t)); let timer = GMain.Timeout.add ~ms:timeout ~callback:(refresh t) in t.timer <- Some timer; t (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/graph.mli0000644000175000017500000001402311251411607014651 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) (** A module that builds a graph on a Lablgtk drawing area *) (** The kind of the datas represented on the graph *) type kind = Undefined | Int | Float | Byte | Percentage (** The way a point is drawn on the graph *) type style = Full | Dashed | Empty type t (** The abstract type for a graph. *) type elt (** The abstract type for a function of the graph. *) val create : ?width:int -> ?height:int -> ?timeout:int -> ?steps:int -> ?grid_divx:int -> ?grid_divy:int -> ?lborder:float -> ?rborder:float -> ?vborder:float -> ?xaxis:int -> ?yaxis:int -> ?packing:(GObj.widget -> unit) -> ?kind:kind -> unit -> t (** [create ()] creates an empty graph that is a GMisc.drawing_area. @param width Widget's width @param heigh Widget's height @param timeout Graph refresh period (in milliseconds). @param steps The number of values displayed on the graph @param grid_divx The number of divisions of the background along the X-axis @param grid_divy The number of divisions of the background along the Y-axis @param lborder The size of the left border of the widget @param rborder The size of the right border of the widget @param vborder The size of the two borders above and below the drawing area @param xaxis The frequency of the X-axis legend (1 = always displayed, 2 = half displayed etc...) @param yaxis The frequency of the Y-axis legend @param packing The widget to which the graph is packed @param kind The kind of the graph *) val add : t -> Protocol.tag -> ?name:string -> (unit -> float * style ) -> kind -> (float * float * float) -> elt (** [add g tag n f k c] adds a function [f] with name [n] to the graph [g] and returns it as an element of this graph. The function type of the graph is [k]. The function will be displayed with the color [c] which is a rgb color with the floating-point numbers spread from 0.0 to 1.0. @param name Function name *) val remove : t -> elt -> unit (** [remove g f] removes the function [f] from the graph [g]. *) val set_visible : elt -> bool -> unit (** [set_visible f b] displays the function f on the graph according to [b]. *) val set_preferences : t -> step:int -> divx:int -> divy:int -> xaxis:int -> yaxis:int -> unit (** [set_preferences g step divx divy xaxis yaxis ()] changes the value of these arguments in the graph [g]. @param step The number of values displayed on the graph @param divx The number of divisions of the background along the X-axis @param divy The number of divisions of the background along the Y-axis @param xaxis The frequency of the X-axis legend (1 = always displayed, 2 = half displayed etc...) @param yaxis The frequency of the Y-axis legend *) val set_color : elt -> ( float * float * float ) -> unit (** [set_color f c] sets the color [c] used to display the function [f]. [c] is a rgb color with the floating-point numbers spread from 0.0 to 1.0. *) val get_color : elt -> float * float * float (** [get_color f] returns the current color used to display the function [f]. The color is a rgb color with the floating-point numbers spread from 0.0 to 1.0. *) val get_nb_fct : t -> int (** [get_nb_fct g] return the number of functions displayed on [g]. *) val get_kind : t -> kind (** [get_kind g] returns the kind of the graph [g]. *) val stop : t -> unit (** [stop g] stops the timer inside the graph [g]. This function is necessary to remove cleanly the graph [g] from a graphical user interface. *) val resume : t -> unit (** [resume g] restarts the timer of the graph [g] with its old period. *) val restart : t -> int -> unit (** [restart g p] clears the graph [g] and restarts the timer with the period [p]. *) val clear : t -> unit (** [clear g] clears the graph. *) val set_timer : t -> int -> unit (** [set_timer g t] removes the timer inside [g] and replaces it with a new timer whose new timer period will be [t] (in milliseconds). *) val get_timer : t -> GMain.Timeout.id option (** [get_timer g] returns the timer inside [g]. *) val get_period : t -> int (** [get_period g] returns the value of the timer inside [g] (in milliseconds). *) val get_steps : t -> int (** [get_steps g] returns the number of values that are displayed in the graph [g] for each function. *) val get_gridx : t -> int (** [get_gridx g] returns the number of divisions of the background along the X-axis on the graph [g]. *) val get_gridy : t -> int (** [get_gridy g] returns the number of divisions of the background along the Y-axis on the graph [g]. *) val get_xaxis : t -> int (** [get_xaxis g] returns the frequency of the X-axis legend of the graph [g] (1 = always displayed, 2 = half displayed etc...) *) val get_yaxis : t -> int (** [get_yaxis g] returns the frequency of the Y-axis legend of the graph [g] (1 = always displayed, 2 = half displayed etc...) *) (* val go_tp : t -> float -> unit *) (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/gui_misc.ml0000644000175000017500000000627111251411607015204 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) type column = Name | Tag_count | Tag_size | Tag_max_count | Tag_max_size | Tag_percent_size | Stat_count | Stat_time | Stat_percent_time | Value_i | Value_f | Value_b | Value_s | Gc_total | Gc_max | Gc_alive | Hash_elts | Hash_size | Hash_bckts | Hash_empty_bckts | Hash_mean | Hash_percent | Null type page = Stat | Gc | Tag | Value | Value_int | Value_float | Value_bool | Value_string | Exported_graph of column * GMenu.menu_item | Exported_list of GMenu.menu_item | Tree | Hash | Log (* Converts a string to percent *) let to_percent s = let l = String.length s in Format.sprintf "%s %%" (String.sub s 0 (if l > 4 then 4 else l)) (* Converts an int64 to a "byte" string *) let string_of_byte b = let temp b x = let s = Int64.to_string b in let l = String.length s in let s1 = String.sub s 0 (l-x) in let s2 = String.sub s (l-x) 3 in Format.sprintf "%s.%s" s1 s2 in if b > (Int64.of_int 1000000000) then Format.sprintf "%s GB" (temp b 9) else if b > (Int64.of_int 1000000) then Format.sprintf "%s MB" (temp b 6) else if b > (Int64.of_int 1000) then Format.sprintf "%s KB" (temp b 3) else let s = Int64.to_string b in Format.sprintf "%s B" s let time_of_float (f: float) = if f < 60. then let s = string_of_float f in let len = String.length s in Format.sprintf "%s sec" (String.sub s 0 (if len < 5 then len else 5)) else if f < 3600. then begin let f' = int_of_float f in let sec = f' mod 60 in let min = f' /60 in Format.sprintf "%s min %s sec" (string_of_int min) (string_of_int sec) end else begin let f' = int_of_float f in let sec = f' mod 60 in let min = f' mod 3600 /60 in let h = f' / 3600 in Format.sprintf "%s h %s min %s sec" (string_of_int h) (string_of_int min) (string_of_int sec) end let time_of_float_parenthesis f = let s = time_of_float f in Format.sprintf " (%s)" s (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/gui.ml0000644000175000017500000011402011251411607014161 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open GMain open Protocol open Db open Gui_misc open Gui_models open Gui_views open Gui_pref let () = ignore (GtkMain.Main.init ()) (************************************************************ DECLARATIONS ************************************************************* *************************************************************) let graphs = Hashtbl.create 17 let main_window = ref None (* becomes true when main window is destroyed *) let destroyed = ref false let app_notebook = ref None (* number of permanent pages of the notebook *) let nb_real_pages = ref 5 let time_label = ref None let time_window_label = ref None let time_obs_label = ref None let timeout = ref None let timeout_lab = ref None (* "visualize in" menu *) let visualize_menu = ref None (* and its factory *) let visualize_factory = ref None let gc_item = ref None let current_time = ref 0. let observe_time = ref 0. let resumed = ref false let paused = ref false (* GData.adjustment for the record slider *) let record_adj = ref None (* pause button *) let record_pause = ref None let _ = Random.self_init () (* index to make tab labels *) let nb_graph = ref 0 let nb_list = ref 0 let nb_tree = ref 0 external create_color : red:int -> green:int -> blue:int -> Gdk.color = "ml_GdkColor" (* Updates the values of current time and max record time on the GUI *) let fill_labels () = let current_t = Db.get_current_time () in current_time := current_t; if !paused then begin Db.set_offset (current_t -. !observe_time); match !record_scale with |None -> () |Some scl -> scl#adjustment#set_value (-.(Db.get_offset ())) end; begin match !time_label with |None -> () |Some (t_l: GMisc.label) -> t_l#set_text (time_of_float current_t) end; begin match !time_window_label with |None -> () |Some (t_l: GMisc.label) -> let f' = current_t -. !record_window in if f' >= 0. then t_l#set_text (time_of_float (current_t -. !record_window)) else t_l#set_text "" end; begin match !time_obs_label with |None -> () |Some (t_l: GMisc.label) -> let t = Db.get_observe_time () in t_l#set_text (time_of_float t) end; true (* Refresh the GUI with new values *) let refresh_models () = begin try fill_stat (Db.get_point_list ()) (Db.get_time_list ()); fill_tag (Db.get_tag_count_list ()) (Db.get_tag_size_list ()); fill_value (Db.get_value_int_list ()) value_i_model row_int v_i_name_col v_i_tag_col v_i_value_col v_i_value_lm_col v_i_value_lm_s_col v_i_color_col; fill_value (Db.get_value_float_list ()) value_f_model row_float v_f_name_col v_f_tag_col v_f_value_col v_f_value_lm_col v_f_value_lm_s_col v_f_color_col; fill_value (Db.get_value_string_list ()) value_s_model row_string v_s_name_col v_s_tag_col v_s_value_col v_s_value_lm_col v_s_value_lm_s_col v_s_color_col; fill_value (Db.get_value_bool_list ()) value_b_model row_bool v_b_name_col v_b_tag_col v_b_value_col v_b_value_lm_col v_b_value_lm_s_col v_b_color_col; fill_tree (Db.get_tree_list ()); fill_hash (Db.get_hash_list ()); fill_gc (); fill_log (Db.get_log ()); fill_lists (); with e -> Format.printf "%s@." (Printexc.to_string e) end; true (***************************************************************************) (* Detaches a page from the notebook and makes a new window from it *) let detach_from_nb (nb:GPack.notebook) (hb:GPack.box) (hb2:GPack.box) name = let w = GWindow.window ~title:name ~width:450 ~height:300 ~position:`MOUSE ~icon:(GdkPixbuf.from_file "/usr/share/pixmaps/ocaml.xpm") () in let a_g = GtkData.AccelGroup.create () in w#add_accel_group a_g; let parent = hb#misc#parent in ignore(w#event#connect#after#key_press (fun key -> if (GdkEvent.Key.keyval key) = 119 then begin w#destroy () end; true)); ignore (w#connect#destroy ~callback: (fun () -> match parent with | Some p -> hb#misc#reparent p; nb#set_page ~tab_label:hb2#coerce hb#coerce; let i = nb#page_num hb#coerce in nb#goto_page i; | None -> ())); hb#misc#reparent w#coerce; w#show () (* Removes a page from the notebook *) let remove_from_nb (nb:GPack.notebook) (hb:GPack.box) (pg:int) = let pg = nb#page_num hb#coerce in nb#remove_page pg (* Done when a page was removed from the notebook *) let removed_from_nb item table name = Hashtbl.remove table name; match !visualize_menu with |Some (m : GMenu.menu) -> if not !destroyed then m#remove item; |None -> () (* Makes the tab and the label of a page *) let mk_label_nb_close_and_detach (nb:GPack.notebook) (hb:GPack.box) name = let hb2 = GPack.hbox () in let _ = GMisc.label ~height:30 ~markup:name ~packing:hb2#add () in let bdetach = GButton.button ~packing:hb2#add () in let im_detach = GMisc.image ~stock:`FULLSCREEN ~icon_size:`MENU () in bdetach#set_image im_detach#coerce; bdetach#set_relief `NONE; bdetach#set_focus_on_click false; let bclose = GButton.button ~packing:hb2#add () in let im_close = GMisc.image ~stock:`CLOSE ~icon_size:`MENU () in bclose#set_image im_close#coerce; bclose#set_relief `NONE; bclose#set_focus_on_click false; let page = nb#append_page ~tab_label:hb2#coerce hb#coerce in page,hb2,bdetach,bclose let mk_label_nb_detach (nb:GPack.notebook) (hb:GPack.box) name = let hb2 = GPack.hbox () in let _ = GMisc.label ~height:30 ~markup:name ~packing:hb2#add () in let bdetach = GButton.button ~packing:hb2#add () in let im_detach = GMisc.image ~stock:`FULLSCREEN ~icon_size:`MENU () in bdetach#set_image im_detach#coerce; bdetach#set_relief `NONE; bdetach#set_focus_on_click false; let page = nb#append_page ~tab_label:hb2#coerce hb#coerce in hb2,page,bdetach (*************** SCALE FOR TIMEOUTS **************) let changed_spin adj () = match !timeout, !timeout_lab with |None,None -> () |Some t,Some t2 -> GMain.Timeout.remove t; GMain.Timeout.remove t2; let period = int_of_float (adj#value) in default_pref.period <- period; timeout := Some (GMain.Timeout.add ~ms:period ~callback:refresh_models); timeout_lab := Some (GMain.Timeout.add ~ms:period ~callback:fill_labels) |None, Some t -> GMain.Timeout.remove t; let period = int_of_float (adj#value) in default_pref.period <- period; timeout_lab := Some (GMain.Timeout.add ~ms:period ~callback:fill_labels) |_ -> assert false let changed_graph_spin gr adj () = match !timeout with |None -> () |Some t -> let period = int_of_float (adj#value) in Graph.set_timer gr period let changed_pause adj scl pause () = match !timeout with |None -> paused := false; let im = GMisc.image ~stock:`MEDIA_PAUSE ~icon_size:`MENU () in pause#set_image im#coerce; let period = int_of_float (adj#value) in default_pref.period <- period; timeout := Some (GMain.Timeout.add ~ms:period ~callback:refresh_models); if !resumed then Hashtbl.iter (fun _ (gr,_,_) -> Graph.resume gr) graphs else Hashtbl.iter (fun _ (gr,_,_) -> Graph.restart gr default_pref.period) graphs; resumed := false |Some t -> paused := true; resumed := true; observe_time := Db.get_observe_time (); let im = GMisc.image ~stock:`MEDIA_PLAY ~icon_size:`MENU () in pause#set_image im#coerce; GMain.Timeout.remove t; Hashtbl.iter (fun _ (gr,_,_) -> Graph.stop gr) graphs; timeout := None let mk_spin_aux_graph (table: GPack.table) lab = let lbl = GMisc.label ~markup:(Format.sprintf ("%s Period") lab) ~justify:`CENTER ~packing:(table#attach ~top:0 ~left:0 ~expand:`NONE) () in lbl#set_width_chars 15; let adjust = GData.adjustment ~lower:100. ~upper:5000. ~step_incr:1. ~page_incr:10. () in adjust#set_value (float_of_int default_pref.period); let spin = GEdit.spin_button ~update_policy:`IF_VALID ~digits:0 ~packing:(table#attach ~top:0 ~left:1 ~expand:`NONE) ~adjustment:adjust () in let _ = GMisc.label ~markup:"ms" ~justify:`CENTER ~packing:(table#attach ~top:0 ~left:2) () in table#set_col_spacing 2 20; (spin,adjust) let mk_spin_aux_record (box: GPack.box) lab = let frame = GBin.frame ~packing:(box#pack ~expand:false) () in let table = GPack.table ~columns:1 ~rows:2 ~packing:frame#add () in let lbl = GMisc.label ~markup:lab ~justify:`CENTER ~height:37 ~packing:(table#attach ~left:0 ~top:0 ~expand:`NONE) () in lbl#set_width_chars 15; let adjust = GData.adjustment ~lower:100. ~upper:5000. ~step_incr:1. ~page_incr:10. () in adjust#set_value (float_of_int default_pref.period); let hbox = GPack.hbox ~packing:(table#attach ~left:0 ~top:1 ~expand:`NONE) () in hbox#set_spacing 5; let spin = GEdit.spin_button ~update_policy:`IF_VALID ~digits:0 ~packing:(hbox#pack ~expand:true) ~adjustment:adjust () in let _ = GMisc.label ~markup:"ms " ~justify:`CENTER ~packing:(hbox#pack ~expand:false) () in (spin,adjust) let mk_record_box (box: GPack.table) lab lab2 f1 f2 = let hbox = GPack.hbox ~height:70 ~packing:(box#attach ~top:1 ~left:0 ~expand:`X) () in let spin,adjust = mk_spin_aux_record hbox lab in ignore (spin#connect#value_changed ~callback:(f1 adjust) ); let frame = GBin.frame ~packing:hbox#add () in let table = GPack.table ~columns:3 ~rows:2 ~packing:frame#add () in table#set_col_spacings 10; let lbl = GMisc.label ~markup:lab2 ~justify:`CENTER ~packing:(table#attach ~top:0 ~left:0 ~expand:`NONE) () in lbl#set_width_chars 15; let im = GMisc.image ~stock:`MEDIA_PAUSE ~icon_size:`MENU () in let pause = GButton.button ~packing:(table#attach ~top:0 ~left:1 ~expand:`NONE) () in pause#set_image im#coerce; let scl = GRange.scale `HORIZONTAL ~digits:2 ~update_policy:`CONTINUOUS ~packing:(table#attach ~top:0 ~left:2 ~expand:`X) () in scl#adjustment#set_bounds ~lower:(-. !record_window) ~upper:0.0 ~step_incr:0.01 ~page_incr:0.05 (); ignore(scl#connect#value_changed ~callback:(fun () -> let off = -. scl#adjustment#value in Db.set_offset off; scl#adjustment#set_value (-.Db.get_offset ()); ignore(refresh_models ()); )); ignore(scl#connect#adjust_bounds ~callback:(fun _ -> if not !paused then begin let off = -. scl#adjustment#value in Db.set_offset off; scl#adjustment#set_value (-.Db.get_offset ()); ignore(refresh_models ()); Hashtbl.iter (fun _ (g,_,_) -> Graph.clear g) graphs end else begin resumed := false; let off = -. scl#adjustment#value in Db.set_offset off; scl#adjustment#set_value (-.Db.get_offset ()); observe_time := Db.get_observe_time (); ignore(refresh_models ()); end )); record_scale := Some scl; record_pause := Some pause; record_adj := Some adjust; ignore (pause#connect#clicked ~callback:(f2 adjust scl pause) ); let labl_hbox = GPack.hbox ~packing:(table#attach ~top:1 ~left:2 ~expand:`NONE) () in let lab1 = GMisc.label ~packing:(labl_hbox#pack ~from:`START ~expand:false) () in let lab2 = GMisc.label ~packing:(labl_hbox#pack ~from:`END ~expand:false) () in let lab3 = GMisc.label ~packing:(table#attach ~top:1 ~left:0 ~expand:`NONE) () in time_label := Some lab2; time_window_label := Some lab1; time_obs_label := Some lab3 let mk_spin_graph (box: GPack.box) lab f graph = let table = GPack.table ~columns:4 ~rows:1 ~packing:(box#pack ~expand:false) () in table#set_col_spacings 10; let spin,adjust = mk_spin_aux_graph table lab in let window = match !main_window with | None -> assert false | Some (w: GWindow.window) -> w in let im = GMisc.image ~stock:`PREFERENCES ~icon_size:`MENU () in let butt = GButton.button ~packing:(table#attach ~top:0 ~left:3) () in butt#set_image im#coerce; ignore (spin#connect#value_changed ~callback:(f graph adjust) ); ignore (butt#connect#clicked ~callback:(fun () -> mk_preferences_graph window graph lab)) (***************************************************************************) (* Adds a tree in a page on the notebook *) let add_tree (nb:GPack.notebook) = let id = ref 0 in tree_model#foreach (fun _ row -> if tree_model#get ~row ~column:tree_radio_col then id := tree_model#get ~row ~column:tree_tag_col ; false ); let tree = Db.get_tag !id in match tree.value with |_,Protocol.Tree t -> begin let hb = GPack.hbox () in let page,hb2,bdetach,bclose = mk_label_nb_close_and_detach nb hb tree.name in let t_p = Tree_panel.create ~packing:hb#add tree.name t in incr nb_tree; let idx = !nb_tree in Hashtbl.add trees idx (tree,t_p); ignore(bdetach#connect#clicked ~callback:(fun () -> detach_from_nb nb hb hb2 tree.name)); ignore(bclose#connect#clicked ~callback:(fun () -> remove_from_nb nb hb page; Hashtbl.remove trees idx)); nb#goto_page page end |_,No_value -> () |_ -> assert false (*******************************************************************************************) let remove_function (container:GPack.table) hb gr f () = Graph.remove gr f; container#remove (hb#coerce); let children = container#all_children in List.iter (fun c -> container#remove (c#coerce)) children; let rec fct i j = function |c::cl -> if (i < 3) then begin container#attach ~left:i ~top:j c#coerce; fct (i+1) j cl end else begin container#attach ~left:0 ~top:(j+1) c#coerce; fct 1 (j+1) cl end |[] -> () in fct 0 0 (List.rev children) let mk_color_button (container:GPack.table) graph f s column row = let hb = GPack.hbox ~packing:(container#attach ~left:column ~top:row) () in let (r,g,b) = Graph.get_color f in let r = int_of_float (r*.256.*.255.) in let g = int_of_float (g*.255.*.256.) in let b = int_of_float (b*.255.*.256.) in let col = create_color ~red:r ~green:g ~blue:b in let b = GButton.color_button ~color:col ~packing:hb#add () in b#set_relief `NONE; ignore(b#connect#color_set ~callback:( fun () -> let color = b#color in let r = float_of_int (Gdk.Color.red color) /.256. /. 255. in let g = float_of_int (Gdk.Color.green color) /.256. /. 255. in let b = float_of_int (Gdk.Color.blue color) /.256. /. 255. in Graph.set_color f (r,g,b))); let _ = GMisc.label ~text:s ~packing:hb#add () in let vis = GButton.check_button ~active:true ~packing:hb#add () in ignore(vis#connect#toggled ~callback:(fun () -> Graph.set_visible f (vis#active))); let bclose = GButton.button ~packing:hb#add () in let im = GMisc.image ~stock:`CLOSE ~icon_size:`MENU () in bclose#set_image im#coerce; bclose#set_relief `NONE; bclose#set_focus_on_click false; bclose#connect#clicked ~callback:(remove_function container hb graph f) let kind_of_column = function | Tag_count | Stat_count | Tag_max_count | Value_i -> Graph.Int | Tag_size | Tag_max_size | Gc_total | Gc_max | Gc_alive -> Graph.Byte | Value_f | Hash_mean | Stat_time -> Graph.Float | Tag_percent_size | Hash_percent | Stat_percent_time -> Graph.Percentage | Hash_elts | Hash_size | Hash_bckts | Hash_empty_bckts -> Graph.Int | _ -> assert false let style_of_status = function | St_active -> Graph.Full | St_killed | St_collected -> Graph.Dashed let graph_function tag col = let _,st = (Db.get_tag tag).status in let style = style_of_status st in match col with | Tag_count -> begin match Db.get_tag_count tag with | _,Int i -> float i, style | _,Int64 i -> Int64.to_float i, style | _ -> assert false end | Tag_size -> begin match Db.get_tag_size tag with | _,Int64 i -> Int64.to_float i, style | _ -> assert false end | Stat_count -> begin match Db.get_point tag with | _,Int i -> float i, style | _,Int64 i -> Int64.to_float i, style | _ -> assert false end | Stat_time -> begin match Db.get_time tag with |_,Float f -> f,style |_ -> assert false end | Stat_percent_time -> begin match Db.get_percent_time tag with |_,Float f -> f,style |_ -> assert false end | Tag_max_size -> begin match Db.get_tag_max_size tag with | _,Int64 i -> Int64.to_float i, style | _ -> assert false end | Tag_max_count -> begin match Db.get_tag_max_count tag with | _,Int i -> float i , style | _,Int64 i -> Int64.to_float i, style | _ -> assert false end | Tag_percent_size -> begin match Db.get_tag_percent_size tag with | _,Float f -> f , style | _ -> assert false end | Value_i -> begin match Db.get_value_int tag with | _,Int i -> float i , style | _,Int64 i -> Int64.to_float i , style | _,Collected -> 0. , Graph.Dashed | _ -> assert false end | Value_f -> begin match Db.get_value_float tag with | _,Float f -> f , style | _,Collected -> 0. , Graph.Dashed | _ -> assert false end | Gc_total -> let _,size = Db.get_heap_total_size () in begin match size with | Int64 i -> Int64.to_float i, Graph.Full | No_value -> 0. , Graph.Full | _ -> assert false end | Gc_max -> begin match Db.get_heap_max_size () with | _,Int64 i -> Int64.to_float i, Graph.Full | _,No_value -> 0. , Graph.Full | _ -> assert false end | Gc_alive -> let _,alive = Db.get_heap_alive_size () in begin match alive with | Int64 i -> Int64.to_float i , Graph.Full | No_value -> 0. , Graph.Full | _ -> assert false end | Hash_size -> begin match Db.get_hash tag with | _,Hashtable (Int v1,_,_,_) -> float v1, Graph.Full | _,Hashtable (Int64 v1,_,_,_) -> Int64.to_float v1, Graph.Full | _ -> assert false end | Hash_elts -> begin match Db.get_hash tag with | _,Hashtable (_,Int v2,_,_) -> float v2, Graph.Full | _,Hashtable (_,Int64 v2,_,_) -> Int64.to_float v2, Graph.Full | _ -> assert false end | Hash_empty_bckts -> begin match Db.get_hash tag with | _,Hashtable (_,_,Int v3,_) -> float v3, Graph.Full | _,Hashtable (_,_,Int64 v3,_) -> Int64.to_float v3, Graph.Full | _ -> assert false end | Hash_bckts -> begin match Db.get_hash tag with | _,Hashtable (_,_,_,Int v4) -> float v4, Graph.Full | _,Hashtable (_,_,_,Int64 v4) -> Int64.to_float v4, Graph.Full | _ -> assert false end | Hash_mean -> begin match Db.get_hash_mean tag with | _,Float f -> f, Graph.Full | _ -> assert false end | Hash_percent -> begin match Db.get_hash_percent_filled tag with | _,Float f -> f, Graph.Full | _ -> assert false end | _ -> assert false let rec add_function gr container i j = function |(typ,id,name)::list -> if ( kind_of_column typ = Graph.get_kind gr || Graph.get_kind gr = Graph.Undefined) then begin let r = Random.float 0.7 in let g = Random.float 0.7 in let b = Random.float 0.7 in let f = Graph.add gr id ~name (fun () -> graph_function id typ ) (kind_of_column typ) (r,g,b) in if i <= 3 then begin ignore(mk_color_button container gr f name i j ); add_function gr container (i+1) j list end else begin container#set_rows (j+1); ignore(mk_color_button container gr f name 0 (j+1) ); add_function gr container 1 (j+1) list end end |[] -> () let int_of_column = function | Name -> 0 | Tag_count -> 1 | Tag_size -> 2 | Tag_max_count -> 3 | Tag_max_size -> 4 | Tag_percent_size -> 5 | Stat_count -> 6 | Stat_time -> 7 | Stat_percent_time -> 8 | Value_i -> 9 | Value_f -> 10 | Value_b -> 11 | Value_s -> 12 | Gc_total -> 13 | Gc_max -> 14 | Gc_alive -> 15 | Hash_elts -> 16 | Hash_size -> 17 | Hash_bckts -> 18 | Hash_empty_bckts -> 19 | Hash_mean -> 20 | Hash_percent -> 21 | Null -> 22 let add_list (model: GTree.list_store) (tag_col: int GTree.column) (name_col: string GTree.column) value_col color_col (type_col: int GTree.column) (l: (column * int * string ) list ) = let rec add = function |(c,id,name)::list -> let row = model#append () in model#set ~row ~column:name_col name; model#set ~row ~column:tag_col id; let c' = int_of_column c in model#set ~row ~column:type_col c'; add list |[] -> () in add l (* Adds the functions from the list l to the selected graph *) let add_to_graph selected l = let gr,container,_ = Hashtbl.find graphs selected in let nb_f = Graph.get_nb_fct gr in let i = nb_f mod 4 in let j = nb_f/ 4 in add_function gr container i j (List.rev l) let add_to_list selected l = let model,tag_col,name_col,value_col,_,_,color_col,type_col = Hashtbl.find lists_table selected in add_list model tag_col name_col value_col color_col type_col (List.rev l) let col_tag_of_typ = function | Tag_count | Tag_max_count -> t_tag_count_col | Tag_size | Tag_max_size | Tag_percent_size -> Format.eprintf "ici@.";t_tag_size_col | Stat_count -> s_tag_count_col | Stat_time | Stat_percent_time -> s_tag_time_col | Value_i -> v_i_tag_col | Value_f -> v_f_tag_col | Value_b -> v_b_tag_col | Value_s -> v_s_tag_col | Hash_elts | Hash_size | Hash_bckts | Hash_empty_bckts | Hash_mean | Hash_percent-> h_tag_col |_ -> Format.eprintf "col_tag_of_typ@.";assert false (* Iters on a column and returns the names of the checked cells *) let check_toggle_aux (model : GTree.list_store) (column : bool GTree.column) name_column typ (l : (Protocol.tag * string ) list ref) = begin model#foreach (fun _ row -> let bool = model#get ~row ~column in if bool then begin let v = model#get ~row ~column:(col_tag_of_typ typ) in if (v<>0) then begin l:= (v,model#get ~row ~column:name_column )::!l; end; model#set ~row ~column false; end; false); match !l with |_::_ -> typ,!l |[] -> Null,!l end let check_toggle (column : bool GTree.column) typ page = let l = ref [] in match page with |Stat -> check_toggle_aux stat_model column s_name_col typ l |Tag -> check_toggle_aux tag_model column t_name_col typ l |Hash -> check_toggle_aux hash_model column h_name_col typ l |Value_int -> check_toggle_aux value_i_model column v_i_name_col typ l |Value_float -> check_toggle_aux value_f_model column v_f_name_col typ l |Value_string -> check_toggle_aux value_s_model column v_s_name_col typ l |Value_bool -> check_toggle_aux value_b_model column v_b_name_col typ l |Gc -> begin gc_model#foreach (fun _ row -> let bool = gc_model#get ~row ~column in if bool then begin let _ = match typ with |Gc_total -> l:= (0,"Total Size")::!l |Gc_max -> l:= (0,"Max Size")::!l |Gc_alive -> l:= (1,"Living Bytes")::!l |_-> assert false in gc_model#set ~row ~column false; end; false); match !l with |_::_ -> typ,!l |[] -> Null,!l end | _ -> assert false let clear_toggle column = function | Stat_time | Stat_percent_time -> stat_model#foreach (fun _ row -> stat_model#set ~row ~column false; false) | Value_s -> value_s_model#foreach (fun _ row -> value_s_model#set ~row ~column false; false) | Value_b -> value_b_model#foreach (fun _ row -> value_b_model#set ~row ~column false; false) | _ -> assert false (* for now *) let treat_toggles nb (l : (column * (int*string) list) list) = let rec treatment_aux acc = function |[] -> acc |(col,list)::res -> treatment_aux ((List.map (fun (i,n) -> (col,i,n)) list)::acc) res in List.flatten (treatment_aux [] l) (* *) let rec collect_toggles_aux acc = function | check::c, typ::t, page::p -> collect_toggles_aux ((check_toggle check typ page)::acc) (c, t, p) | [],[],[] -> acc | _ -> assert false let collect_toggles nb col_typ = let c = [s_check_count_col;t_check_count_col;t_check_max_count_col;t_check_size_col;t_check_max_size_col;t_check_percent_col; v_i_check_value_col;v_f_check_value_col;gc_check_total;gc_check_max;gc_check_alive;h_length_check_col;h_real_length_check_col; h_length_b_check_col;h_empty_b_check_col;h_mean_check_col;h_percent_check_col;s_check_time_col;s_check_percent_col] in let t = [Stat_count;Tag_count;Tag_max_count;Tag_size;Tag_max_size;Tag_percent_size;Value_i;Value_f;Gc_total; Gc_max;Gc_alive;Hash_elts;Hash_size;Hash_bckts;Hash_empty_bckts;Hash_mean;Hash_percent;Stat_time;Stat_percent_time] in let o = [Stat;Tag;Tag;Tag;Tag;Tag;Value_int;Value_float;Gc;Gc;Gc;Hash;Hash;Hash;Hash;Hash;Hash;Stat;Stat] in if col_typ = 1 then (* collects toggle for lists *) let c = v_s_check_value_col::v_b_check_value_col::c in let t = Value_s::Value_b::t in let o = Value_string::Value_bool::o in let list = collect_toggles_aux [] (c, t, o) in treat_toggles nb list else (* collects toggle for graphs *) let list = collect_toggles_aux [] (c, t, o) in clear_toggle v_s_check_value_col Value_s; clear_toggle v_b_check_value_col Value_b; treat_toggles nb list (* Makes a new graph from the list l *) let rec new_graph noteb (l: (column * int * string) list) = try let t,_,_ = List.find (fun (typ,_,_) -> typ <> Null) l in incr nb_graph; let name = Format.sprintf "Graph%s" (string_of_int !nb_graph) in let item = match !visualize_factory with |Some (f : GMenu.menu GMenu.factory) -> f#add_item name ~callback:(fun () -> add_to_graph name (collect_toggles noteb 0)) | _ -> assert false in mk_notebook name (Exported_graph(t,item)) noteb; let gr,container,_ = Hashtbl.find graphs name in add_function gr container 0 0 (List.rev l) with Not_found -> () and new_list noteb (l: (column * int * string ) list ) = try let _ = List.find (fun (typ,_,_) -> typ <> Null) l in incr nb_list; let name = Format.sprintf "List%s" (string_of_int !nb_list) in let item = match !visualize_factory with |Some (f : GMenu.menu GMenu.factory) -> f#add_item name ~callback:(fun () -> add_to_list name (collect_toggles noteb 1)) | _ -> assert false in mk_notebook name (Exported_list(item)) noteb; let model,tag_col,name_col,value_col,value_lm_col,value_lm_s_col,color_col,type_col = Hashtbl.find lists_table name in add_list model tag_col name_col value_col color_col type_col (List.rev l) with Not_found -> () (* Creates a new notebook page *) and mk_notebook name typ (nb:GPack.notebook) = let hb = GPack.hbox () in match typ with |Stat -> let hb2,_,bdetach = mk_label_nb_detach nb hb name in let m,m' = mk_model stat_model Stat in mk_view m m' hb Stat; ignore(bdetach#connect#clicked ~callback:(fun () -> detach_from_nb nb hb hb2 name)); |Gc -> let hb2,_,bdetach = mk_label_nb_detach nb hb name in let vb = GPack.vbox ~packing:hb#add () in vb#set_spacing 10; let m,m' = mk_model gc_model Gc in mk_view m m' vb Gc; ignore(init_gc ()); let gr = Graph.create ~width:450 ~height:200 ~timeout:default_pref.period ~steps:default_pref.steps ~grid_divx:default_pref.gridx ~grid_divy:default_pref.gridy ~xaxis:default_pref.xaxis ~yaxis:default_pref.yaxis ~packing:vb#add ~kind:Graph.Byte () in let f1 = Graph.add gr 0 ~name:"size" (fun () -> graph_function 0 Gc_total) Graph.Byte (1.0,0.0,0.0) in let f3 = Graph.add gr 1 ~name:"alive" (fun () -> graph_function 1 Gc_alive) Graph.Byte (0.0,0.0,1.0) in let f2 = Graph.add gr 0 ~name:"max" (fun () -> begin match Db.get_heap_max_size () with | _,Int64 i -> Int64.to_float i, Graph.Full | _,No_value -> 0. , Graph.Full | _ -> assert false end) Graph.Byte (0.0,1.0,0.0) in mk_spin_graph vb "Gc" changed_graph_spin gr; let color_frame = GBin.frame ~height:50 ~packing:vb#add () in let color_container = GPack.table ~columns:4 ~rows:1 ~packing:color_frame#add () in let item = match !gc_item with Some i -> i | None -> assert false in Hashtbl.add graphs "GC" (gr,color_container,item); ignore (mk_color_button color_container gr f1 "Total Size" 0 0 ); ignore (mk_color_button color_container gr f2 "Max Size" 1 0 ); ignore (mk_color_button color_container gr f3 "Living Bytes" 2 0); ignore(bdetach#connect#clicked ~callback:(fun () -> detach_from_nb nb hb hb2 name)); |Tag -> let hb2,_,bdetach = mk_label_nb_detach nb hb name in let m,m' = mk_model tag_model Tag in mk_view m m' hb Tag; ignore(bdetach#connect#clicked ~callback:(fun () -> detach_from_nb nb hb hb2 name)); |Value -> let hb2,_,bdetach = mk_label_nb_detach nb hb name in let vb = GPack.vbox ~packing:hb#add () in mk_view_value vb Value_int value_i_model "Integers" ; mk_view_value vb Value_float value_f_model "Floats" ; mk_view_value vb Value_bool value_b_model "Booleans" ; mk_view_value vb Value_string value_s_model "Strings"; ignore(bdetach#connect#clicked ~callback:(fun () -> detach_from_nb nb hb hb2 name)); |Exported_graph (typ,item)-> let page,hb2,bdetach,bclose = mk_label_nb_close_and_detach nb hb name in let vb = GPack.vbox ~packing:hb#add () in let kind = kind_of_column typ in let gr = Graph.create ~height:200 ~timeout:default_pref.period ~steps:default_pref.steps ~grid_divx:default_pref.gridx ~grid_divy:default_pref.gridy ~xaxis:default_pref.xaxis ~yaxis:default_pref.yaxis ~packing:vb#add ~kind () in ignore(bdetach#connect#clicked ~callback:(fun () -> detach_from_nb nb hb hb2 name)); ignore(bclose#connect#clicked ~callback:(fun () -> remove_from_nb nb hb page; Graph.stop gr; removed_from_nb item graphs name )); mk_spin_graph vb name changed_graph_spin gr; let color_frame = GBin.frame ~height:50 ~packing:vb#add () in let color_container = GPack.table ~columns:4 ~rows:1 ~packing:color_frame#add () in Hashtbl.add graphs name (gr,color_container,item); nb#goto_page page |Exported_list (item) -> let page,hb2,bdetach,bclose = mk_label_nb_close_and_detach nb hb name in let m,n_col,v_col,v_lm_col,c_col = mk_model_list name in mk_view_list m n_col v_col v_lm_col c_col hb; ignore(bdetach#connect#clicked ~callback:(fun () -> detach_from_nb nb hb hb2 name)); ignore(bclose#connect#clicked ~callback:(fun () -> remove_from_nb nb hb page; removed_from_nb item lists_table name )); nb#goto_page page |Tree -> let hb2,_,bdetach = mk_label_nb_detach nb hb name in let vb = GPack.vbox ~packing:hb#add () in vb#set_spacing 10; let table = GPack.table ~rows:1 ~columns:1 ~packing:(vb#pack ~expand:false) () in let butt = GButton.button ~label:" Visualize" ~packing:(table#attach ~left:0 ~top:0) () in let im = GMisc.image ~stock:`OK ~icon_size:`MENU () in butt#set_image im#coerce; ignore(butt#connect#clicked (fun () -> add_tree nb)); let hb3 = GPack.hbox ~packing:vb#add () in let m,m' = mk_model tree_model Tree in mk_view_tree m m' hb3; ignore(bdetach#connect#clicked ~callback:(fun () -> detach_from_nb nb hb hb2 name)); |Hash -> let hb2,_,bdetach = mk_label_nb_detach nb hb name in let m,m' = mk_model hash_model Hash in mk_view m m' hb Hash; ignore(bdetach#connect#clicked ~callback:(fun () -> detach_from_nb nb hb hb2 name)); |Log -> let hb2,_,bdetach = mk_label_nb_detach nb hb name in mk_view_log log_model hb; ignore(bdetach#connect#clicked ~callback:(fun () -> detach_from_nb nb hb hb2 name)) |_ -> assert false (*************************************************** MAIN **************************************************** ****************************************************) open GdkKeysyms let tab_of_key = function |38 -> 0 |233 -> 1 |34 -> 2 |39 -> 3 |40 -> 4 |45 -> 5 |232 -> 6 |95 -> 7 |231 -> 8 | _ -> assert false let bind_keys key window (noteb: GPack.notebook) = match (GdkEvent.Key.keyval key) with |k when k = 119 -> let pg = noteb#current_page in if pg > !nb_real_pages then begin noteb#remove_page pg; end ; true |k when (k = 38 || k = 233 || k = 34 || k = 39 || k = 231 || k = 95 || k = 232 || k = 45 || k = 40 ) -> noteb#goto_page (tab_of_key k); true |k when k = 112 -> let adjust,scl,pause = match !record_adj,!record_scale,!record_pause with |Some a, Some s, Some p -> a,s,p |_ -> assert false in changed_pause adjust scl pause (); true |_ -> (* as k -> Format.eprintf "key: %d @." k; *) true let start () = let window = GWindow.window ~title:"Ocamlviz" ~position:`CENTER ~icon:(GdkPixbuf.from_file "/usr/share/pixmaps/ocaml.xpm") () in main_window := Some window; let table = GPack.table ~rows:3 ~columns:1 ~packing:window#add () in (************** menu ******************) let menubar = GMenu.menu_bar ~packing:(table#attach ~top:0 ~left:0 ~expand:`NONE)(* vb#pack *) () in let factory = new GMenu.factory menubar in let accel_group = factory#accel_group in let file_menu = factory#add_submenu "Menu" in let factory1 = new GMenu.factory file_menu ~accel_group in let visualize = factory#add_submenu "Visualize in" in visualize_menu := Some visualize; let preference = factory#add_submenu "Preferences" in let factory2 = new GMenu.factory visualize ~accel_group in visualize_factory := Some factory2; let factory3 = new GMenu.factory preference ~accel_group in let factory4 = new GMenu.factory preference ~accel_group in let factory5 = new GMenu.factory preference ~accel_group in mk_record_box table "Refresh Period" "Record Panel" changed_spin changed_pause; (************** notebook **************) let noteb = GPack.notebook ~packing:(table#attach ~top:2 ~left:0 ~expand:`BOTH) () in app_notebook := Some noteb; (************** menu ******************) ignore(factory1#add_item "Next Tab" ~key:_Page_Up ~callback:(fun () -> noteb#next_page () )); ignore(factory1#add_item "Previous Tab" ~key:_Page_Down ~callback:(fun () -> noteb#previous_page () )); ignore(factory1#add_separator ()); ignore(factory1#add_item "Close" ~key:_Q ~callback:Main.quit ); ignore(factory2#add_item "a New Graph" ~key:_G ~callback:(fun ()-> new_graph noteb (collect_toggles noteb 0) )); ignore(factory2#add_separator ()); let gc = factory2#add_item "GC page" ~callback:(fun ()-> add_to_graph "GC" (collect_toggles noteb 0) ) in ignore(factory2#add_separator ()); ignore(factory2#add_item "a New List" ~key:_T ~callback:(fun () -> new_list noteb (collect_toggles noteb 1) )); gc_item := Some gc; ignore(factory3#add_item "Graphs" ~key:_E ~callback:(fun () -> mk_graph_preferences_menu window)); ignore(factory4#add_item "Record Time Window" ~key:_R ~callback:(fun () -> mk_time_window_preferences window)); ignore(factory5#add_item "Log Size" ~key:_L ~callback:(fun () -> mk_log_preferences window)); mk_notebook "Stats" Stat noteb; mk_notebook "Values" Value noteb; mk_notebook "Tags" Tag noteb; mk_notebook "Hash tables" Hash noteb; mk_notebook "Trees" Tree noteb; mk_notebook "Log" Log noteb; mk_notebook "Gc" Gc noteb; noteb#goto_page 6; window#add_accel_group accel_group; ignore(window#event#connect#after#key_press (fun key -> bind_keys key window noteb)); ignore(window#connect#destroy ~callback:(fun () -> destroyed:=true)); ignore(window#connect#destroy ~callback:Main.quit ); window#show (); let _ = Thread.create Net.read_data () in (* Requests a refresh every X ms *) timeout := Some (GMain.Timeout.add ~ms:default_pref.period ~callback:refresh_models); timeout_lab := Some (GMain.Timeout.add ~ms:default_pref.period ~callback:fill_labels); GtkThread.main () let () = start () (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/gui_models.ml0000644000175000017500000006574111251411607015543 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Db open Protocol open Gui_misc let row_stat = Hashtbl.create 17 let row_tag = Hashtbl.create 17 let row_int = (Hashtbl.create 17: (int,Gtk.tree_iter) Hashtbl.t) let row_float = (Hashtbl.create 17: (int,Gtk.tree_iter) Hashtbl.t) let row_string = (Hashtbl.create 17: (int,Gtk.tree_iter) Hashtbl.t) let row_bool = (Hashtbl.create 17: (int,Gtk.tree_iter) Hashtbl.t) let row_tree = (Hashtbl.create 17: (int,Gtk.tree_iter) Hashtbl.t) let row_hash = (Hashtbl.create 17: (int,Gtk.tree_iter) Hashtbl.t) let lists_table = (Hashtbl.create 17: (string, GTree.list_store * Protocol.tag GTree.column * string GTree.column * string GTree.column * float GTree.column * string GTree.column * string GTree.column * int GTree.column) Hashtbl.t) let trees = (Hashtbl.create 17: (int, Db.tag * Tree_panel.t) Hashtbl.t) (* For the Stat notebook *) let stat_cols = new GTree.column_list let s_name_col = stat_cols#add Gobject.Data.string let s_tag_count_col = stat_cols#add Gobject.Data.int let s_count_col = stat_cols#add Gobject.Data.string let s_count_lm_col = stat_cols#add Gobject.Data.float let s_count_lm_s_col = stat_cols#add Gobject.Data.string let s_count_color_col = stat_cols#add Gobject.Data.string let s_check_count_col = stat_cols#add Gobject.Data.boolean let s_tag_time_col = stat_cols#add Gobject.Data.int let s_time_col = stat_cols#add Gobject.Data.string let s_time_lm_col = stat_cols#add Gobject.Data.float let s_time_lm_s_col = stat_cols#add Gobject.Data.string let s_time_color_col = stat_cols#add Gobject.Data.string let s_check_time_col = stat_cols#add Gobject.Data.boolean let s_percent_col = stat_cols#add Gobject.Data.string let s_check_percent_col = stat_cols#add Gobject.Data.boolean let stat_model = GTree.list_store stat_cols (* For the Tag notebook *) let tag_cols = new GTree.column_list let t_name_col = tag_cols#add Gobject.Data.string let t_tag_count_col = tag_cols#add Gobject.Data.int let t_count_col = tag_cols#add Gobject.Data.string let t_count_lm_col = tag_cols#add Gobject.Data.float let t_count_lm_s_col = tag_cols#add Gobject.Data.string let t_count_color_col = tag_cols#add Gobject.Data.string let t_check_count_col = tag_cols#add Gobject.Data.boolean let t_max_count_col = tag_cols#add Gobject.Data.string let t_max_count_lm_col = tag_cols#add Gobject.Data.float let t_max_count_lm_s_col = tag_cols#add Gobject.Data.string let t_check_max_count_col = tag_cols#add Gobject.Data.boolean let t_tag_size_col = tag_cols#add Gobject.Data.int let t_size_col = tag_cols#add Gobject.Data.string let t_realsize_col = tag_cols#add Gobject.Data.string let t_size_lm_col = tag_cols#add Gobject.Data.float let t_size_lm_s_col = tag_cols#add Gobject.Data.string let t_size_color_col = tag_cols#add Gobject.Data.string let t_check_size_col = tag_cols#add Gobject.Data.boolean let t_max_size_col = tag_cols#add Gobject.Data.string let t_realmax_size_col = tag_cols#add Gobject.Data.string let t_max_size_lm_col = tag_cols#add Gobject.Data.float let t_max_size_lm_s_col = tag_cols#add Gobject.Data.string let t_check_max_size_col = tag_cols#add Gobject.Data.boolean let t_percent_col = tag_cols#add Gobject.Data.string let t_check_percent_col = tag_cols#add Gobject.Data.boolean let tag_model = GTree.list_store tag_cols (* For the Value notebook *) let value_int_cols = new GTree.column_list let v_i_name_col = value_int_cols#add Gobject.Data.string let v_i_tag_col = value_int_cols#add Gobject.Data.int let v_i_value_col = value_int_cols#add Gobject.Data.string let v_i_value_lm_col = value_int_cols#add Gobject.Data.float let v_i_value_lm_s_col = value_int_cols#add Gobject.Data.string let v_i_color_col = value_int_cols#add Gobject.Data.string let v_i_check_value_col = value_int_cols#add Gobject.Data.boolean let value_i_model = GTree.list_store value_int_cols let value_float_cols = new GTree.column_list let v_f_name_col = value_float_cols#add Gobject.Data.string let v_f_tag_col = value_float_cols#add Gobject.Data.int let v_f_value_col = value_float_cols#add Gobject.Data.string let v_f_value_lm_col = value_float_cols#add Gobject.Data.float let v_f_value_lm_s_col = value_float_cols#add Gobject.Data.string let v_f_color_col = value_float_cols#add Gobject.Data.string let v_f_check_value_col = value_float_cols#add Gobject.Data.boolean let value_f_model = GTree.list_store value_float_cols let value_bool_cols = new GTree.column_list let v_b_name_col = value_bool_cols#add Gobject.Data.string let v_b_tag_col = value_bool_cols#add Gobject.Data.int let v_b_value_col = value_bool_cols#add Gobject.Data.string let v_b_value_lm_col = value_bool_cols#add Gobject.Data.float let v_b_value_lm_s_col = value_bool_cols#add Gobject.Data.string let v_b_color_col = value_bool_cols#add Gobject.Data.string let v_b_check_value_col = value_bool_cols#add Gobject.Data.boolean let value_b_model = GTree.list_store value_bool_cols let value_string_cols = new GTree.column_list let v_s_name_col = value_string_cols#add Gobject.Data.string let v_s_tag_col = value_string_cols#add Gobject.Data.int let v_s_value_col = value_string_cols#add Gobject.Data.string let v_s_value_lm_col = value_string_cols#add Gobject.Data.float let v_s_value_lm_s_col = value_string_cols#add Gobject.Data.string let v_s_color_col = value_string_cols#add Gobject.Data.string let v_s_check_value_col = value_string_cols#add Gobject.Data.boolean let value_s_model = GTree.list_store value_string_cols (* For the Gc notebook *) let gc_cols = new GTree.column_list let gc_total = gc_cols#add Gobject.Data.string let gc_check_total = gc_cols#add Gobject.Data.boolean let gc_max = gc_cols#add Gobject.Data.string let gc_check_max = gc_cols#add Gobject.Data.boolean let gc_alive = gc_cols#add Gobject.Data.string let gc_check_alive = gc_cols#add Gobject.Data.boolean let gc_model = GTree.list_store gc_cols let tree_cols = new GTree.column_list let tree_name_col = tree_cols#add Gobject.Data.string let tree_tag_col = tree_cols#add Gobject.Data.int let tree_lm_s_col = tree_cols#add Gobject.Data.string let tree_radio_col = tree_cols#add Gobject.Data.boolean let tree_model = GTree.list_store tree_cols let hash_cols = new GTree.column_list let h_name_col = hash_cols#add Gobject.Data.string let h_tag_col = hash_cols#add Gobject.Data.int let h_length_col = hash_cols#add Gobject.Data.string let h_length_check_col = hash_cols#add Gobject.Data.boolean let h_real_length_col = hash_cols#add Gobject.Data.string let h_real_length_check_col = hash_cols#add Gobject.Data.boolean let h_length_b_col = hash_cols#add Gobject.Data.string let h_length_b_check_col = hash_cols#add Gobject.Data.boolean let h_empty_b_col = hash_cols#add Gobject.Data.string let h_empty_b_check_col = hash_cols#add Gobject.Data.boolean let h_lm_col = hash_cols#add Gobject.Data.string let h_lm_s_col = hash_cols#add Gobject.Data.string let h_mean_col = hash_cols#add Gobject.Data.string let h_mean_check_col = hash_cols#add Gobject.Data.boolean let h_percent_col = hash_cols#add Gobject.Data.int let h_percent_check_col = hash_cols#add Gobject.Data.boolean let hash_model = GTree.list_store hash_cols let log_cols = new GTree.column_list let l_time_col = log_cols#add Gobject.Data.string let l_log_col = log_cols#add Gobject.Data.string let l_color_col = log_cols#add Gobject.Data.string let log_model = GTree.list_store log_cols (************************************************* FUNCTIONS TO FILL THE MODELS ************************************************** **************************************************) (* Fills the stat page with incomming values *) let fill_stat point_list time_list = let model = stat_model in let fct_point {id=id; name=n; value=t,v; status=st} = let fct row = let _,st = st in begin match st with | St_killed -> model#set ~row ~column:s_count_color_col "#EA2F24" | St_active -> model#set ~row ~column:s_count_color_col "#000000" | _ -> assert false end; match v with | No_value -> () | Killed -> () | Int i -> model#set ~row ~column:s_count_col (string_of_int i); model#set ~row ~column:s_count_lm_col t; model#set ~row ~column:s_count_lm_s_col (time_of_float_parenthesis t) | Int64 i -> model#set ~row ~column:s_count_col (Int64.to_string i); model#set ~row ~column:s_count_lm_col t; model#set ~row ~column:s_count_lm_s_col (time_of_float_parenthesis t) | _ -> assert false in if not(Hashtbl.mem row_stat n) then let row = model#append () in model#set ~row ~column:s_name_col n; model#set ~row ~column:s_tag_count_col id; model#set ~row ~column:s_count_lm_s_col "Never"; fct row; Hashtbl.add row_stat n row else let row = Hashtbl.find row_stat n in fct row in let fct_time {id=id; name=n; value=t,v; status=st} = let fct row = let _,st = st in begin match st with | St_killed -> model#set ~row ~column:s_time_color_col "#EA2F24" | St_active -> model#set ~row ~column:s_time_color_col "#000000" | _ -> assert false end; begin match v with | No_value -> () | Killed -> () | Float f -> model#set ~row ~column:s_time_col (string_of_float f); model#set ~row ~column:s_time_lm_col t; model#set ~row ~column:s_time_lm_s_col (time_of_float_parenthesis t) | _ -> assert false end; let _,pv = Db.get_percent_time id in begin match pv with | No_value -> () | Killed -> () | Float f -> model#set ~row ~column:s_percent_col (to_percent (string_of_float(f))) | _ -> assert false end in if not(Hashtbl.mem row_stat n) then let row = model#append () in model#set ~row ~column:s_name_col n; model#set ~row ~column:s_tag_time_col id; model#set ~row ~column:s_time_lm_s_col "Never"; fct row; Hashtbl.add row_stat n row else let row = Hashtbl.find row_stat n in fct row; in List.iter fct_point point_list; List.iter fct_time time_list (* Fills the tag page with values *) let fill_tag count_list size_list = let model = tag_model in let fct_count {id=id; name=n; value=t,v; status=st} = let fct row = let _,st = st in begin match st with | St_killed -> model#set ~row ~column:t_count_color_col "#EA2F24" | St_active -> model#set ~row ~column:t_count_color_col "#000000" | _ -> assert false end; begin match v with | No_value -> () | Int i -> model#set ~row ~column:t_count_col (string_of_int i); model#set ~row ~column:t_count_lm_col t; model#set ~row ~column:t_count_lm_s_col (time_of_float_parenthesis t) | Int64 i -> model#set ~row ~column:t_count_col (Int64.to_string i); model#set ~row ~column:t_count_lm_col t; model#set ~row ~column:t_count_lm_s_col (time_of_float_parenthesis t) | _ -> assert false end; let tmc,mc = Db.get_tag_max_count id in begin match mc with | No_value -> () | Killed -> () | Int i -> model#set ~row ~column:t_max_count_col (string_of_int i); model#set ~row ~column:t_max_count_lm_col tmc; model#set ~row ~column:t_max_count_lm_s_col (time_of_float_parenthesis tmc) | Int64 i -> model#set ~row ~column:t_max_count_col (Int64.to_string i); model#set ~row ~column:t_max_count_lm_col tmc; model#set ~row ~column:t_max_count_lm_s_col (time_of_float_parenthesis tmc) | _ -> assert false end in if not(Hashtbl.mem row_tag id) then let l = Db.get_bindings id in if List.mem id l then let id' = List.find (fun id' -> id' <> id) l in if Hashtbl.mem row_tag id' then let row = Hashtbl.find row_tag id' in model#set ~row ~column:t_tag_count_col id; Hashtbl.add row_tag id row; fct row else let row = model#append () in model#set ~row ~column:t_name_col n; model#set ~row ~column:t_tag_count_col id; model#set ~row ~column:t_count_lm_s_col "Never"; model#set ~row ~column:t_max_count_lm_s_col "Never"; fct row; Hashtbl.add row_tag id row else let row = model#append () in model#set ~row ~column:t_name_col n; model#set ~row ~column:t_tag_count_col id; model#set ~row ~column:t_count_lm_s_col "Never"; model#set ~row ~column:t_max_count_lm_s_col "Never"; fct row; Hashtbl.add row_tag id row else let row = Hashtbl.find row_tag id in fct row in let fct_size {id=id; name=n; value=t,v; status=st} = let fct row = let _,st = st in begin match st with | St_killed -> model#set ~row ~column:t_size_color_col "#EA2F24" | St_active -> model#set ~row ~column:t_size_color_col "#000000" | _ -> assert false end; begin match v with | No_value -> () | Killed -> () | Int64 b -> model#set ~row ~column:t_realsize_col (Int64.to_string b); model#set ~row ~column:t_size_col (string_of_byte b); model#set ~row ~column:t_size_lm_col t; model#set ~row ~column:t_size_lm_s_col (time_of_float_parenthesis t) | _ -> assert false end; let tms,ms = Db.get_tag_max_size id in begin match ms with | No_value -> () | Killed -> () | Int64 b -> model#set ~row ~column:t_realmax_size_col (Int64.to_string b); model#set ~row ~column:t_max_size_col (string_of_byte b); model#set ~row ~column:t_max_size_lm_col tms; model#set ~row ~column:t_max_size_lm_s_col (time_of_float_parenthesis tms) | _ -> assert false end; let tps,ps = Db.get_tag_percent_size id in begin match ps with | No_value -> () | Killed -> () | Float f -> model#set ~row ~column:t_percent_col (to_percent (string_of_float f)) | _ -> assert false end in if not(Hashtbl.mem row_tag id) then let l = Db.get_bindings id in if List.mem id l then let id' = List.find (fun id' -> id' <> id) l in if Hashtbl.mem row_tag id' then let row = Hashtbl.find row_tag id' in model#set ~row ~column:t_tag_size_col id; Hashtbl.add row_tag id row; fct row else let row = model#append () in model#set ~row ~column:t_name_col n; model#set ~row ~column:t_tag_size_col id; model#set ~row ~column:t_size_lm_s_col "Never"; model#set ~row ~column:t_max_size_lm_s_col "Never"; fct row; Hashtbl.add row_tag id row else let row = model#append () in model#set ~row ~column:t_name_col n; model#set ~row ~column:t_tag_size_col id; model#set ~row ~column:t_size_lm_s_col "Never"; model#set ~row ~column:t_max_size_lm_s_col "Never"; fct row; Hashtbl.add row_tag id row else let row = Hashtbl.find row_tag id in fct row in List.iter fct_count count_list; List.iter fct_size size_list let fill_value l (model: GTree.list_store) table name_col tag_col val_col val_lm_col val_lm_s_col color_col = let fct_value {id=id; name=n; value=t,v; status = st} = let fct row = let _,st = st in begin match st with |St_collected -> model#set ~row ~column:color_col "#34D433" |St_active -> model#set ~row ~column:color_col "#000000" |_ -> assert false end; if v <> No_value then begin model#set ~row ~column:val_lm_col t; model#set ~row ~column:val_lm_s_col (time_of_float_parenthesis t); end; begin match v with | No_value -> () | Float v -> model#set ~row ~column:val_col (string_of_float v) | Int v -> model#set ~row ~column:val_col (string_of_int v) | Int64 v -> model#set ~row ~column:val_col (Int64.to_string v) | String v -> model#set ~row ~column:val_col v | Bool v -> model#set ~row ~column:val_col (string_of_bool v) | Collected -> let s = model#get ~row ~column:val_col in if String.length s = 0 then model#set ~row ~column:val_col "Collected" | _ -> assert false end in if not(Hashtbl.mem table id) then begin let row = model#append () in model#set ~row ~column:name_col n; model#set ~row ~column:tag_col id; model#set ~row ~column:val_lm_s_col "Never"; fct row; Hashtbl.add table id row end else begin let row = Hashtbl.find table id in fct row; end in List.iter fct_value l (* Fills the GC page *) let init_gc () = gc_model#append () let fill_gc () = let ts,size = Db.get_heap_total_size () in let ta,alive = Db.get_heap_alive_size () in let tm,max = Db.get_heap_max_size () in let opt = gc_model#get_iter_first in match opt with |Some row -> begin match size with | Int64 bsize -> gc_model#set ~row ~column:gc_total (string_of_byte bsize) | _ -> () end; begin match max with | Int64 bmax -> gc_model#set ~row ~column:gc_max (string_of_byte bmax) | _ -> () end; begin match alive with | Int64 balive -> gc_model#set ~row ~column:gc_alive (string_of_byte balive) | _ -> () end |None -> () let iter_lists n content = let (model: GTree.list_store),tag_col,name_col,value_col,value_lm_col,value_lm_s_col,color_col,type_col = content in model#foreach (fun _ row -> let id = model#get ~row ~column:tag_col in let typ = model#get ~row ~column:type_col in let tag = get_tag id in let (t,v),k = match typ with |8 -> Db.get_percent_time id,Protocol.Value_float |3 -> Db.get_tag_max_count id, tag.kind |4 -> Db.get_tag_max_size id, tag.kind |5 -> Db.get_tag_percent_size id, Protocol.Value_float |21 -> Db.get_hash_percent_filled id, Protocol.Value_float |20 -> Db.get_hash_mean id, Protocol.Value_float | _ -> tag.value, tag.kind in if v <> No_value then begin model#set ~row ~column:value_lm_col t; model#set ~row ~column:value_lm_s_col (time_of_float_parenthesis t); end else model#set ~row ~column:value_lm_s_col "Never"; let conv = match v with |Int i -> string_of_int i |Float f -> begin match typ with |8 | 5 | 21 -> to_percent (string_of_float f) |_ -> string_of_float f end |Int64 i -> begin match k with |Protocol.Tag_size -> string_of_byte i |Protocol.Value_int -> Int64.to_string i |Protocol.Special -> string_of_byte i |_ -> assert false end |String s -> s |Bool b -> string_of_bool b |Hashtable (Int v1,Int v2,Int v3,Int v4) -> begin match typ with |16 -> string_of_int v2 |17 -> string_of_int v1 |18 -> string_of_int v4 |19 -> string_of_int v3 |_ -> assert false end |Hashtable (Int64 v1,Int64 v2,Int64 v3,Int64 v4) -> begin match typ with |16 -> Int64.to_string v2 |17 -> Int64.to_string v1 |18 -> Int64.to_string v4 |19 -> Int64.to_string v3 |_ -> assert false end |No_value -> "" |_ -> assert false in begin match tag.status with |_,St_killed -> model#set ~row ~column:color_col "#EA2F24" |_,St_collected -> model#set ~row ~column:color_col "#34D433" |_,St_active -> model#set ~row ~column:color_col "#000000" end; model#set ~row ~column:value_col conv;false) (* Fills the lists of exported values with the most recent values *) let fill_lists () = Hashtbl.iter (fun n content -> iter_lists n content) lists_table let fill_tree tree_list = let fct_tree {id=id ; name=n ; value=t,v} = if not(Hashtbl.mem row_tree id) then begin let row = tree_model#append () in tree_model#set ~row ~column:tree_name_col n; tree_model#set ~row ~column:tree_tag_col id; tree_model#set ~row ~column:tree_lm_s_col "Never"; Hashtbl.add row_tree id row end else begin let row = Hashtbl.find row_tree id in if v <> No_value then tree_model#set ~row ~column:tree_lm_s_col (time_of_float_parenthesis t); end in List.iter fct_tree tree_list; Hashtbl.iter (fun _ (t,t_p) -> List.iter (fun tree -> if tree.id = t.id then let v = (match tree.value with |_,Protocol.Tree t -> t |_ -> assert false) in if t_p.Tree_panel.tree <> v then t_p.Tree_panel.tree <- v; ) tree_list ) trees let fill_hash hash_list = let fct_hash {id=id ; name=n ; value=t,v} = let fct row = let _,mean = Db.get_hash_mean id in let _,percent = Db.get_hash_percent_filled id in begin match mean,percent with |Float m, Float p -> hash_model#set ~row ~column:h_mean_col (string_of_float (m)); hash_model#set ~row ~column:h_percent_col (int_of_float (p)) | _ -> () end; match v with |No_value -> () |Hashtable (Int v1,Int v2,Int v3,Int v4) -> hash_model#set ~row ~column:h_length_col (string_of_int v2); hash_model#set ~row ~column:h_real_length_col (string_of_int v1); hash_model#set ~row ~column:h_length_b_col (string_of_int v4); hash_model#set ~row ~column:h_empty_b_col (string_of_int v3); hash_model#set ~row ~column:h_lm_s_col (time_of_float_parenthesis t); hash_model#set ~row ~column:h_lm_col (string_of_float t) |Hashtable (Int64 v1,Int64 v2,Int64 v3,Int64 v4) -> hash_model#set ~row ~column:h_length_col (Int64.to_string v2); hash_model#set ~row ~column:h_real_length_col (Int64.to_string v1); hash_model#set ~row ~column:h_length_b_col (Int64.to_string v4); hash_model#set ~row ~column:h_empty_b_col (Int64.to_string v3); hash_model#set ~row ~column:h_lm_s_col (time_of_float_parenthesis t); hash_model#set ~row ~column:h_lm_col (string_of_float t) |_ -> assert false in if not(Hashtbl.mem row_hash id) then begin let row = hash_model#append () in hash_model#set ~row ~column:h_name_col n; hash_model#set ~row ~column:h_tag_col id; hash_model#set ~row ~column:h_lm_s_col "Never"; fct row; Hashtbl.add row_hash id row end else begin let row = Hashtbl.find row_hash id in fct row; end in List.iter fct_hash hash_list let fill_log log = let _,v = log in match v with |No_value -> () |Protocol.Log log_list -> log_model#clear (); List.iter (fun (t,elt) -> let row = log_model#append () in log_model#set ~row ~column:l_time_col (time_of_float_parenthesis t); log_model#set ~row ~column:l_log_col elt; log_model#set ~row ~column:l_color_col "blue" ) log_list | _ -> assert false (******************************************************************* MODEL CREATION FUNCTIONS ******************************************************************** ********************************************************************) (* Sorts elements of a column *) let sort_function column typ (model : #GTree.model) it_a it_b = let fct_int it = let a = model#get ~row:it ~column in if (compare a "" = 0) then -1 else int_of_string a in let fct_float it = let a = model#get ~row:it ~column in if ( compare a "" = 0) then -1. else float_of_string a in let fct_percent it = let a = model#get ~row:it ~column in let f = String.sub a 0 ((String.length a) -1) in float_of_string f in match typ with |Stat_count|Tag_count|Tag_max_count|Value_i -> compare (fct_int it_a) (fct_int it_b) |Stat_time|Value_f -> compare (fct_float it_a) (fct_float it_b) |Name|Value_b|Value_s -> compare (model#get ~row:it_a ~column) (model#get ~row:it_b ~column) |Stat_percent_time | Tag_percent_size -> compare (fct_percent it_a) (fct_percent it_b) |Tag_size | Tag_max_size -> compare (fct_float it_a) (fct_float it_b) |_ -> assert false (* Makes the models depending on the notebook page *) let mk_model_aux s ong i col = s#set_sort_func i (sort_function col ong) let mk_model_list (name: string) = let new_cols = new GTree.column_list in let name_col = new_cols#add Gobject.Data.string in let tag_col = new_cols#add Gobject.Data.int in let value_col = new_cols#add Gobject.Data.string in let value_lm_col = new_cols#add Gobject.Data.float in let value_lm_s_col = new_cols#add Gobject.Data.string in let color_col = new_cols#add Gobject.Data.string in let type_col = new_cols#add Gobject.Data.int in let s_m = GTree.list_store new_cols in Hashtbl.add lists_table name (s_m,tag_col,name_col,value_col,value_lm_col,value_lm_s_col,color_col,type_col); (s_m,name_col,value_col,value_lm_s_col,color_col) let mk_model s_m noteb = let s = GTree.model_sort s_m in match noteb with |Stat -> mk_model_aux s Name 0 s_name_col; mk_model_aux s Stat_count 2 s_count_col; mk_model_aux s Stat_time 8 s_time_col; mk_model_aux s Stat_percent_time 13 s_percent_col; s_m,s |Tag -> mk_model_aux s Name 0 t_name_col; mk_model_aux s Tag_count 2 t_count_col; mk_model_aux s Tag_max_count 7 t_max_count_col; mk_model_aux s Tag_size 12 t_realsize_col; mk_model_aux s Tag_max_size 18 t_realmax_size_col; mk_model_aux s Tag_percent_size 23 t_percent_col; s_m,s |Gc -> s_m,s |Value_int -> mk_model_aux s Name 0 v_i_name_col; mk_model_aux s Value_i 2 v_i_value_col; s_m,s |Value_float -> mk_model_aux s Name 0 v_f_name_col; mk_model_aux s Value_f 2 v_f_value_col; s_m,s |Value_bool -> mk_model_aux s Name 0 v_b_name_col; mk_model_aux s Value_b 2 v_b_value_col; s_m,s |Value_string -> mk_model_aux s Name 0 v_s_name_col; mk_model_aux s Value_s 2 v_s_value_col; s_m,s |Exported_graph _ -> s_m,s |Tree -> mk_model_aux s Name 0 tree_name_col; s_m,s |Hash -> mk_model_aux s Name 0 h_name_col; mk_model_aux s Value_i 2 h_length_col; mk_model_aux s Value_i 4 h_real_length_col; mk_model_aux s Value_i 6 h_length_b_col; mk_model_aux s Value_i 8 h_empty_b_col; mk_model_aux s Value_f 10 h_lm_col; mk_model_aux s Value_f 12 h_mean_col; s_m,s |_ -> assert false (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/gui_pref.ml0000644000175000017500000002155611251411607015210 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) let record_scale = ref None let record_window = ref 0. type default_preferences = { mutable steps : int; mutable gridx : int; mutable gridy : int; mutable xaxis : int; mutable yaxis : int; mutable period : int; } let pref_file = "preferences" let default_pref = let st,gx,gy,xa,ya,p,r,l = Preflexer.read_file pref_file in record_window := r; Db.set_record_window r; Db.set_log_size l; {steps=st;gridx=gx;gridy=gy;xaxis=xa;yaxis=ya;period=p} (*************************************************** PREFERENCES **************************************************** ****************************************************) let save_preferences () = let f = open_out pref_file in let fmt = Format.formatter_of_out_channel f in Format.fprintf fmt "steps %d \n" default_pref.steps; Format.fprintf fmt "gridx %d \n" default_pref.gridx; Format.fprintf fmt "gridy %d \n" default_pref.gridy; Format.fprintf fmt "xaxis %d \n" default_pref.xaxis; Format.fprintf fmt "yaxis %d \n" default_pref.yaxis; Format.fprintf fmt "period %d \n" default_pref.period; Format.fprintf fmt "record %f \n" !record_window; Format.fprintf fmt "log %d \n" (Db.get_log_size ()); Format.fprintf fmt "@?"; close_out f let mk_label_and_spin (table : GPack.table) s top digits = let markup = Format.sprintf "%s" s in let _ = GMisc.label ~markup ~packing:(table#attach ~left:0 ~top) () in let spin = GEdit.spin_button ~digits ~update_policy:`IF_VALID ~packing:(table#attach ~left:1 ~top) () in spin let mk_label_and_toggle (table : GPack.table) s top = let markup = Format.sprintf "%s" s in let _ = GMisc.label ~markup ~packing:(table#attach ~left:0 ~top) () in let toggle = GButton.check_button ~packing:(table#attach ~left:1 ~top) () in toggle let mk_time_window_preferences window = let dial = GWindow.dialog ~title:" Time Window Preferences" ~position:`MOUSE ~parent:window () in let table = GPack.table ~rows:2 ~columns:2 ~col_spacings:5 ~row_spacings:10 ~packing:(dial#vbox#pack ~expand:false) () in let spin_time = mk_label_and_spin table "Record time" 0 2 in spin_time#adjustment#set_bounds ~lower:0. ~upper:3600. ~step_incr:1. ~page_incr:10. (); spin_time#set_value !record_window; let check_button = mk_label_and_toggle table "Save as default" 1 in let hb = GPack.hbox ~packing:(dial#vbox#pack ~expand:false) () in let bcancel = GButton.button ~packing:hb#add () in let im_cancel = GMisc.image ~stock:`CANCEL ~icon_size:`MENU () in bcancel#set_image im_cancel#coerce; ignore(bcancel#connect#clicked ~callback:(fun () -> dial#destroy ())); let baccept = GButton.button ~packing:hb#add () in let im_accept = GMisc.image ~stock:`APPLY ~icon_size:`MENU () in baccept#set_image im_accept#coerce; ignore(baccept#connect#clicked ~callback:(fun () -> let nw = spin_time#adjustment#value in record_window := nw; Db.set_record_window nw; begin match !record_scale with |None -> () |Some (scl: GRange.scale) -> scl#adjustment#set_bounds ~lower:(-. !record_window) ~upper:0.0 ~step_incr:0.01 ~page_incr:0.05 () end; if check_button#active then save_preferences (); dial#destroy () )); dial#show () let mk_log_preferences window = let dial = GWindow.dialog ~title:" Log Preferences" ~position:`MOUSE ~parent:window () in let table = GPack.table ~rows:2 ~columns:2 ~col_spacings:5 ~row_spacings:10 ~packing:(dial#vbox#pack ~expand:false) () in let spin_log = mk_label_and_spin table "Log size" 0 0 in spin_log#adjustment#set_bounds ~lower:1. ~upper:1000. ~step_incr:1. ~page_incr:10. (); spin_log#set_value (float (Db.get_log_size ())); let check_button = mk_label_and_toggle table "Save as default" 1 in let hb = GPack.hbox ~packing:(dial#vbox#pack ~expand:false) () in let bcancel = GButton.button ~packing:hb#add () in let im_cancel = GMisc.image ~stock:`CANCEL ~icon_size:`MENU () in bcancel#set_image im_cancel#coerce; ignore(bcancel#connect#clicked ~callback:(fun () -> dial#destroy ())); let baccept = GButton.button ~packing:hb#add () in let im_accept = GMisc.image ~stock:`APPLY ~icon_size:`MENU () in baccept#set_image im_accept#coerce; ignore(baccept#connect#clicked ~callback:(fun () -> let size = spin_log#adjustment#value in Db.set_log_size (int_of_float size); if check_button#active then save_preferences (); dial#destroy () )); dial#show () let mk_pref window title = let dial = GWindow.dialog ~title ~position:`MOUSE ~parent:window () in let table = GPack.table ~rows:6 ~columns:2 ~col_spacings:5 ~row_spacings:10 ~packing:(dial#vbox#pack ~expand:false) () in let spin_time = mk_label_and_spin table "Displayed time" 0 0 in spin_time#adjustment#set_bounds ~lower:5. ~upper:3600. ~step_incr:5. ~page_incr:50. (); let spin_divx = mk_label_and_spin table "X-axis divisions" 1 0 in spin_divx#adjustment#set_bounds ~lower:2. ~upper:30. ~step_incr:1. ~page_incr:1. (); let spin_divy = mk_label_and_spin table "Y-axis divisions" 2 0 in spin_divy#adjustment#set_bounds ~lower:2. ~upper:30. ~step_incr:1. ~page_incr:1. (); let spin_x = mk_label_and_spin table "X-axis legend frequency" 3 0 in spin_x#adjustment#set_bounds ~lower:1. ~upper:30. ~step_incr:1. ~page_incr:5. (); let spin_y = mk_label_and_spin table "Y-axis legend frequency" 4 0 in spin_y#adjustment#set_bounds ~lower:1. ~upper:30. ~step_incr:1. ~page_incr:5. (); let check_button = mk_label_and_toggle table "Save as default" 5 in let hb = GPack.hbox ~packing:(dial#vbox#pack ~expand:false) () in let bcancel = GButton.button ~packing:hb#add () in let im_cancel = GMisc.image ~stock:`CANCEL ~icon_size:`MENU () in bcancel#set_image im_cancel#coerce; ignore(bcancel#connect#clicked ~callback:(fun () -> dial#destroy ())); let baccept = GButton.button ~packing:hb#add () in let im_accept = GMisc.image ~stock:`APPLY ~icon_size:`MENU () in baccept#set_image im_accept#coerce; dial#show (); (spin_time,spin_divx,spin_divy,spin_x,spin_y,baccept,check_button,dial) let mk_graph_preferences_menu window = let st,sdx,sdy,sx,sy,ba,cb,dial = mk_pref window "Graph Preferences" in st#set_value ((float default_pref.steps) *. (float default_pref.period) /. 1000.); sdx#set_value (float default_pref.gridx); sdy#set_value (float default_pref.gridy); ignore(ba#connect#clicked ~callback:(fun () -> default_pref.steps <- (int_of_float (st#value) * 1000 / default_pref.period); default_pref.gridx <- int_of_float (sdx#value); default_pref.gridy <- int_of_float (sdy#value); default_pref.xaxis <- int_of_float (sx#value); default_pref.yaxis <- int_of_float (sy#value); if cb#active then save_preferences (); dial#destroy ())) let mk_preferences_graph window gr name = let st,sdx,sdy,sx,sy,ba,cb,dial = mk_pref window (Format.sprintf "%s Preferences" name) in st#set_value (float (Graph.get_steps gr) *. float (Graph.get_period gr) /. 1000.); sdx#set_value (float (Graph.get_gridx gr)); sdy#set_value (float (Graph.get_gridy gr)); sx#set_value (float (Graph.get_xaxis gr)); sy#set_value (float (Graph.get_yaxis gr)); ignore(ba#connect#clicked ~callback:(fun () -> Graph.set_preferences gr ~step:(int_of_float (st#value) * 1000 / (Graph.get_period gr)) ~divx:(int_of_float (sdx#value)) ~divy:(int_of_float (sdy#value)) ~xaxis:(int_of_float (sx#value)) ~yaxis:(int_of_float (sy#value)) ; if cb#active then begin default_pref.steps <- (int_of_float (st#value) * 1000 / default_pref.period); default_pref.gridx <- int_of_float (sdx#value); default_pref.gridy <- int_of_float (sdy#value); default_pref.xaxis <- int_of_float (sx#value); default_pref.yaxis <- int_of_float (sy#value); save_preferences (); end; dial#destroy ())) (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/gui_views.ml0000644000175000017500000002274711251411607015414 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Protocol open Db open Gui_misc open Gui_models (******************************************************************* VIEW CREATION FUNCTIONS ******************************************************************** ********************************************************************) let item_toggled (model : GTree.list_store) (model': GTree.model_sort) ~column path = let row = model'#get_iter path in let row = model'#convert_iter_to_child_iter row in let b = model#get ~row ~column in model#set ~row ~column (not b); () let item_toggled_radio (model : GTree.list_store) (model': GTree.model_sort) ~column path = let row = model'#get_iter path in let row = model'#convert_iter_to_child_iter row in let b = model#get ~row ~column in model#foreach (fun _ r -> model#set ~row:r ~column false; false ); model#set ~row ~column (not b) (* Makes the view from the model s in the hbox hb with its scrollbar sb *) let mk_view_aux i v name ?color s = let view = GTree.view_column ~title:name () in let renderer = GTree.cell_renderer_text [ `XALIGN 0.] in view#set_resizable true; view#pack renderer ; view#add_attribute renderer "text" s ; view#set_sort_column_id i ; view#set_min_width 10; v#append_column view; begin match color with |Some c -> view#add_attribute renderer "foreground" c |None -> () end; view let mk_view_aux_progress i v name ?color s = let view = GTree.view_column ~title:name () in let renderer = GTree.cell_renderer_progress [ `XALIGN 0.] in view#set_resizable true; view#pack renderer ; view#add_attribute renderer "value" s ; view#set_sort_column_id i ; v#append_column view; begin match color with |Some c -> view#add_attribute renderer "foreground" c |None -> () end; view let mk_view_aux_with_toggle i v name ?color model model' s s'= let view = mk_view_aux i v name ?color s in let renderer'= GTree.cell_renderer_toggle [ `XALIGN 0.] in ignore(renderer'#connect#toggled ~callback:(item_toggled model model' ~column:s')); view#pack renderer'; view#add_attribute renderer' "active" s' let mk_view_aux_progress_with_toggle i v name ?color model model' s s'= let view = mk_view_aux_progress i v name ?color s in let renderer'= GTree.cell_renderer_toggle [ `XALIGN 0.] in ignore(renderer'#connect#toggled ~callback:(item_toggled model model' ~column:s')); view#pack renderer'; view#add_attribute renderer' "active" s' let mk_view_aux_with_toggle_and_time i v name ?color model model' s s' s''= let view = mk_view_aux i v name ?color s in let renderer'= GTree.cell_renderer_toggle [ `XALIGN 0.] in ignore(renderer'#connect#toggled ~callback:(item_toggled model model' ~column:s')); let renderer''= GTree.cell_renderer_text [ `XALIGN 0.] in view#pack renderer''; view#pack renderer'; view#add_attribute renderer'' "text" s'' ; view#add_attribute renderer' "active" s'; begin match color with |Some c -> view#add_attribute renderer'' "foreground" c |None -> () end let mk_view_aux_with_radio_and_time i v name ?color model model' s s' s''= let view = mk_view_aux i v name ?color s in let renderer'= GTree.cell_renderer_toggle [ `RADIO true ; `XALIGN 0.] in ignore(renderer'#connect#toggled ~callback:(item_toggled_radio model model' ~column:s')); let renderer''= GTree.cell_renderer_text [ `XALIGN 0.] in view#pack renderer''; view#pack renderer'; view#add_attribute renderer'' "text" s'' ; view#add_attribute renderer' "active" s'; begin match color with |Some c -> view#add_attribute renderer'' "foreground" c |None -> () end let mk_view_tree (model:#GTree.model) (model': GTree.model_sort) (box:GPack.box) = let sw = GBin.scrolled_window ~shadow_type:`ETCHED_IN ~hpolicy:`AUTOMATIC ~vpolicy:`AUTOMATIC ~packing:box#add () in let view = GTree.view ~model ~packing:sw#add () in view#set_rules_hint true; ignore(mk_view_aux_with_radio_and_time 0 view "Name" model model' tree_name_col tree_radio_col tree_lm_s_col) let mk_view_list (model:#GTree.model) col1 col2 col3 col4 (box:GPack.box) = let v = let sw = GBin.scrolled_window ~shadow_type:`ETCHED_IN ~hpolicy:`AUTOMATIC ~vpolicy:`AUTOMATIC ~packing:box#add () in GTree.view ~model ~packing:sw#add () in v#set_rules_hint true; ignore(mk_view_aux 0 v "Name" col1); ignore(mk_view_aux 1 v "Value" ~color:col4 col2); ignore(mk_view_aux 2 v "Last Modified" ~color:col4 col3) let mk_view (model:#GTree.model) (model': GTree.model_sort) (box:GPack.box) noteb = let v = match noteb with |Gc -> GTree.view ~model:model' ~packing:(box#pack ~expand:false) () |_ -> let sw = GBin.scrolled_window ~shadow_type:`ETCHED_IN ~hpolicy:`AUTOMATIC ~vpolicy:`AUTOMATIC ~packing:box#add () in GTree.view ~model:model' ~packing:sw#add () in v#set_rules_hint true; match noteb with |Stat -> ignore(mk_view_aux 0 v "Name" s_name_col); mk_view_aux_with_toggle_and_time 1 v "Count" ~color:s_count_color_col model model' s_count_col s_check_count_col s_count_lm_s_col; mk_view_aux_with_toggle_and_time 2 v "Time" ~color:s_time_color_col model model' s_time_col s_check_time_col s_time_lm_s_col; mk_view_aux_with_toggle 3 v "Overall Time" ~color:s_time_color_col model model' s_percent_col s_check_percent_col |Tag -> ignore(mk_view_aux 0 v "Name" t_name_col); mk_view_aux_with_toggle_and_time 1 v "Count" ~color:t_count_color_col model model' t_count_col t_check_count_col t_count_lm_s_col; mk_view_aux_with_toggle_and_time 2 v "Max Count" ~color:t_count_color_col model model' t_max_count_col t_check_max_count_col t_max_count_lm_s_col; mk_view_aux_with_toggle_and_time 3 v "Size" ~color:t_size_color_col model model' t_size_col t_check_size_col t_size_lm_s_col; mk_view_aux_with_toggle_and_time 4 v "Max Size" ~color:t_size_color_col model model' t_max_size_col t_check_max_size_col t_max_size_lm_s_col; mk_view_aux_with_toggle 5 v "Overall Size" ~color:t_size_color_col model model' t_percent_col t_check_percent_col |Gc -> mk_view_aux_with_toggle 0 v "Total Size" model model' gc_total gc_check_total; mk_view_aux_with_toggle 1 v "Max Size" model model' gc_max gc_check_max; mk_view_aux_with_toggle 2 v "Living Bytes" model model' gc_alive gc_check_alive; |Value_int -> ignore(mk_view_aux 0 v "Name" v_i_name_col); mk_view_aux_with_toggle_and_time 1 v "Value" ~color:v_i_color_col model model' v_i_value_col v_i_check_value_col v_i_value_lm_s_col |Value_float -> ignore(mk_view_aux 0 v "Name" v_f_name_col); mk_view_aux_with_toggle_and_time 1 v "Value" ~color:v_f_color_col model model' v_f_value_col v_f_check_value_col v_f_value_lm_s_col |Value_bool -> ignore(mk_view_aux 0 v "Name" v_b_name_col); mk_view_aux_with_toggle_and_time 1 v "Value" ~color:v_b_color_col model model' v_b_value_col v_b_check_value_col v_b_value_lm_s_col |Value_string -> ignore(mk_view_aux 0 v "Name" v_s_name_col); mk_view_aux_with_toggle_and_time 1 v "Value" ~color:v_s_color_col model model' v_s_value_col v_s_check_value_col v_s_value_lm_s_col |Exported_graph _ -> () |Hash -> ignore(mk_view_aux 0 v "Name" h_name_col); mk_view_aux_with_toggle 1 v "# Elements" model model' h_length_col h_length_check_col; mk_view_aux_with_toggle 2 v "# Empty Buckets" model model' h_empty_b_col h_empty_b_check_col; mk_view_aux_with_toggle 3 v "Array Size" model model' h_real_length_col h_real_length_check_col; mk_view_aux_progress_with_toggle 4 v "Filling Rate" model model' h_percent_col h_percent_check_col; mk_view_aux_with_toggle 5 v "Longest Bucket" model model' h_length_b_col h_length_b_check_col; mk_view_aux_with_toggle 6 v "Mean Bucket Length" model model' h_mean_col h_mean_check_col; ignore(mk_view_aux 7 v "Last Modified" h_lm_s_col) |_ -> assert false let mk_view_value (box : GPack.box) value model s = let exp = GBin.expander ~expanded:true ~label:s ~packing:(box#pack ~expand:true) () in let hb = GPack.hbox ~packing:exp#add () in let m,m' = mk_model model value in mk_view m m' hb value let mk_view_log (model:#GTree.model) (box:GPack.box) = let sw = GBin.scrolled_window ~shadow_type:`ETCHED_IN ~hpolicy:`AUTOMATIC ~vpolicy:`AUTOMATIC ~packing:box#add () in let v = GTree.view ~model ~packing:sw#add () in ignore(mk_view_aux 0 v ~color:l_color_col "Time" l_time_col); ignore(mk_view_aux 1 v "Log" l_log_col) (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/monitor_impl.ml0000644000175000017500000005277711251725215016134 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Format open Gc open Unix open Protocol (* datas *) let buffer_size = 1024 let old_decl = ref [] let new_decl = ref [] let bind_decl = ref [] let old_bind_decl = ref [] let killed_decl = ref [] let nb_client = ref 0 let new_tag = let nb_tag = ref 4 in fun () -> incr nb_tag; !nb_tag let create_tag kind name = let t = new_tag () in new_decl := Declare (t,kind,name) :: !new_decl; t let word_size_coeff = if Sys.word_size = 32 then Int64.of_int 4 else Int64.of_int 8 (* GC *) let period = try float_of_string (Sys.getenv "OCAMLVIZ_PERIOD") with Not_found -> 0.1 let gc_period = try float_of_string (Sys.getenv "OCAMLVIZ_HEAP_PERIOD") with Not_found -> 1.0 let gc_freq = let f = gc_period /. period in int_of_float f let heap_total_size = ref 0 let heap_alive_size = ref 0 let gc_cpt = ref 0 let tag_heap_total_size = (new_decl := Declare (0,Special,"heap_total_size") :: !new_decl); 0 let tag_heap_alive_size = (new_decl := Declare (1,Special,"heap_alive_size") :: !new_decl); 1 let heap_stats () = let gc_stats = if !gc_cpt = 0 then Gc.stat () else Gc.quick_stat () in let total_size = gc_stats.heap_words in let alive_size = if !gc_cpt = 0 then gc_stats.live_words else !heap_alive_size in gc_cpt := (!gc_cpt + 1) mod gc_freq; if (total_size <> !heap_total_size) || (alive_size <> !heap_alive_size) then begin heap_total_size := total_size; heap_alive_size := alive_size; true end else false (* Log *) let log_size = 200 let log_list = ref [] let log_hist = Array.make log_size (0.,"") let log_index = ref 0 let log_hist_index = ref 0 let log_tag = (new_decl := Declare (3,Klog,"log") :: !new_decl); 3 let log f = let buf = Buffer.create 512 in let fmt = Format.formatter_of_buffer buf in Format.kfprintf (fun _ -> Format.pp_print_flush fmt (); let s = Buffer.contents buf in Buffer.clear buf; let t = (times()).tms_utime in if !log_index < log_size then begin log_list := (t,s) :: !log_list; incr log_index; end; if !log_hist_index < log_size then begin log_hist.(!log_hist_index) <- (t,s); incr log_hist_index; end else begin log_hist.(0) <- (t,s); log_hist_index := 1; end; ) fmt f let list_of_log_hist () = let temp = ref [] in for i = !log_hist_index to log_size -1 do let t,s = log_hist.(i) in if s <> "" then temp := (t,s):: !temp; done; for i = 0 to !log_hist_index - 1 do let t,s = log_hist.(i) in temp := (t,s):: !temp; done; !temp (* Observes *) module Point = struct type t = {tag:tag; name:string; mutable count:int} let occur_table = Hashtbl.create 17 let killed_list = ref [] let create name = let tag = create_tag Point name in let t = {tag = tag; name = name; count = 0} in Hashtbl.add occur_table t.tag t; t let kill t = Hashtbl.remove occur_table t.tag; killed_list := (Send(t.tag,Int t.count)) ::(Send (t.tag,Killed)) :: !killed_list; killed_decl := (Send(t.tag,Int t.count))::(Send (t.tag,Killed)) :: !killed_decl let observe point = point.count<-point.count+1 let observe_calls name fct = let tag = create_tag Point name in let t = {tag = tag ; name = name; count = 0} in Hashtbl.replace occur_table t.tag t; fun x -> t.count<-t.count+1; fct x let observe_calls2 name fct = let tag = create_tag Point name in let t = {tag = tag ; name = name; count = 0} in Hashtbl.replace occur_table t.tag t; fun x y -> t.count<-t.count+1; fct x y let observe_calls_rec name fct = let tag = create_tag Point name in let t = {tag = tag ; name = name; count = 0} in Hashtbl.replace occur_table t.tag t; let rec f x = t.count<-t.count+1; fct f x in f let observe_calls_rec2 name fct = let tag = create_tag Point name in let t = {tag = tag ; name = name; count = 0} in Hashtbl.replace occur_table t.tag t; let rec f x y = t.count<-t.count+1; fct f x y in f let msg_of_occur_table () = let l = !killed_list in killed_list := []; Hashtbl.fold (fun tag t l -> Send (tag,Int(t.count))::l ) occur_table l let send buf = Bproto.encode buf (msg_of_occur_table ()) end (*************) (* tags *) module Tag = struct module WeakHash = Weak.Make (struct type t = Obj.t let hash = Hashtbl.hash let equal = (==) end) type t = { tag_count:tag; tag_size:tag; name : string; count : bool; size : bool; mutable period: int; mutable ticks : int; mutable data : WeakHash.t; mutable idx : int; mutable fct_size : WeakHash.t -> Int64.t } let all_tags = ref [] let killed_list = ref [] module H = Hashtbl.Make( struct type t = Obj.t let equal = (==) let hash = Hashtbl.hash end) let size_table = H.create 5003 let size_of_double = Int64.of_int (Obj.size (Obj.repr 1.0)) let size_of_word = Int64.of_int (Sys.word_size / 8) let (++) = Int64.add let count_size data = let count = ref 0L in (* words *) let rec traverse t = if not (H.mem size_table t) then begin H.add size_table t (); if Obj.is_block t then begin let n = Obj.size t in let tag = Obj.tag t in if tag < Obj.no_scan_tag then begin count := !count ++ 1L ++ Int64.of_int n; for i = 0 to n - 1 do let f = Obj.field t i in if Obj.is_block f then traverse f done end else if tag = Obj.string_tag then count := !count ++ 1L ++ Int64.of_int n else if tag = Obj.double_tag then count := !count ++ size_of_double else if tag = Obj.double_array_tag then count := !count ++ 1L ++ Int64.mul size_of_double (Int64.of_int n) else count := Int64.succ !count end end in WeakHash.iter traverse data; H.clear size_table; Int64.mul !count size_of_word let create ?(size=false) ?(count=true) ?(fct_size:(WeakHash.t -> Int64.t)=count_size) ?(period=100) name = let t = { tag_count = new_tag (); tag_size = new_tag (); name = name; count = count; size = size; period = period; ticks = 0; data = WeakHash.create 17; idx = 0; fct_size = fct_size; } in all_tags := t :: !all_tags; begin match size,count with |true,false -> new_decl := Declare (t.tag_size,Tag_size,name)::!new_decl; |true,true -> new_decl := Declare (t.tag_size,Tag_size,name)::!new_decl; new_decl := Declare (t.tag_count,Tag_count,name)::!new_decl; bind_decl := Bind [t.tag_size;t.tag_count]::!bind_decl |false,true -> new_decl := Declare (t.tag_count,Tag_count,name)::!new_decl; |false,false -> () end; (* if size then *) (* new_decl := Declare (t.tag_size,Tag_size,name)::!new_decl; *) (* if count then *) (* new_decl := Declare (t.tag_count,Tag_count,name)::!new_decl; *) t let mark t x = WeakHash.add t.data (Obj.repr x); x let kill t = let all = (List.filter (fun t' -> t'!=t) !all_tags) in all_tags := all; if t.count then begin let count = WeakHash.count t.data in killed_list := (Send (t.tag_count,Int count))::(Send (t.tag_count,Killed)) :: !killed_list; killed_decl := (Send (t.tag_count,Int count))::(Send (t.tag_count,Killed)) :: !killed_decl; end; if t.size then begin let size = t.fct_size t.data in killed_list := (Send (t.tag_size,Int64 size))::(Send (t.tag_size,Killed)) :: !killed_list; killed_decl := (Send (t.tag_size,Int64 size))::(Send (t.tag_size,Killed)) :: !killed_decl end let set_period t i = t.period <- i; t.ticks <- 0 let string_of_one buf t = if (t.ticks = 0) then begin let _ = if t.count then let count = WeakHash.count t.data in Bproto.encode_one buf (Send (t.tag_count,Int (count))) in if t.size then let size = t.fct_size t.data in Bproto.encode_one buf (Send (t.tag_size,Int64 size)) end; t.ticks <- (t.ticks + 100) mod t.period let send buf = List.iter (string_of_one buf) !all_tags; Bproto.encode buf !killed_list; killed_list := [] end (****** Value ******) module Value = struct type 'a t = {tag:tag; name:string; data:'a; mutable period:int; mutable ticks:int} let int_table = (Hashtbl.create 17) let int_ref_table = (Hashtbl.create 17) let int_weak_table = (Hashtbl.create 17) let float_table = (Hashtbl.create 17) let float_ref_table = (Hashtbl.create 17) let float_weak_table = (Hashtbl.create 17) let string_table = (Hashtbl.create 17) let string_ref_table = (Hashtbl.create 17) let string_weak_table = (Hashtbl.create 17) let bool_table = (Hashtbl.create 17) let bool_ref_table = (Hashtbl.create 17) let bool_weak_table = (Hashtbl.create 17) let observe_ref period tag name r tbl = let t = {tag = tag; name = name; data = Weak.create 1; period = period; ticks = 0} in Weak.set t.data 0 (Some (r)); Hashtbl.add tbl t.tag t let observe period tag name fct tbl = let t = {tag = tag; name = name; data = fct; period = period; ticks = 0} in Hashtbl.add tbl t.tag t let observe_weak period tag name fct tbl = let t = {tag = tag; name = name; data = Weak.create 1; period = period; ticks = 0} in Weak.set t.data 0 (Some (fct)); Hashtbl.add tbl t.tag t let observe_int_fct ?(weak=false) ?(period=100) name fct = let tag = create_tag Value_int name in if weak then observe_weak period tag name fct int_weak_table else observe period tag name fct int_table let observe_int ?(weak=false) ?(period=100) name i = observe_int_fct ~weak ~period name (fun () -> i) let observe_float_fct ?(weak=false) ?(period=100) name fct = let tag = create_tag Value_float name in if weak then observe_weak period tag name fct float_weak_table else observe period tag name fct float_table let observe_float ?(weak=false) ?(period=100) name f = observe_float_fct ~weak ~period name (fun () -> f) let observe_string_fct ?(weak=false) ?(period=100) name fct = let tag = create_tag Value_string name in if weak then observe_weak period tag name fct string_weak_table else observe period tag name fct string_table let observe_string ?(weak=false) ?(period=100) name s = observe_string_fct ~weak ~period name (fun () -> s) let observe_bool_fct ?(weak=false) ?(period=100) name fct = let tag = create_tag Value_bool name in if weak then observe_weak period tag name fct bool_weak_table else observe period tag name fct bool_table let observe_bool ?(weak=false) ?(period=100) name b = observe_bool_fct ~weak ~period name (fun () -> b) let observe_int_ref ?(period=100) name (r:int ref) = let tag = create_tag Value_int name in observe_ref period tag name r int_ref_table; r let observe_float_ref ?(period=100) name (r:float ref) = let tag = create_tag Value_float name in observe_ref period tag name r float_ref_table; r let observe_string_ref ?(period=100) name (r:string ref) = let tag = create_tag Value_string name in observe_ref period tag name r string_ref_table; r let observe_bool_ref ?(period=100) name (r:bool ref) = let tag = create_tag Value_bool name in observe_ref period tag name r bool_ref_table; r let msg_of_values ()= let msg_of_value_ref tbl typ l = Hashtbl.fold (fun tag t l -> if (t.ticks = 0) then begin t.ticks <- (t.ticks + 100) mod t.period; match (Weak.get t.data 0) with |None -> Hashtbl.remove tbl tag; killed_decl := (Send (tag, Collected))::!killed_decl; Send (tag, Collected)::l |Some r -> Send (tag,typ (!r))::l end else begin t.ticks <- (t.ticks + 100) mod t.period; l end ) tbl l in let msg_of_value_weak tbl typ l = Hashtbl.fold (fun tag t l -> if (t.ticks = 0) then begin t.ticks <- (t.ticks + 100) mod t.period; match (Weak.get t.data 0) with |None -> Hashtbl.remove tbl tag; killed_decl := (Send (tag, Collected))::!killed_decl; Send (tag, Collected)::l |Some f -> let v = typ (f ()) in Send (tag,v) :: l (* if v <> t.old_value then begin t.old_value <- v; Send (tag,v) :: l end else l *) end else begin t.ticks <- (t.ticks + 100) mod t.period; l end ) tbl l in let msg_of_value tbl typ f l = Hashtbl.fold (fun tag t l -> if (t.ticks = 0) then begin t.ticks <- (t.ticks + 100) mod t.period; Send (tag,typ (t.data ()))::l end else begin t.ticks <- (t.ticks + 100) mod t.period; l end ) tbl l in let l = msg_of_value int_table (fun x -> Int x) string_of_int [] in let l = msg_of_value float_table (fun x -> Float x) string_of_float l in let l = msg_of_value string_table (fun x -> String x) (fun x -> x) l in let l = msg_of_value bool_table (fun x -> Bool x) string_of_bool l in let l = msg_of_value_ref int_ref_table (fun x -> Int x) l in let l = msg_of_value_ref float_ref_table (fun x -> Float x) l in let l = msg_of_value_ref string_ref_table (fun x -> String x) l in let l = msg_of_value_ref bool_ref_table (fun x -> Bool x) l in let l = msg_of_value_weak int_weak_table (fun x -> Int x) l in let l = msg_of_value_weak float_weak_table (fun x -> Float x) l in let l = msg_of_value_weak string_weak_table (fun x -> String x) l in msg_of_value_weak bool_weak_table (fun x -> Bool x) l let send buf = Bproto.encode buf (msg_of_values ()) end (****** Times ******) module Time = struct type t = {tag:tag; name:string; mutable time:float; mutable started:bool} let start_table = Hashtbl.create 17 let time_table = Hashtbl.create 17 let killed_list = ref [] let init_time = (times()).tms_utime (* Unix.gettimeofday () *) let etime = (new_decl := Declare (2,Special,"etime") :: !new_decl); let tag = 2 in {tag = tag; name = "etime"; time = init_time; started = true} exception Already_started exception Not_started let elapsed_time () = (times()).tms_utime (*Unix.gettimeofday ()*) -. init_time let create name = let tag = create_tag Time name in let t = {tag = tag; name = name; time = 0.; started = false} in Hashtbl.add start_table t.tag t; t let kill t = Hashtbl.remove start_table t.tag; Hashtbl.remove time_table t.tag; killed_list := (Send(t.tag,Float t.time)):: (Send (t.tag,Killed)) :: !killed_list; killed_decl := (Send(t.tag,Float t.time)):: (Send (t.tag,Killed)) :: !killed_decl let start t = let u = (times()).tms_utime in if t.started then raise Already_started; if Hashtbl.mem time_table t.tag then begin Hashtbl.remove time_table t.tag; t.time <- u -. t.time ; Hashtbl.add start_table t.tag t; end else begin t.time <- t.time +. u; (*Unix.gettimeofday ()*) end; t.started <- true let stop t = let u = (times()).tms_utime (*Unix.gettimeofday ()*) in try Hashtbl.remove start_table t.tag; t.time <- u -. t.time; t.started <- false; Hashtbl.add time_table t.tag t; with Not_found -> raise Not_started let time name fct x = let tag = create_tag Time name in let t = {tag = tag; name = name; time = (times()).tms_utime (*Unix.gettimeofday ()*); started = true;} in Hashtbl.add start_table t.tag t; let y = fct x in t.time <- (times()).tms_utime (*Unix.gettimeofday ()*) -. t.time; t.started <- false; Hashtbl.replace time_table t.tag t; Hashtbl.remove start_table t.tag; y let msg_of_time_tables ()= let u = (times()).tms_utime (* Unix.gettimeofday () *) in let l = !killed_list in let l = Hashtbl.fold (fun tag t l -> Send (tag,Float (u -. t.time))::l ) start_table l in Hashtbl.fold (fun tag t l -> Send (tag,Float (t.time))::l ) time_table l let send buf = Bproto.encode_one buf (Send(etime.tag,Float (elapsed_time()))); Bproto.encode buf (msg_of_time_tables ()) end module Tree = struct type t = {tag:tag; name:string; mutable period:int; mutable ticks:int; mutable var:(unit -> Protocol.variant)} let tree_table = Hashtbl.create 17 let observe ?(period=100) name fct = let tag = create_tag Ktree name in let t = {tag = tag; name = name; period = period; ticks = 0; var = fct} in Hashtbl.add tree_table t.tag t let msg_of_tree_table () = Hashtbl.fold (fun tag t l -> if t.ticks = 0 then begin t.ticks <- (t.ticks + 100) mod t.period; Send (tag,Tree (t.var ()))::l end else begin t.ticks <- (t.ticks + 100) mod t.period; l end ) tree_table [] let send buf = Bproto.encode buf (msg_of_tree_table ()) end module Hashtable = struct type 'a t = {tag:tag; name:string; mutable period:int; mutable ticks:int; mutable data:'a} let hash_table = Hashtbl.create 17 let observe ?(period=100) name h = let tag = create_tag Hash name in let t = {tag = tag; name = name; period = period; ticks = 0; data = Weak.create 1} in Weak.set t.data 0 (Some (h)); Hashtbl.add hash_table t.tag ( Obj.repr t); h exception Invalid_hashtbl let bucket_length b = let rec fct acc b = if Obj.is_block b then begin if Obj.size b <> 3 then raise Invalid_hashtbl; fct (acc + 1) (Obj.field b 2) end else acc in fct 0 b let stats h = if Obj.is_block h then begin if Obj.size h <> 2 then raise Invalid_hashtbl; let a = Obj.field h 1 in let len = Obj.size a in let empty_buckets = ref 0 in let nb_elements = ref 0 in let max_length_bucket = ref 0 in for i=0 to len-1 do let ei = bucket_length (Obj.field a i) in nb_elements := !nb_elements + ei; if ei = 0 then incr empty_buckets; if ei > !max_length_bucket then max_length_bucket := ei; done; len,!nb_elements,!empty_buckets,!max_length_bucket end else raise Invalid_hashtbl let msg_of_hash_table () = Hashtbl.fold (fun tag t l -> let t = Obj.magic t in if t.ticks = 0 then begin t.ticks <- (t.ticks + 100) mod t.period; match (Weak.get t.data 0) with |None -> Hashtbl.remove hash_table tag; killed_decl := (Send (tag, Collected))::!killed_decl; Send (tag, Collected)::l |Some h -> let len,nb_elt,empty_b,max_len_b = stats h in Send (tag,Hashtable (Int len,Int nb_elt,Int empty_b,Int max_len_b))::l end else begin t.ticks <- (t.ticks + 100) mod t.period; l end ) hash_table [] let send buf = Bproto.encode buf (msg_of_hash_table ()) end let to_send () = let buf = Buffer.create buffer_size in Bproto.encode buf !new_decl; Bproto.encode buf !bind_decl; old_decl := !new_decl @ !old_decl; old_bind_decl := !bind_decl @ !old_bind_decl; new_decl := []; bind_decl := []; Point.send buf; Time.send buf; Value.send buf; Tag.send buf; Tree.send buf; Hashtable.send buf; if (heap_stats ()) then begin let total_size = Int64.mul (Int64.of_int !heap_total_size) word_size_coeff in let alive_size = Int64.mul (Int64.of_int !heap_alive_size) word_size_coeff in Bproto.encode_one buf (Send (tag_heap_total_size,Int64 (total_size))); Bproto.encode_one buf (Send (tag_heap_alive_size,Int64 (alive_size))); end; if !log_index > 0 then begin Bproto.encode_one buf (Send (log_tag, Log (!log_list))); log_index := 0; log_list := []; end; Buffer.contents buf let declare_tags () = let buf = Buffer.create 1024 in Bproto.encode buf !old_decl; Bproto.encode buf !old_bind_decl; Bproto.encode buf !killed_decl; Bproto.encode_one buf (Send (log_tag, (Log (list_of_log_hist ())))); Buffer.contents buf let wait_for_killed_clients () = while !nb_client > 0 do Unix.sleep 1; ignore [Random.int 10] done let wait_for_connected_clients n = while !nb_client < n do Unix.sleep 1 done let set_nb_clients nb = nb_client := nb (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/monitor_sig.mli0000644000175000017500000002232011251411607016100 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) (** Common signature for [Ocamlviz] and [Ocamlviz_threads] *) module type Monitor = sig (* Observers *) (* Program points *) module Point : sig type t (** The abstract type for a point. *) val create : string -> t (** [create s] creates a point called [s]. *) val kill : t -> unit (** [kill p] kills a point [p]. This means that this point won't be monitored anymore. *) val observe : t -> unit (** [observe p] puts a checkpoint [p] at the place where it is used. *) (** High-levels observators *) val observe_calls : string -> ('a -> 'b -> 'c) -> ('a -> 'b -> 'c) (** [observe_calls s f] create a point called [s] inside the function [f] that has one argument and isn't recursive. *) val observe_calls2 : string -> ('a -> 'b -> 'c) -> ('a -> 'b -> 'c) (** [observe_calls2 s f] create a point called [s] inside the function [f] that has two arguments and isn't recursive. *) val observe_calls_rec : string -> (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b (** [observe_calls_rec s f] create a point called [s] inside the function [f] that has one argument and is recursive. *) val observe_calls_rec2 : string -> (('a -> 'b -> 'c) -> 'a -> 'b -> 'c) -> 'a -> 'b -> 'c (** [observe_calls_rec2 s f] create a point called [s] inside the function [f] that has two arguments and is recursive. *) end (** A module that allows to create checkpoints and watch how many times the program go through these points. *) (* Tags *) module Tag : sig (**/**) module WeakHash :sig type t type data val create : int -> t val clear : t -> unit val merge : t -> data -> data val add : t -> data -> unit val remove : t -> data -> unit val find : t -> data -> data val find_all : t -> data -> data list val mem : t -> data -> bool val iter : (data -> unit) -> t -> unit val fold : (data -> 'a -> 'a) -> t -> 'a -> 'a val count : t -> int val stats : t -> int * int * int * int * int * int end (**/**) type t (** The abstract type for a tag. *) val create : ?size:bool -> ?count:bool -> ?fct_size:(WeakHash.t -> Int64.t) -> ?period:int -> string -> t (** [create s] creates a tag called [s]. @param size Chooses whether the tag will handle the size of its values @param count Chooses whether the tag will handle the number of its values @param fct_size Puts your own function to calculate the size @param period Sets the period to which the size and/or the count will be calculated (in milliseconds). Default is 100ms. *) val kill : t -> unit (** [kill t] kills a tag [t]. This means that this tag won't be monitored anymore. This may improve considerably the program's speed. *) val set_period : t -> int -> unit (** [set_period t p] changes the period to which the operations on the tag [t] are made. @param t Tag @param p Period (in milliseconds) *) val mark : t -> 'a -> 'a (** [mark t v] marks any value [v] of type 'a with the tag [t]. One tag can mark many values. One value can be marked by many tags. A tag may contain any value of any type. *) end (** A module that allows to create tags and mark values. It calculates tags' cardinal and size in memory. *) (* Times *) module Time : sig type t val elapsed_time : unit -> float (** Time passed since the initialization (in seconds). *) val create : string -> t (** [create s] creates a time called [s]. *) val kill : t -> unit (** [kill t] kills a time [t]. This means that this time won't be monitored anymore. *) val start : t -> unit (** [start t] starts the time monitoring [t] at the place where it is used. @raise Already_started if [t] is already running. *) val stop : t -> unit (** [stop t] sets the end of the time monitoring [t] at the place where it is used. @raise Not_started if no [start t] was previously called. *) val time : string -> ('a -> 'b) -> 'a -> 'b (** [time s f arg] monitors the time spent in the function [f]. @param f Function @param arg Function argument @param s Time monitor's name *) end (** A module that allows time monitoring. *) (* Values *) module Value : sig val observe_int_fct : ?weak:bool -> ?period:int -> string -> (unit -> int) -> unit (** [observe_int n f] monitors an integer given by the function [f]. @param n [Value] name @param weak Chooses whether the integer is attached to a weak pointer or a normal pointer. @param period Sets the period to which the value will be calculated (in milliseconds). Default is 100ms. *) val observe_int : ?weak:bool -> ?period:int -> string -> int -> unit (** [observe_int_now n i] monitors an integer [i].*) val observe_float_fct : ?weak:bool -> ?period:int -> string -> (unit -> float) -> unit (** [observe_float n f] monitors a floating-point number given by the function [f]. *) val observe_float : ?weak:bool -> ?period:int -> string -> float -> unit (** [observe_float_now n f] monitors a floating-point number [f]. *) val observe_bool_fct : ?weak:bool -> ?period:int -> string -> (unit -> bool) -> unit (** [observe_bool n f] monitors a boolean given by the function [f]. *) val observe_bool : ?weak:bool -> ?period:int -> string -> bool -> unit (** [observe_bool_now n b] monitors a boolean [b]. *) val observe_string_fct : ?weak:bool -> ?period:int -> string -> (unit -> string ) -> unit (** [observe_string n f] monitors a string given by the function [f]. *) val observe_string : ?weak:bool -> ?period:int -> string -> string -> unit (** [observe_string_now n s] monitors a string [s]. *) (* module Make(X : sig type t val to_string : t -> string) : sig *) (* val observe : string -> (X.t -> unit) -> unit *) (* end *) val observe_int_ref : ?period:int -> string -> int ref -> int ref (** [observe_int_ref n i] monitors an integer reference [i]. *) val observe_float_ref : ?period:int -> string -> float ref -> float ref (** [observe_float_ref n f] monitors a floating-point number reference [f]. *) val observe_bool_ref : ?period:int -> string -> bool ref -> bool ref (** [observe_bool_ref n b] monitors a boolean reference [b]. *) val observe_string_ref : ?period:int -> string -> string ref -> string ref (** [observe_string_ref n s] monitors a string reference [s]. *) end (** A module to monitor OCaml values such as native integers, floating-point numbers, booleans, strings. *) module Tree : sig val observe : ?period:int -> string -> (unit -> Protocol.variant) -> unit (** [observe s f] monitors a variant called [s] given by the function [f]. *) end (** A module to monitor OCaml variant types and trees. *) module Hashtable : sig type 'a t val observe : ?period:int -> string -> 'a -> 'a (** [observe s h] monitors a hash table [h] called [s]. One can observe six things about the table: - hash table length (number of elements inside the table) - array length (number of entries of the table) - number of empty buckets - hash table filling rate - longest bucket - mean bucket length *) end (** A module that allows hash tables monitoring. *) (**/**) val to_send : unit -> string val declare_tags : unit -> string (**/**) val log : ('a, Format.formatter, unit, unit) format4 -> 'a (** Similar to an Ocaml printf function. *) val wait_for_connected_clients : int -> unit (** [wait_for_connected_clients n] blocks the program until [n] clients are connected. *) val wait_for_killed_clients : unit -> unit (** [wait_for_killed_clients ()] blocks the program until every clients are disconnected. *) (**/**) val set_nb_clients : int -> unit end (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/net.ml0000644000175000017500000001054211251411607014167 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Printf open Unix open Options let hostname s = try let h = gethostbyname s in h.h_addr_list.(0) with _ -> try (* may be the address was passed as an IP number *) inet_addr_of_string s with _ -> try let h = gethostbyname "localhost" in h.h_addr_list.(0) with _ -> failwith "Netgame.hostname" let server = let machine = if !machine="" then gethostname() else !machine in try let sock = socket PF_INET SOCK_STREAM 0 in let sockaddr = ADDR_INET(hostname machine, !port) in connect sock sockaddr; sock with Unix.Unix_error _ -> printf "connection: couldn't connect to the server %s:%d\n" machine !port; exit 1 let buffer_size = 65536 let str = String.create buffer_size let index = ref 0 (* first free slot in buffer str *) let clean_up = ref 0 let recv str buffer_size = match Unix.select [server] [] [] (-1.0) with [s] , _ , _ -> (* Fabrice: notice that now, this function returns the total size available in the buffer, and not only how much has been read during the last [recv]. *) !index + Unix.recv s str !index (buffer_size - !index) [] | _ -> Format.eprintf "db.recv: could not read from server@."; exit 1 let tmp_string = ref None let shift_left s last n = if last < n then begin let len = n - last in String.blit s last str 0 len; index := len end else index := 0 let rec parse_messages s pos last = if last - pos >= 4 then begin let len_msg, pos2 = Binary.get_int31 s pos in (* Printf.eprintf "size=%d\n%!" len_msg; *) if last - pos2 >= len_msg then begin (* Printf.eprintf "a\n%!"; *) let msg, pos = Bproto.decode_one s pos2 last in (* Printf.eprintf "b\n%!"; *) (try Db.interp msg with _ -> ()); (* Printf.eprintf "c\n%!"; *) parse_messages s pos last end else if len_msg + 4 > buffer_size then begin (* Fabrice: we are in the case where the message is bigger than the default buffer size, we need to allocate a new buffer temporarily. *) let str = String.create (4+len_msg) in let len = last - pos in (* Printf.eprintf "moving %d from %d to str [%d]\n%!" len pos (4+len_msg); *) String.blit s pos str 0 len; index := len; tmp_string := Some str end else shift_left s pos last end else shift_left s pos last let receive () = match !tmp_string with None -> let n = recv str buffer_size in parse_messages str 0 n | Some str -> let len = String.length str in (* Printf.eprintf "waiting for %d from %d\n%!" len !index; *) let n = recv str len in (* Printf.eprintf "found %d\n%!" n; *) if n = len then begin tmp_string := None; parse_messages str 0 n end (* let msgl, last = Bproto.decode str 0 n in assert (last <= n); if last < n then begin let len = n - last in String.blit str last str 0 len; index := len end else index := 0; List.iter Db.interp msgl *) let read_data () = while true do receive (); let rec_window = Db.get_record_window () in if !clean_up = (int_of_float rec_window) mod 10 then begin Db.clean_up (); clean_up := 0 end else incr clean_up done (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/ocamlviz.ml0000644000175000017500000000665411251411607015236 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) include Monitor_impl open Printf open Sys open Unix let debug = ref true let sock = socket PF_INET SOCK_STREAM 0 let clients = ref ([] : out_channel list) let port = try int_of_string (Sys.getenv "OCAMLVIZ_PORT") with Not_found -> 51000 let period = try float_of_string (Sys.getenv "OCAMLVIZ_PERIOD") with Not_found -> 0.1 let init_sock () = try let sockaddr = ADDR_INET (inet_addr_any, port) in setsockopt sock SO_REUSEADDR true; bind sock sockaddr; listen sock 3 with Unix.Unix_error _ as e -> eprintf "run: couldn't run the server (%s)\n" (Printexc.to_string e); exit 1 (* FIXME *) let send_string fd s = let n = String.length s in let _ = Unix.write fd s 0 n in (* if m <> n then Format.eprintf "send_string: incomplete@."; *) () let send_string out s = Printf.fprintf out "%s" s; flush out let new_client _ = let fd,_ = accept sock in set_nonblock fd; let out = out_channel_of_descr fd in send_string out (declare_tags ()); clients := out :: !clients; set_nb_clients (List.length !clients) let send_data s out = try send_string out s; with e -> (* Format.printf "%s@." (Printexc.to_string e); *) clients := List.filter (fun s -> s!=out) !clients; set_nb_clients (List.length !clients) let send () = try let ready,_,_ = Unix.select [sock] [] [] 0. in List.iter new_client ready; if !clients <> [] then let s = to_send () in List.iter (send_data s) !clients; with e -> Format.eprintf "send: %s@." (Printexc.to_string e); () let mutex = ref false let alarm_handler _ = if not !mutex then begin mutex := true; begin try send () with e -> Format.eprintf "send: %s@." (Printexc.to_string e); () end; mutex := false end let send_now () = if not !mutex && !clients <> [] then begin mutex := true; begin try let s = to_send () in List.iter (send_data s) !clients with e -> Format.eprintf "send_now: %s@." (Printexc.to_string e); () end; mutex := false end let () = set_signal sigalrm (Signal_handle alarm_handler); set_signal sigpipe Signal_ignore let () = init_sock (); ignore (Unix.setitimer Unix.ITIMER_REAL { Unix.it_value = 0.1; Unix.it_interval = period }) (* triggers a GC cycle to allow alarms to be handled *) let yield () = ignore [Random.int 1000] let init () = () (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/ocamlviz.mli0000644000175000017500000000255311251411607015401 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) (** Library to instrument the monitored program *) include Monitor_sig.Monitor val yield : unit -> unit (** Use this function to allow monitoring in computation-only code. *) val send_now : unit -> unit (** [send_now ()] immediatly sends the current values of monitored datas to the clients. *) val init : unit -> unit (** [init ()] has to be used to initialize Ocamlviz. *) ocamlviz/src/ocamlviz_threads.ml0000644000175000017500000001561611251411607016746 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) module Point = struct type t = Monitor_impl.Point.t let create = let p = Monitor_impl.Point.create in Thread.yield (); p let kill t = Monitor_impl.Point.kill t; Thread.yield () let observe p = Monitor_impl.Point.observe p; Thread.yield () let observe_calls f = let g = Monitor_impl.Point.observe_calls f in Thread.yield (); g let observe_calls2 f = let g = Monitor_impl.Point.observe_calls2 f in Thread.yield (); g let observe_calls_rec f = let g = Monitor_impl.Point.observe_calls_rec f in Thread.yield (); g let observe_calls_rec2 f = let g = Monitor_impl.Point.observe_calls_rec2 f in Thread.yield (); g end module Tag = struct type t = Monitor_impl.Tag.t module WeakHash = Monitor_impl.Tag.WeakHash let create = let t = Monitor_impl.Tag.create in Thread.yield (); t let mark x y = let value = Monitor_impl.Tag.mark x y in Thread.yield (); value let kill t = Monitor_impl.Tag.kill t; Thread.yield () let set_period t p = Monitor_impl.Tag.set_period t p; Thread.yield () end module Time = struct type t = Monitor_impl.Time.t let elapsed_time = let e = Monitor_impl.Time.elapsed_time in Thread.yield (); e let create = let t = Monitor_impl.Time.create in Thread.yield (); t let kill t = Monitor_impl.Time.kill t; Thread.yield () let start t = Monitor_impl.Time.start t; Thread.yield () let stop t = Monitor_impl.Time.stop t; Thread.yield () let time f= let g = Monitor_impl.Time.time f in Thread.yield (); g end module Value = struct let observe_int_fct ?weak ?period s f = Monitor_impl.Value.observe_int_fct ?weak ?period s f; Thread.yield () let observe_float_fct ?weak ?period s f = Monitor_impl.Value.observe_float_fct ?weak ?period s f; Thread.yield () let observe_bool_fct ?weak ?period s f = Monitor_impl.Value.observe_bool_fct ?weak ?period s f; Thread.yield () let observe_string_fct ?weak ?period s f = Monitor_impl.Value.observe_string_fct ?weak ?period s f; Thread.yield () let observe_int ?weak ?period s i = Monitor_impl.Value.observe_int ?weak ?period s i; Thread.yield () let observe_float ?weak ?period s f = Monitor_impl.Value.observe_float ?weak ?period s f; Thread.yield () let observe_bool ?weak ?period s b = Monitor_impl.Value.observe_bool ?weak ?period s b; Thread.yield () let observe_string ?weak ?period s s' = Monitor_impl.Value.observe_string ?weak ?period s s'; Thread.yield () let observe_int_ref ?period s i = let i' = Monitor_impl.Value.observe_int_ref ?period s i in Thread.yield (); i' let observe_float_ref ?period s f = let f' = Monitor_impl.Value.observe_float_ref ?period s f in Thread.yield (); f' let observe_bool_ref ?period s b = let b' = Monitor_impl.Value.observe_bool_ref ?period s b in Thread.yield () ; b' let observe_string_ref ?period s str = let str' = Monitor_impl.Value.observe_string_ref ?period s str in Thread.yield () ; str' end module Tree = struct type t = Monitor_impl.Tree.t let observe ?(period=100) name fct = Monitor_impl.Tree.observe ~period name fct; Thread.yield () end module Hashtable = struct type 'a t = 'a Monitor_impl.Hashtable.t let observe ?(period=100) name h = let h = Monitor_impl.Hashtable.observe ~period name h in Thread.yield (); h end let to_send = Monitor_impl.to_send let declare_tags = Monitor_impl.declare_tags let log f = Thread.yield (); Monitor_impl.log f let wait_for_killed_clients () = Monitor_impl.wait_for_killed_clients (); Thread.yield () let wait_for_connected_clients i = Monitor_impl.wait_for_connected_clients i; Thread.yield () let set_nb_clients = Monitor_impl.set_nb_clients open Printf open Sys open Unix let debug = ref true let sock = socket PF_INET SOCK_STREAM 0 let clients = ref ([] : out_channel list) let port = try int_of_string (Sys.getenv "OCAMLVIZ_PORT") with Not_found -> 51000 let period = try float_of_string (Sys.getenv "OCAMLVIZ_PERIOD") with Not_found -> 0.1 let init_sock () = try let sockaddr = ADDR_INET (inet_addr_any, port) in setsockopt sock SO_REUSEADDR true; bind sock sockaddr; listen sock 3 with Unix.Unix_error _ -> eprintf "run: couldn't run the server\n"; exit 1 let send_string out s = Printf.fprintf out "%s" s; flush out let new_client _ = let fd,_ = accept sock in set_nonblock fd; let out = out_channel_of_descr fd in Printf.fprintf out "%s" (declare_tags ()); clients := out :: !clients; set_nb_clients (List.length !clients) let send_data s out = try send_string out s; with e -> (* Format.printf "%s@." (Printexc.to_string e); *) clients := List.filter (fun s -> s!=out) !clients; set_nb_clients (List.length !clients) let send () = try let ready,_,_ = Unix.select [sock] [] [] 0. in List.iter new_client ready; if !clients <> [] then let s = to_send () in List.iter (send_data s) !clients; with e -> Format.eprintf "send: %s@." (Printexc.to_string e); () let mutex = ref false let collect () = while true do if not !mutex then begin mutex := true; begin try send () with e -> Format.eprintf "send: %s@." (Printexc.to_string e); () end; mutex := false end; Thread.delay period done let send_now () = if not !mutex && !clients <> [] then begin mutex := true; begin try let s = to_send () in List.iter (send_data s) !clients with e -> Format.eprintf "send_now: %s@." (Printexc.to_string e); () end; mutex := false end let () = init_sock (); set_signal sigpipe Signal_ignore let yield () = Thread.yield () let _ = Thread.create collect () let init () = () (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/ocamlviz_threads.mli0000644000175000017500000000262011251411607017106 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) (** Library to instrument the monitored program (when using a thread server) *) include Monitor_sig.Monitor val yield : unit -> unit (** Use this function to allow monitoring in computation-only code. *) val send_now : unit -> unit (** [send_now ()] immediatly sends the current values of monitored datas to the clients. *) val init : unit -> unit (** [init ()] has to be used to initialize Ocamlviz_threads. *) ocamlviz/src/options.ml0000644000175000017500000000076111251411607015076 0ustar tonkartonkarlet machine = ref "" let port = ref 51000 let output = ref "ascii.log" let terminal = ref false let () = Arg.parse ["-server", Arg.Set_string machine, " specifies the server machine"; "-port", Arg.Set_int port, " specifies the server port"; "-o", Arg.Set_string output, " specifies the name of the generated file"; "-t", Arg.Set terminal, " displays the content of the file in a terminal"] (fun _ -> ()) "usage: client [options]" ocamlviz/src/preflexer.mll0000644000175000017500000000473511251411607015560 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) { let steps = ref 0 let gridx = ref 0 let gridy = ref 0 let xaxis = ref 0 let yaxis = ref 0 let period = ref 0 let record = ref 0. let log = ref 0 } let space = [' ' '\t' '\n'] let integer = ['0'-'9']+ let number = '-'? ['0'-'9']+ |'-'? ['0'-'9']+ '.' ['0'-'9']* | '-'? ['0'-'9']* '.' ['0'-'9']+ rule next_data = parse | space+ { next_data lexbuf } |'\n' { next_data lexbuf } |"steps" space+ (integer as n) space+ { steps := int_of_string n; next_data lexbuf } |"gridx" space+ (integer as n) space+ { gridx := int_of_string n; next_data lexbuf } |"gridy" space+ (integer as n) space+ { gridy := int_of_string n; next_data lexbuf } |"xaxis" space+ (integer as n) space+ { xaxis := int_of_string n; next_data lexbuf } |"yaxis" space+ (integer as n) space+ { yaxis := int_of_string n; next_data lexbuf } |"period" space+ (integer as n) space+ { period := int_of_string n; next_data lexbuf } |"record" space+ (number as n) space+ { record := float_of_string n; next_data lexbuf } |"log" space+ (integer as n) space+ { log := int_of_string n; next_data lexbuf } | eof { } { let read_file file = try let f = open_in file in let l = Lexing.from_channel f in next_data l; close_in f; (!steps,!gridx,!gridy,!xaxis,!yaxis,!period,!record,!log) with Sys_error _ -> (500,5,5,1,1,100,60.,200) } (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/protocol.mli0000644000175000017500000000431311251411607015412 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) (** The signature of protocol datas *) type kind = Point (* 0 *) | Time (* 1 *) | Value_int (* 2 *) | Value_float (* 3 *) | Value_bool (* 4 *) | Value_string (* 5 *) | Tag_count (* 6 *) | Tag_size (* 7 *) | Ktree (* 9 *) | Hash (* 10 *) | Special (** for the garbage collector stats and total execution time *) (* 8 *) | Klog (* 11 *) (** The type that will be observed in the module Tree. *) type variant = Node of string * variant list type value = Int of int | Float of float | String of string | Bool of bool | Int64 of Int64.t | Tree of variant | No_value | Collected | Killed | Hashtable of value * value * value * value | Log of (float * string) list type tag = int (** A tag is an unique representation of a Ocamlviz data. The tags 0,1,2 are always taken. *) (** There are 3 sorts of messages: - [Declare] to send tags to new clients - [Send] to send values to clients - [Bind] to send bindings to new clients*) type msg = | Declare of tag*kind*string | Send of tag*value | Bind of tag list (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/timemap.ml0000644000175000017500000001302711251411607015036 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) (** Imperative implementation. Uses two arrays, [time] for keys (timestamps) and [data] for associated values. (This is more efficient than an array of pairs.) The arrays are used circularly, elements being stored from first to first+n (modulo the size of arrays) +-----------------------------------------------------+ | |.......n elements.......| | +-----------------------------------------------------+ ^ ^ first first+n *) type 'a t = { mutable time : float array; mutable data : 'a array; mutable size : int; (* size of arrays [time] and [data] *) mutable first : int; (* position of the first (least recent) element *) mutable n : int; (* number of elements *) } let tmin = ref 0. let create ?(size=10) x = if size <= 0 then invalid_arg "Timemap.create"; { time = Array.make size 0.; data = Array.make size x; size = size; first = 0; n = 1; } (* let print_tmap tm = *) (* let borne = if (tm.first+tm.n) < tm.size then tm.first+tm.n-1 else size - 1 in*) (* for i= tm.first to borne do *) (* Format.eprintf "tm %d t:%f@." i tm.time.(i) *) (* done *) (* () *) (* blit a1[ofs1...ofs1+len-1] into a2[0..len-1], with ofs1...ofs1+len-1 possibly wrapping around the array a1 *) let circ_blit a1 ofs1 a2 len = let len1 = Array.length a1 in assert (0 <= ofs1 && ofs1 < len1 && len <= len1 && len <= Array.length a2); if ofs1 + len <= len1 then (* a single chunk *) Array.blit a1 ofs1 a2 0 len else begin (* two chunks *) let len0 = len1 - ofs1 in Array.blit a1 ofs1 a2 0 len0; Array.blit a1 0 a2 len0 (len - len0) end (* double the size of [tm] *) let grow tm = if tm.size = Sys.max_array_length then failwith "Timemap.add: cannot grow"; let newsize = min Sys.max_array_length (2 * tm.size) in let newtime = Array.make newsize 0. in circ_blit tm.time tm.first newtime tm.n; let newdata = Array.make newsize tm.data.(0) in circ_blit tm.data tm.first newdata tm.n; tm.time <- newtime; tm.data <- newdata; tm.first <- 0; tm.size <- newsize let add tm t d = if tm.n = tm.size then grow tm; let i = (tm.first + tm.n) mod tm.size in tm.time.(i) <- t; tm.data.(i) <- d; tm.n <- tm.n + 1 (** finds the index of the most recent element in [tm] with time smaller or equal to [t] *) let find_index tm t = if tm.n = 0 || tm.time.(tm.first) > t then begin (* Format.eprintf "t:%f n:%d size:%d@." t tm.n tm.size; *) raise Not_found end ; let size = tm.size in let rec binary_search lo hi = assert (lo <= hi && tm.time.(lo mod size) <= t); if lo = hi then lo mod size else if lo = hi - 1 then if tm.time.(hi mod size) > t then lo mod size else hi mod size else let mid = lo + (hi - lo) / 2 in if tm.time.(mid mod size) > t then (* implies mid > lo *) binary_search lo (mid - 1) else binary_search mid hi in binary_search tm.first (tm.first + tm.n - 1) (** [find tm t] returns the most recent pair [(t',v')] in [tm] with [t'] smaller or equal than [t]; raises [Not_found] if [tm] contains no element or if the first element of [tm] is younger than [t] *) let find tm t = try let i = find_index tm t in tm.time.(i), tm.data.(i) with Not_found -> Format.eprintf "find not_found t:%f@." t;(* print_tmap tm; *) assert false let find_before tm t = let tfirst = tm.first in let tsize = tm.size in let i = find_index tm t in if i < tfirst then begin let size = tsize - tfirst in let ta = Array.sub tm.time tfirst size in let da = Array.sub tm.data tfirst size in Array.blit tm.time 0 ta (size+1) i; Array.blit tm.data 0 da (size+1) i; ta,da end else begin let size = i - tfirst + 1 in let ta = Array.sub tm.time tfirst size in let da = Array.sub tm.data tfirst size in ta,da end (** removes all entries younger than [t] in [tm] *) let remove_before tm t = (* Format.eprintf "remove t:%f before@. first:%d n:%d size:%d@." t tm.first tm.n tm.size; *) (* print_tmap tm; *) if t > !tmin then tmin := t; try let i = find_index tm t in let removed = let i = if i < tm.first then i + tm.size else i in i - tm.first in tm.first <- i mod tm.size; tm.n <- tm.n - removed; if tm.n = 0 then add tm tm.time.(i) tm.data.(i) with Not_found -> () let get_min () = !tmin (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/src/timemap.mli0000644000175000017500000000352711251411607015213 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) (** A small module to store datas in an array and retrieve them with a logarithmic complexity. *) type 'a t val create : ?size:int -> 'a -> 'a t (** [create d] creates a timemap with the data d. @param size The size of the timemap at its creation *) val add : 'a t -> float -> 'a -> unit (** [add tm f d] adds a floating-point [f] and a 'a [d] to the timemap [tm]. *) val find : 'a t -> float -> float * 'a (** [find tm t] returns the most recent pair [(t',v')] in [tm] with [t'] smaller or equal than [t]; raises [Not_found] if [tm] contains no element or if the first element of [tm] is younger than [t]. *) val remove_before : 'a t -> float -> unit (** [remove_before tm t] removes all entries younger or equal to [t] in [tm]. *) val get_min : unit -> float (** [get_min ()] returns the index of the minimum 'a in the timemap. *) ocamlviz/src/tree_panel.ml0000644000175000017500000001531411251411607015521 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Protocol type t = { mutable tree:Protocol.variant; mutable oldtree:Protocol.variant; area:GMisc.drawing_area; mutable pixbuf:GdkPixbuf.pixbuf; mutable pixmap:Gdk.pixmap; cols:GTree.column_list; col:string GTree.column; model:GTree.tree_store; mutable width:float; mutable height:float; mutable scale:float; } let mk_model (model: GTree.tree_store) col row (Node (s,l)) = let rec fct row = function |Node (s,l) -> let row' = model#append ~parent:row () in model#set ~row:row' ~column:col s; List.iter (fun el -> fct row' el) l in model#set ~row:row ~column:col s; List.iter (fun el -> fct row el) l let create_image colored tree = let dot = Filename.temp_file "ocamlviz" ".dot" in Dot.write_to ~colored dot tree; let png = Filename.temp_file "ocamlviz" ".png" in let exit_code = Sys.command (Format.sprintf "dot -Tpng %s -o %s" dot png) in if exit_code <> 0 then png,false else begin Sys.remove dot; png,true end let redraw t_p colored = let png,b = create_image colored t_p.oldtree in if b then begin let pixbuf = GdkPixbuf.from_file png in let width = GdkPixbuf.get_width pixbuf in let height = GdkPixbuf.get_height pixbuf in t_p.width <- float width; t_p.height <- float height; let pixbuf = GdkPixbuf.from_file_at_size ~width:(int_of_float (t_p.width*.t_p.scale)) ~height:(int_of_float(t_p.height*.t_p.scale)) png in t_p.pixbuf <- pixbuf; let width = GdkPixbuf.get_width pixbuf in let height = GdkPixbuf.get_height pixbuf in t_p.area#set_size ~width ~height; let dw = new GDraw.drawable t_p.area#misc#window in let pixmap,_ = GdkPixbuf.create_pixmap pixbuf in t_p.pixmap <- pixmap; dw#put_pixmap ~x:0 ~y:0 pixmap end let refresh t_p = t_p.model#clear (); mk_model t_p.model t_p.col (t_p.model#append ()) t_p.tree; t_p.oldtree <- t_p.tree; redraw t_p [] let path v a = let rec path_aux i = function Node (s,l) -> if i < (Array.length a) - 1 then path_aux (i+1) (List.nth l a.(i)) else List.nth l a.(i) in if Array.length a = 1 then v else path_aux 1 v let color_tree t_p view = let s_rows = view#selection#get_selected_rows in let node_list = ref [] in List.iter (fun p -> let a = GTree.Path.get_indices p in let node = path t_p.oldtree a in node_list := node :: !node_list ) s_rows; redraw t_p !node_list let zoom t_p view scale = t_p.scale <- (scale*.0.01); color_tree t_p view let mk_view t_p (sw: GBin.scrolled_window) name = let tree_view = GTree.view ~model:t_p.model ~packing:sw#add () in tree_view#set_rules_hint true; let col_view = GTree.view_column ~title:name () ~renderer:(GTree.cell_renderer_text[], ["text",t_p.col]) in tree_view#selection#set_mode `MULTIPLE; ignore(tree_view#selection#connect#changed ~callback:(fun () -> color_tree t_p tree_view)); ignore(tree_view#append_column col_view); tree_view let create ?packing name tree = let vbox = GPack.vbox ?packing () in vbox#set_spacing 15; let table = GPack.table ~columns:4 ~rows:1 ~packing:(vbox#pack ~expand:false) () in table#set_col_spacings 5; let butt = GButton.button ~label:" Refresh" ~packing:(table#attach ~left:0 ~top:0) () in let im = GMisc.image ~stock:`REFRESH ~icon_size:`MENU () in butt#set_image im#coerce; let butt_exp = GButton.button ~label:" Expand" ~packing:(table#attach ~left:1 ~top:0) () in let im_exp = GMisc.image ~stock:`SORT_DESCENDING ~icon_size:`MENU () in butt_exp#set_image im_exp#coerce; let _ = GMisc.image ~stock:`ZOOM_FIT ~packing:(table#attach ~left:2 ~top:0) () in let spin = GEdit.spin_button ~update_policy:`IF_VALID ~digits:0 ~packing:(table#attach ~top:0 ~left:3 ~expand:`NONE) () in spin#adjustment#set_bounds ~lower:5. ~upper:100. ~step_incr:5. ~page_incr:20. (); spin#adjustment#set_value 100.; let paned = GPack.paned `HORIZONTAL ~packing:vbox#add () in let cols = new GTree.column_list in let col = cols#add Gobject.Data.string in let model = GTree.tree_store cols in mk_model model col (model#append ()) tree; let sw = GBin.scrolled_window ~shadow_type:`ETCHED_IN ~hpolicy:`AUTOMATIC ~vpolicy:`AUTOMATIC ~packing:paned#add () in let png,b = create_image [] tree in let sw2 = GBin.scrolled_window ~shadow_type:`ETCHED_IN ~hpolicy:`AUTOMATIC ~vpolicy:`AUTOMATIC ~packing:paned#add () in let frame2 = GBin.frame ~shadow_type:`ETCHED_IN ~packing:sw2#add_with_viewport () in let pixbuf = if b then GdkPixbuf.from_file png else GdkPixbuf.from_file "/usr/share/icons/gnome/scalable/status/gtk-missing-image.svg" in let width = GdkPixbuf.get_width pixbuf in let height = GdkPixbuf.get_height pixbuf in let area = GMisc.drawing_area ~width ~height ~packing:frame2#add () in area#misc#modify_bg [(`NORMAL,`WHITE)]; let dw = new GDraw.drawable area#misc#window in let pixmap,_ = GdkPixbuf.create_pixmap pixbuf in dw#put_pixmap ~x:0 ~y:0 pixmap; let t_p = {tree = tree ; oldtree = tree ; area = area ; pixbuf = pixbuf ; pixmap = pixmap ; cols = cols ; col = col ; model = model;width=float width ;height=float height; scale = 1.} in let tree_view = mk_view t_p sw name in ignore(butt#connect#clicked ~callback:(fun () -> refresh t_p)); ignore(butt_exp#connect#clicked ~callback:(fun () -> tree_view#expand_all ())); ignore (t_p.area#event#connect#expose ~callback:(fun _ -> let dw = new GDraw.drawable t_p.area#misc#window in dw#put_pixmap ~x:0 ~y:0 t_p.pixmap; true)); ignore ( spin#connect#value_changed (fun () -> zoom t_p tree_view (spin#adjustment#value))); t_p (* Local Variables: compile-command: "unset LANG; make -C .." End: *) ocamlviz/tests/tstring.ml0000644000175000017500000000601011251725146015447 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let string = ref "" let _ = Value.observe_string_fct "string" (fun () -> !string) let () = wait_for_connected_clients 1; string := "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk" (* lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll *) (* mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm *) (* nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn *) (* ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo *) (* ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp *) (* qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq *) (* rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr *) (* sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss *) (* ttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt *); Format.eprintf "@."; wait_for_killed_clients () (* Local Variables: compile-command: "unset LANG; make -C .. test-tstring" End: *) ocamlviz/tests/tree.ml0000644000175000017500000000652511251725146014727 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz open Tree open Protocol let tree1 = (Protocol.Node ("1",[ Protocol.Node ("1.1",[]); Protocol.Node ("1.2",[ Protocol.Node ("1.2.1",[ Protocol.Node ("1.2.1.1", [ Protocol.Node ("1.2.1.1.1",[]); Protocol.Node ("1.2.1.1.2",[]) ]) ]) ]); Protocol.Node ("1.3",[ Protocol.Node ("1.3.1",[]) ]); Protocol.Node ("1.4",[]) ])) let _ = Tree.observe "tree1" (fun () -> tree1) (* let tree3 = Tree.observe "tree3" (Protocol.Node ("first",[ *) (* Protocol.Node ("second",[]); *) (* Protocol.Node ("third",[]); *) (* Protocol.Node ("fourth",[ *) (* Protocol.Node ("fifth",[]) *) (* ]); *) (* Protocol.Node ("sixth",[]) *) (* ])) *) let () = wait_for_connected_clients 1 let sec = ref 0 let b = Node ("b",[]) let partage = Node ("a",[b;b]) let d = Node ("d",[]) let e = Node ("e",[b;partage]) let c = Node ("c",[d;e]) let arbre = Protocol.Node ("racine",[c;e]) let mk_tree () = let rec fct acc l i = if i = 0 then acc else begin match l with |Node (s,f)::r -> fct (Node (s,fct [] f (i-1))::acc) r (i-1) |[] -> acc end in match arbre with |Node (s,f) -> Node (s,fct [] f (!sec mod 10)) (* let mk_tree () = *) (* Format.eprintf "sec:%d@." !sec; *) (* if !sec < 10 then *) (* Node ("<10",[]) *) (* else if !sec < 100 then *) (* Node ("<10",[Node ("<100",[])]) *) (* else if !sec < 1000 then *) (* Node ("<10",[Node ("<100",[Node ("<1000",[])])]) *) (* else *) (* Node ("end",[]) *) let _ = Tree.observe "arbre" (mk_tree) let mk_sharing_tree () = let rec make = function | 0 -> Node ("leaf", []) | h -> let t = make (h-1) in Node ("node " ^ string_of_int h, [t;t]) in make (!sec mod 10) let _ = Tree.observe "tree with sharing" mk_sharing_tree let mk_sharing_tree2 () = let shared_node = Node ("shared",[Node ("node 6", [])]) in Node ("root", [Node ("node 1", [ Node ("node 3", []); Node ("node 4", [shared_node]) ]) ; Node ("node 2",[ Node ("node 5", [shared_node]) ]) ]) let _ = Tree.observe "sharing" mk_sharing_tree2 let () = while true do incr sec;Unix.sleep 10000 done (* Local Variables: compile-command: "unset LANG; make -C .. test-tree" End: *) ocamlviz/tests/testtime.ml0000644000175000017500000000306011251725146015615 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let time = Time.create "time" let rec f x y acc = if x > 0. then f (x-.1.) y (x *. y +. acc) else acc let g () = Time.start time; ignore (f 500000000. 5. 0.); Time.stop time let () = Format.eprintf "1@."; wait_for_connected_clients 1 let () = Format.eprintf "2@."; g () let () = Format.eprintf "3@."; g () let () = Format.eprintf "4@."; ignore(f 500000000. 5. 0.) let () = Format.eprintf "5@."; g () let () = Format.eprintf "6@."; wait_for_killed_clients () (* Local Variables: compile-command: "unset LANG; make -C .. test-testtime" End: *) ocamlviz/tests/testp4.ml0000644000175000017500000000267111251725146015211 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) let laref = ref 0 let laref = ref 0. let laref = ref "" let laref = ref true let h = Hashtbl.create 17 let () = Hashtbl.add h 0 0; Ocamlviz.wait_for_connected_clients 1 let rec fib v w = if v > 0 then fib (v-1) w else 0 let f x y = x + y ;; let g x = 3 ;; let h arg1 arg2 arg3 arg4 = g arg1 + f arg2 arg3 + arg4 let () = while true do ignore ( fib (h 1 2 3 4) 5); done; Ocamlviz.wait_for_killed_clients () (* -------------- *) ocamlviz/tests/sinus.ml0000644000175000017500000000260711251725146015126 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let () = init (); wait_for_connected_clients 1; let t = ref 0 in let x = Value.observe_int_ref "my value" (ref 1) in let l = ref [] in for i = 0 to 100_000_000 do yield (); incr t; l := !t :: !l; l := List.rev !l; x := truncate (50. +. 50. *. sin (float !t *. 0.001)); done; (* Local Variables: compile-command: "unset LANG; make -C .. test-sinus" End: *) ocamlviz/tests/quicksort.ml0000644000175000017500000000332211251725146016004 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let swap a i j = let t = a.(i) in a.(i) <- a.(j); a.(j) <- t let p = Point.create "p" let time_quicksort = Time.create "quicksort" let quicksort a = let rec quick_rec l r = (* Ocamlviz.send_now (); *) if l < r then begin let v = a.(l) in let m = ref l in for i = l+1 to r do if a.(i) < v then begin incr m; swap a i !m end done; swap a l !m; quick_rec l (!m-1); quick_rec (!m+1) r end in quick_rec 0 (Array.length a - 1) let quicksort a = Time.start time_quicksort; quicksort a; Time.stop time_quicksort let () = wait_for_connected_clients 1 let () = for i = 1 to 10 do let a = Array.init 3_000_000 (fun _ -> Random.int 3000000) in quicksort a done ocamlviz/tests/quicksortl.ml0000644000175000017500000000401611251725146016161 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) (* quicksort on lists *) open Ocamlviz let p1 = Point.create "qsort" let p2 = Point.create "part" let t1 = Time.create "time1" let quicksort s = (* [qsort s acc] sorts [s] and appends it in front of [acc] *) let rec qsort s acc = Point.observe p1; match s with | [] -> acc | [x] -> x :: acc | x :: xs -> let rec part l r s = Point.observe p2; match s with | [] -> qsort l (x :: qsort r acc) | y :: ys when y <= x -> part (y :: l) r ys | y :: ys -> part l (y :: r) ys in part [] [] xs in Time.start t1; let res = qsort s [] in Time.stop t1; res (* test function *) let rec sorted = function | [] | [_] -> true | x :: (y :: _ as s) -> x <= y && sorted s let random_list n = let rec make acc = function | 0 -> acc | n -> make (Random.int n :: acc) (n-1) in make [] n let () = Ocamlviz.init (); let l = random_list 10_000_000 in assert (sorted (quicksort l)) (* Local Variables: compile-command: "unset LANG; make -C .. test-quicksortl" End: *) ocamlviz/tests/mini.ml0000644000175000017500000000230511251725146014714 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let p1 = Point.create "first" let () = while true do Point.observe p1;Format.eprintf "+1@.";Unix.sleep 100000000 done (* Local Variables: compile-command: "unset LANG; make -C .. test-mini" End: *) ocamlviz/tests/memo1.ml0000644000175000017500000000670411251725146015005 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let memo = Point.create "memo" let memo_nohit = Point.create "memo_nohit" let tag_list = Tag.create "lists" let tag_hash = Tag.create ~size:false "hash" open Format let values = Array.init 101 (fun i -> i*i) (* is it actually faster to store them in this order? *) let values = Array.init 101 (fun i -> let j = if i <= 50 then 2*i-1 else 2*i-100 in j*j) let hi = 50 let n = 20 let () = for i = 1 to hi do printf "%d " values.(i) done; printf "@." let rec foldint i j f acc = if i > j then acc else foldint (i+1) j f (f i acc) let memo_t = Hashtbl.create 5003 let () = ignore (Tag.mark tag_hash memo_t) let max_sum = n * foldint 1 hi (fun i acc -> max values.(i) acc) 0 let max_sum = 295425 let () = printf "max sum = %d@." max_sum let iteri t f = for i = 0 to Array.length t - 1 do let v = t.(i) in if v >= 1 then f i v done let to_list t = let len = Array.length t in let rec loop acc i = if i = len then acc else loop (let v = t.(i) in if v >= 1 then (i, v) :: acc else acc) (i+1) in loop [] 0 let rec uss lo hi n = let len = hi - lo + 1 in assert (n <= len); let t = Array.create (max_sum + 1) 0 in if n = 0 then t else if n = 1 then begin for i = lo to hi do t.(values.(i)) <- 1 done; t end else begin let mid = (lo + hi) / 2 in assert (lo <= mid && mid <= hi); let len1 = mid - lo + 1 in let len2 = hi - mid in assert (len = len1 + len2); let mark i v = let v = v + t.(i) in t.(i) <- min 2 v in if n <= len1 then begin let s1 = memo_uss (lo, mid, n) in iteri s1 mark end; if n <= len2 then begin let s2 = memo_uss (mid+1, hi, n) in iteri s2 mark end; for n1 = max 1 (n - len2) to min len1 (n-1) do let s1 = memo_uss (lo, mid, n1) in let s2 = memo_uss (mid+1, hi, n-n1) in let s2 = to_list s2 in iteri s1 (fun i1 v1 -> List.iter (fun (i2, v2) -> mark (i1 + i2) (max v1 v2)) s2) done; (* printf "lo=%2d hi=%3d n=%d ==> @." lo hi n; *) t end and memo_uss ((lo,hi,n) as k) = Point.observe memo; try Hashtbl.find memo_t k with Not_found -> Point.observe memo_nohit; let v = uss lo hi n in Hashtbl.add memo_t k v; v let () = let s = uss 1 hi n in let sum = ref 0L in iteri s (fun i v -> if v = 1 then sum := Int64.add (Int64.of_int i) !sum); printf "sum = %Ld@." !sum; wait_for_killed_clients () (* Local Variables: compile-command: "unset LANG; make -C .. test-memo1" End: *) ocamlviz/tests/log.ml0000644000175000017500000000252511251725146014545 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let cpt = ref 0 let l = ref [] let () = init (); wait_for_connected_clients 1; while true do Unix.sleep 5; log ">>>test %d >>>" !cpt; for i = 0 to 200 do l := !cpt :: !l; l := List.rev !l; done; yield (); incr cpt; done (* Local Variables: compile-command: "unset LANG; make -C .. test-log" End: *) ocamlviz/tests/kill.ml0000644000175000017500000000270611251725146014720 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let point = Point.create "point" let time = Time.create "time" let tag = Tag.create "tag" let () = init (); wait_for_connected_clients 1; let l = Tag.mark tag (ref []) in Time.start time; for n = 1 to 1_000_000 do Point.observe point; l := n :: !l; done; Time.stop time; Point.kill point; Time.kill time; Tag.kill tag; wait_for_killed_clients () (* Local Variables: compile-command: "unset LANG; make -C .. test-kill" End: *) ocamlviz/tests/heapsort.ml0000644000175000017500000000366111251725146015613 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let swap a i j = let t = a.(i) in a.(i) <- a.(j); a.(j) <- t let rec downheap a k n = let j = 2 * k+1 in if j <= n then let j' = if j+1 <= n then if a.(j) < a.(j+1) then j+1 else j else j in if a.(k) < a.(j') then begin swap a k j'; downheap a j' n end let time_downheap = Time.create "downheap" let downheap a k n = Time.start time_downheap; downheap a k n; Time.stop time_downheap let heapsort a = let n = Array.length a in for k = (n-2) / 2 downto 0 do downheap a k (n-1) done; for k = n-1 downto 1 do swap a 0 k; downheap a 0 (k-1) done let time_heapsort = Time.create "heapsort" let heapsort a = Time.start time_heapsort; heapsort a; Time.stop time_heapsort let () = init (); wait_for_connected_clients 1; for i = 1 to 10 do let a = Array.init 3000000 (fun _ -> Random.int 3000000) in heapsort a done (* Local Variables: compile-command: "unset LANG; make -C .. test-heapsort-byte" End: *) ocamlviz/tests/heapsortl.ml0000644000175000017500000000564611251725146015774 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz (* heapsort on lists *) (* leftist heaps *) type 'a t = E | T of int * 'a * 'a t * 'a t exception Empty let rank = function E -> 0 | T (r,_,_,_) -> r let make x a b = let ra = rank a and rb = rank b in if ra >= rb then T (rb + 1, x, a, b) else T (ra + 1, x, b, a) let empty = E let is_empty = function E -> true | T _ -> false let rec merge h1 h2 = match h1,h2 with | E, h | h, E -> h | T (_,x,a1,b1), T (_,y,a2,b2) -> if x >= y then make x a1 (merge b1 h2) else make y a2 (merge h1 b2) let add x h = merge (T (1, x, E, E)) h let t' = Ocamlviz.Time.create "extract" let extract_max = function | E -> raise Empty | T (_,x,a,b) -> x, merge a b let extract_max e = Ocamlviz.Time.start t'; let e_m = extract_max e in Ocamlviz.Time.stop t'; e_m let rec variant_of_heap = function | E -> Protocol.Node ("E", []) | T (_,x,l,r) -> Protocol.Node (string_of_int x, [variant_of_heap l; variant_of_heap r]) let observe_heap h = let r = ref None in fun () -> match !r with | None -> let v = variant_of_heap h in r := Some v; v | Some v -> v let t = Time.create "heapsort" (* heapsort *) let heapsort l = let rec build h = function | [] -> Tree.observe "h" (observe_heap h); sort [] h | x :: l -> build (add x h) l and sort acc h = if is_empty h then acc else let x,h = extract_max h in sort (x :: acc) h in Time.start t; let li = build empty l in Time.stop t; li (* test function *) let rec sorted = function | [] | [_] -> true | x :: (y :: _ as s) -> x <= y && sorted s let random_list n = let rec make acc = function | 0 -> acc | n -> make (Random.int n :: acc) (n-1) in make [] n let () = init (); wait_for_connected_clients 1; let l = random_list 100 in assert (sorted (heapsort l)); wait_for_killed_clients () (* Local Variables: compile-command: "unset LANG; make -C .. test-heapsortl" End: *) ocamlviz/tests/hash.ml0000644000175000017500000000273411251725146014711 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let h = Hashtable.observe "h" (Hashtbl.create 17) let h2 = Hashtable.observe "h2" ~period:1000 (Hashtbl.create 17) let x = ref 0 let () = init (); while true do if !x mod 100 = 0 then begin Hashtbl.add h (Random.int 2000) 2; Hashtbl.add h2 !x !x; end; incr x; let rec fct i = if i > 0 then fct (i-1) else () in fct 2000; done; (* Local Variables: compile-command: "unset LANG; make -C .. test-hash" End: *) ocamlviz/tests/graphneg.ml0000644000175000017500000000242711251725146015560 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let int_test = Value.observe_int_ref "int_test" (ref 0) let () = init (); while true do int_test := !int_test - (Random.int 2); log "%d @." !int_test; Unix.sleep 3 done; (* Local Variables: compile-command: "unset LANG; make -C .. test-graphneg" End: *) ocamlviz/tests/graphfloat.ml0000644000175000017500000000245211251725146016112 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let float_test = Value.observe_float_ref "float_test" (ref 0.) let () = init (); while true do float_test := !float_test +. (Random.float 2.); log "%f @." !float_test; Unix.sleep 1 done; (* Local Variables: compile-command: "unset LANG; make -C .. test-graphfloat" End: *) ocamlviz/tests/fib.ml0000644000175000017500000000707411251725146014530 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let p1 = Point.create "first" let t1 = Time.create "t" let tag = Tag.create ~size:true ~period:1000 "foo" let list = ref [] let vint = ref 0 let vfloat = ref 0. let vstring = ref "" let vbool = ref true let r = ref 1 let _ = Value.observe_int_ref "another_ref" r let t = ref 0 let h = Hashtable.observe "h" (Hashtbl.create 17) let s = Value.observe_int_ref "sinus" (ref 1) let _ = Value.observe_int_fct "vint" (fun () -> !vint) let _ = Value.observe_float_fct "vfloat" (fun () -> !vfloat) let _ = Value.observe_string_fct "vstring" (fun () -> !vstring) let _ = Value.observe_bool_fct "vbool" (fun () -> !vbool) let h2 = Hashtable.observe "incr hash" ~period:1000 (Hashtbl.create 17) let hash_cpt = ref 0 let fib n = let r = Value.observe_int_ref "obserbe_int_ref" (ref 1) in Value.observe_int_fct ~weak:true "observe_int" (fun () -> !r); Value.observe_string "jane" "street"; let rec fib n = Point.observe p1; decr r; let v = (n,!vint,!vfloat,!vstring,!vbool) in let v = if Random.int 1000 < 1 then Tag.mark tag v else v in list := v::!list; Hashtbl.add h2 !hash_cpt !hash_cpt; incr hash_cpt; if n <= 1 then 1 else fib (n-1) + fib (n-2) in fib n let fib2 n = let s1 = "jane" in let s2 = "street" in let s3 = "summer" in let s4 = "project" in Point.kill p1; Time.kill t1; Tag.kill tag; let p2 = Point.create "second" in let rec fb n = Point.observe p2; incr vint; if Random.int 1000000 < 1 then begin vfloat:=!vfloat+. 1.2; vstring:= begin match !vint mod 4 with |0 -> s1 |1 -> s2 |2 -> s3 |3 -> s4 |_ -> assert false end; vbool:=not !vbool; end; let v = (n,!vint,!vfloat,!vstring,!vbool) in list := v :: !list; if Random.int 1000000 = 0 then list := []; if n <= 1 then r := if !r = 1 then 1 + Random.int 10000 else if !r mod 2 = 0 then !r / 2 else 3 * !r + 1; incr t; s := truncate (50. +. 50. *. sin (float !t *. 0.000001)); if n <= 1 then 1 else fb (n-1) + fb (n-2) in fb n let main () = let arg = int_of_string Sys.argv.(1) in init (); Value.observe_int "now_int" arg; Hashtbl.add h 0 arg; (* wait_for_connected_clients 1; *) log "%s first fib" "before"; log "still before first fib"; Time.start t1; ignore (Time.time "fib" fib 32); list := []; Time.stop t1; log "%s first fib, before second fib" "after"; ignore (fib2 arg) let () = main () (* Local Variables: compile-command: "unset LANG; make -C .. test-fib" End: *) ocamlviz/tests/fib2.ml0000644000175000017500000000252611251725146014607 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let p1 = Point.create "p" let fib n = let rec fib_aux n = Point.observe p1; if n <= 1 then 1 else fib_aux (n-1) + fib_aux (n-2) in fib_aux n let _ = init (); wait_for_connected_clients 1; (Time.time "t" fib) 100 (* Local Variables: compile-command: "unset LANG; make -C .. test-fib2-byte" End: *) ocamlviz/tests/dummy.ml0000644000175000017500000000221011251725146015106 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) let () = Ocamlviz.init () let () = while true do Ocamlviz.yield () done (* Local Variables: compile-command: "unset LANG; make -C .. test-dummy" End: *) ocamlviz/tests/collect.ml0000644000175000017500000000271211251725146015407 0ustar tonkartonkar(**************************************************************************) (* *) (* Ocamlviz --- real-time profiling tools for Objective Caml *) (* Copyright (C) by INRIA - CNRS - Universite Paris Sud *) (* Authors: Julien Robert *) (* Guillaume Von Tokarski *) (* Sylvain Conchon *) (* Jean-Christophe Filliatre *) (* Fabrice Le Fessant *) (* GNU Library General Public License version 2 *) (* See file LICENSE for details *) (* *) (**************************************************************************) open Ocamlviz let tag = Tag.create "foo" let () = let _ = init () in Format.eprintf "wait 1 client@."; wait_for_connected_clients 1; Format.eprintf "1 client@."; let r = ref 0 in ignore (Value.observe_int_ref "r" r); ignore (Tag.mark tag r); for n = 1 to 1_000_000 do incr r done; Format.eprintf "wait kill@."; wait_for_killed_clients (); Format.eprintf "kill@." (* Local Variables: compile-command: "unset LANG; make -C .. test-collect" End: *)