pong2-0.1.3/0000777000175000001440000000000011103714317007537 500000000000000pong2-0.1.3/NEWS0000644000175000001440000000010510473646150010156 00000000000000Initial version. Please have a look at the README file for details. pong2-0.1.3/COPYING0000644000175000001440000004311010473646150010515 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 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. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, 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 software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, 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 redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's 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 give any other recipients of the Program a copy of this License along with the Program. 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 Program or any portion of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, 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 Program, 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 Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) 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; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, 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 executable. 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. If distribution of executable or 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 counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. 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 Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program 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. 7. 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 Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program 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 Program. 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. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program 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. 9. The Free Software Foundation may publish revised and/or new versions of the 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 Program 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 Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, 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 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. 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 program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. pong2-0.1.3/configure0000755000175000001440000064435111103705535011401 00000000000000#! /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/main.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS SDL_LIBS SDL_CFLAGS SDL_CONFIG PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CC acx_pthread_config EGREP GREP CPP RANLIB am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir 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 enable_dependency_tracking with_sdl_prefix with_sdl_exec_prefix enable_sdltest ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC CPP' # 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 Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-sdltest Do not try to compile and run a test SDL program Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-sdl-prefix=PFX Prefix where SDL is installed (optional) --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. _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 ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 $as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 $as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} { (exit 1); exit 1; }; } { $as_echo "$as_me:$LINENO: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if test "${ac_cv_build+set}" = set; then $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 $as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} { (exit 1); exit 1; }; } ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 $as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 $as_echo "$as_me: error: invalid value of canonical build" >&2;} { (exit 1); exit 1; }; };; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:$LINENO: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if test "${ac_cv_host+set}" = set; then $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 $as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 $as_echo "$as_me: error: invalid value of canonical host" >&2;} { (exit 1); exit 1; }; };; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:$LINENO: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if test "${ac_cv_target+set}" = set; then $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 $as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} { (exit 1); exit 1; }; } fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 $as_echo "$as_me: error: invalid value of canonical target" >&2;} { (exit 1); exit 1; }; };; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version="1.9" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 $as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 $as_echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AWK+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_AWK="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:$LINENO: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 $as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=pong2 VERSION=0.1.3 cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_ac_ct_STRIP="strip" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ac_config_headers="$ac_config_headers config.h" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_ac_ct_CC="gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_CC="${ac_tool_prefix}cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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 if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_ac_ct_CC="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $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: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 $as_echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } # Provide some information about the compiler. $as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { $as_echo "$as_me:$LINENO: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } if test -z "$ac_file"; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $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: C compiler cannot create executables See \`config.log' for more details." >&5 $as_echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $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: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi fi fi { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } { $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } { $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $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: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi rm -f conftest$ac_cv_exeext { $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $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: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi { $as_echo "$as_me:$LINENO: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:$LINENO: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; 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_ac_ct_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_ac_ct_CXX="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if test "${ac_cv_cxx_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if test "${ac_cv_prog_cxx_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CXXFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cxx_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_RANLIB+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_ac_ct_RANLIB="ranlib" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi 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 { $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:$LINENO: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $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: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&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 { $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 $as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:$LINENO: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 $as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi { $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if test "${ac_cv_c_const+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_c_const=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const /**/ _ACEOF 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 acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" { $as_echo "$as_me:$LINENO: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 $as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_join (); int main () { return pthread_join (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then acx_pthread_ok=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 $as_echo "$acx_pthread_ok" >&6; } if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) { $as_echo "$as_me:$LINENO: checking whether pthreads work without any flags" >&5 $as_echo_n "checking whether pthreads work without any flags... " >&6; } ;; -*) { $as_echo "$as_me:$LINENO: checking whether pthreads work with $flag" >&5 $as_echo_n "checking whether pthreads work with $flag... " >&6; } PTHREAD_CFLAGS="$flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_acx_pthread_config+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$acx_pthread_config"; then ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_acx_pthread_config="yes" $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_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" fi fi acx_pthread_config=$ac_cv_prog_acx_pthread_config if test -n "$acx_pthread_config"; then { $as_echo "$as_me:$LINENO: result: $acx_pthread_config" >&5 $as_echo "$acx_pthread_config" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { $as_echo "$as_me:$LINENO: checking for the pthreads library -l$flag" >&5 $as_echo_n "checking for the pthreads library -l$flag... " >&6; } PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then acx_pthread_ok=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" { $as_echo "$as_me:$LINENO: result: $acx_pthread_ok" >&5 $as_echo "$acx_pthread_ok" >&6; } if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. { $as_echo "$as_me:$LINENO: checking for joinable pthread attribute" >&5 $as_echo_n "checking for joinable pthread attribute... " >&6; } attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { int attr=$attr; return attr; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then attr_name=$attr; break else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext done { $as_echo "$as_me:$LINENO: result: $attr_name" >&5 $as_echo "$attr_name" >&6; } if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then cat >>confdefs.h <<_ACEOF #define PTHREAD_CREATE_JOINABLE $attr_name _ACEOF fi { $as_echo "$as_me:$LINENO: checking if more special flags are required for pthreads" >&5 $as_echo_n "checking if more special flags are required for pthreads... " >&6; } flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac { $as_echo "$as_me:$LINENO: result: ${flag}" >&5 $as_echo "${flag}" >&6; } if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with cc_r # Extract the first word of "cc_r", so it can be a program name with args. set dummy cc_r; 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_PTHREAD_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_PTHREAD_CC="cc_r" $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_PTHREAD_CC" && ac_cv_prog_PTHREAD_CC="${CC}" fi fi PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { $as_echo "$as_me:$LINENO: result: $PTHREAD_CC" >&5 $as_echo "$PTHREAD_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi else PTHREAD_CC="$CC" fi # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then have_pthreads=yes : else acx_pthread_ok=no have_pthreads=no 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 # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_Header'} $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_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test "${ac_cv_header_openssl_ssl_h+set}" = set; then { $as_echo "$as_me:$LINENO: checking for openssl/ssl.h" >&5 $as_echo_n "checking for openssl/ssl.h... " >&6; } if test "${ac_cv_header_openssl_ssl_h+set}" = set; then $as_echo_n "(cached) " >&6 fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_openssl_ssl_h" >&5 $as_echo "$ac_cv_header_openssl_ssl_h" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking openssl/ssl.h usability" >&5 $as_echo_n "checking openssl/ssl.h usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking openssl/ssl.h presence" >&5 $as_echo_n "checking openssl/ssl.h presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: openssl/ssl.h: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: openssl/ssl.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: openssl/ssl.h: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: openssl/ssl.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: openssl/ssl.h: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: openssl/ssl.h: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: openssl/ssl.h: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: openssl/ssl.h: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: openssl/ssl.h: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: openssl/ssl.h: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: openssl/ssl.h: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: openssl/ssl.h: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: openssl/ssl.h: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: openssl/ssl.h: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: openssl/ssl.h: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: openssl/ssl.h: in the future, the compiler will take precedence" >&2;} ;; esac { $as_echo "$as_me:$LINENO: checking for openssl/ssl.h" >&5 $as_echo_n "checking for openssl/ssl.h... " >&6; } if test "${ac_cv_header_openssl_ssl_h+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_header_openssl_ssl_h=$ac_header_preproc fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_openssl_ssl_h" >&5 $as_echo "$ac_cv_header_openssl_ssl_h" >&6; } fi if test "x$ac_cv_header_openssl_ssl_h" = x""yes; then CFLAGS="$CFLAGS -DSOCK_SSL" LIBS="$LIBS -lssl" fi if [ "x$have_pthreads" = "xyes" ]; then LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" CC="$PTHREAD_CC" else { { $as_echo "$as_me:$LINENO: error: cannot find pthreads" >&5 $as_echo "$as_me: error: cannot find pthreads" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: checking for glBegin in -lGL" >&5 $as_echo_n "checking for glBegin in -lGL... " >&6; } if test "${ac_cv_lib_GL_glBegin+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGL $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char glBegin (); int main () { return glBegin (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_GL_glBegin=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_GL_glBegin=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_GL_glBegin" >&5 $as_echo "$ac_cv_lib_GL_glBegin" >&6; } if test "x$ac_cv_lib_GL_glBegin" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGL 1 _ACEOF LIBS="-lGL $LIBS" else { { $as_echo "$as_me:$LINENO: error: Error! You do not have OpenGL installed. You will not be able to play this game." >&5 $as_echo "$as_me: error: Error! You do not have OpenGL installed. You will not be able to play this game." >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: checking for gluLookAt in -lGLU" >&5 $as_echo_n "checking for gluLookAt in -lGLU... " >&6; } if test "${ac_cv_lib_GLU_gluLookAt+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lGLU $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gluLookAt (); int main () { return gluLookAt (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_GLU_gluLookAt=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_GLU_gluLookAt=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_GLU_gluLookAt" >&5 $as_echo "$ac_cv_lib_GLU_gluLookAt" >&6; } if test "x$ac_cv_lib_GLU_gluLookAt" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGLU 1 _ACEOF LIBS="-lGLU $LIBS" else { { $as_echo "$as_me:$LINENO: error: Error! You do not have OpenGL installed. You will not be able to play this game." >&5 $as_echo "$as_me: error: Error! You do not have OpenGL installed. You will not be able to play this game." >&2;} { (exit 1); exit 1; }; } fi # AC_CHECK_LIB([SDL_net], [SDLNet_Init],, AC_MSG_ERROR([Error! You need # SDL_net. Check out http://www.libsdl.org/projects/SDL_net/ for # more info.])) # AC_CHECK_LIB([SDL_ttf], [TTF_OpenFont],, AC_MSG_ERROR([Error! You need SDL_ttf. # Check out http://www.libsdl.org/projects/SDL_ttf/ for more info.])) { $as_echo "$as_me:$LINENO: checking for IMG_Load in -lSDL_image" >&5 $as_echo_n "checking for IMG_Load in -lSDL_image... " >&6; } if test "${ac_cv_lib_SDL_image_IMG_Load+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lSDL_image $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IMG_Load (); int main () { return IMG_Load (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_SDL_image_IMG_Load=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_SDL_image_IMG_Load=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_SDL_image_IMG_Load" >&5 $as_echo "$ac_cv_lib_SDL_image_IMG_Load" >&6; } if test "x$ac_cv_lib_SDL_image_IMG_Load" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBSDL_IMAGE 1 _ACEOF LIBS="-lSDL_image $LIBS" else { { $as_echo "$as_me:$LINENO: error: SDL_image not found!" >&5 $as_echo "$as_me: error: SDL_image not found!" >&2;} { (exit 1); exit 1; }; } fi SDL_VERSION=1.2.4 # Check whether --with-sdl-prefix was given. if test "${with_sdl_prefix+set}" = set; then withval=$with_sdl_prefix; sdl_prefix="$withval" else sdl_prefix="" fi # Check whether --with-sdl-exec-prefix was given. if test "${with_sdl_exec_prefix+set}" = set; then withval=$with_sdl_exec_prefix; sdl_exec_prefix="$withval" else sdl_exec_prefix="" fi # Check whether --enable-sdltest was given. if test "${enable_sdltest+set}" = set; then enableval=$enable_sdltest; else enable_sdltest=yes fi if test x$sdl_exec_prefix != x ; then sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_args="$sdl_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi if test "x$prefix" != xNONE; then PATH="$prefix/bin:$prefix/usr/bin:$PATH" fi # Extract the first word of "sdl-config", so it can be a program name with args. set dummy sdl-config; 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_path_SDL_CONFIG+set}" = set; then $as_echo_n "(cached) " >&6 else case $SDL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS 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_path_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext" $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_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no" ;; esac fi SDL_CONFIG=$ac_cv_path_SDL_CONFIG if test -n "$SDL_CONFIG"; then { $as_echo "$as_me:$LINENO: result: $SDL_CONFIG" >&5 $as_echo "$SDL_CONFIG" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi min_sdl_version=$SDL_VERSION { $as_echo "$as_me:$LINENO: checking for SDL - version >= $min_sdl_version" >&5 $as_echo_n "checking for SDL - version >= $min_sdl_version... " >&6; } no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" rm -f conf.sdltest if test "$cross_compiling" = yes; then echo $ac_n "cross compiling; assumed OK... $ac_c" else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) no_sdl=yes fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } : else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main int main () { return 0; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" { { $as_echo "$as_me:$LINENO: error: *** SDL version $SDL_VERSION not found!" >&5 $as_echo "$as_me: error: *** SDL version $SDL_VERSION not found!" >&2;} { (exit 1); exit 1; }; } fi rm -f conf.sdltest CXXFLAGS="$CFLAGS $SDL_CFLAGS -DPATH_PREFIX=\\\"\$(datadir)/\$(PACKAGE)/\\\"" LIBS="$LIBS $SDL_LIBS" ac_config_files="$ac_config_files Makefile src/Makefile src/grapple/Makefile data/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}' DEFS=-DHAVE_CONFIG_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 if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 $as_echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 $as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 $as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${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 case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files 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 --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands 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' INSTALL='$INSTALL' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$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;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header { $as_echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; };; --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 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/grapple/Makefile") CONFIG_FILES="$CONFIG_FILES src/grapple/Makefile" ;; "data/Makefile") CONFIG_FILES="$CONFIG_FILES data/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 test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= 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" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 $as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 $as_echo "$as_me: error: could not setup config headers machinery" >&2;} { (exit 1); exit 1; }; } fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { $as_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 # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $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 s&@INSTALL@&$ac_INSTALL&;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; }; } ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || { { $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; }; } if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || { { $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; }; } fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 $as_echo "$as_me: error: could not create -" >&2;} { (exit 1); exit 1; }; } fi # Compute "$ac_file"'s index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in "$ac_file" | "$ac_file":* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for "$ac_file"" >`$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'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir=$dirpart/$fdir 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; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; 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 pong2-0.1.3/INSTALL0000644000175000001440000002203010473646150010511 00000000000000Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. pong2-0.1.3/icon.png0000644000175000001440000001561610473646150011132 00000000000000‰PNG  IHDRddpâ•TgAMA± üaEIDATxÚí]ͯ$×UÿsoUw¿7Øå@,&B 8ícņ lX Á–ÄñLœ@„Â*RPp;ÛHH,`Ç‚”ωí$@q£DJ@!‰‘ϼ×]uï9,îGƯª®ê®~óæĂÑ+«Üưz̃ë¾}÷|ưιç×Åuq]\×ÅuqưD\t?îßûFeDñÆø£( 4?*T¯€à-z™.9ĂơÂơ«º4Ë€!€¹` t?' €ñç…`퀟¹ºç{ñúU­ ÁF˜úw H9`Œ^# _ˆ`Ä“âv¢đ 4^ñ¶g¾N€ø̣ÓWµb ’U—ÏKµTŒvP1ÿ„!@¥¤P4ƒăplœâ‘gï=8tÏ$"©%êÛ<–’°ơ|HÄđ5E´5à8Zœ¶Ç»wÀܵ¾qíªÖ X&jËP•ṇÉ(%a Ươ\·¥¤‚`ü½*œ`úđ½±3wüC?û®«Z ©§Ê2–uU¨öàÂ{bf¨È¨’-éØJvˆ2đ"Ø´¥¥Å£wYƯ±û›?x£WĂkGË•5a’ƠCD â{̉`1 &‚÷"~t £6d€̀˜·Ơûƒˆ¡ÄFë=N× œ´¢Ø8àñçï0wäC>síͺdA`8Z.°ZÖ0L€0T'<€`` Ă˜˜ñ̃2eGt{,=Ix^A8 ˜Ä "%‚‚f4­ĂéºÁé¦A+„GŸư½æ¹ñ·è‚5ƒq|´ÄÑr‚* ˆxˆ*ËZ k-Œ10¤"H†ƒxï<´Xö´5|₫rfæÂë¢ ¨BD"uÀ JŒ"<œ®qóä§8i¿₫Ü?Ók—̃÷ Ö¬0̉q|´Âñj `@ƒT$ûaŒEUU°Öª¨ô較s*ÚéœA+Ă ̉—nf“!xˆDDA2ˆ:`R´¿q‚›''8Ưxœ:ů>óUº¯ùû÷?¢5  ÁjYcµ\€ 0T•·ÀXk+˜k´'%Äyç ""ÆỴ̈sÆ¥?&'„k,Ø0Q§Î4ăăûEPIÀ‹¢àtÓàÖºÁÆđËtß̣üo¾^|ÓÏ¡cY[,ê*zÁ»"h˜tơyr†H6ĂEU彃¨FÉÖ<€å2 C ¬1 &018ª®̣ÖíÑødè‹tq—à7^qëtƒµ̃úè¾äkx\ 0µeÔÖ€™: $º³P3oyITª×¢ª æø7Q*¼‡sAzÚ›'=¬ræ QLÔưÇPºÅ}Ysœ̉ £¤„ R±n=Ö­â‡kÁăúÅsÆ̃ÎÿĂŸ<ª)•` Á0e©(i&䉠 ’.f‚2CUQQ˜¸ˆª‰@é²Rt`XĂIªh›ÿºÆÔ®Jñg.9W€ƒÄ“(ÉnÅ]”ß÷^ZUËÚ¢2È*¹'hó©Áx¼ªdXÓªơ"YMy‚7®+±†a8H|pÎư¢C&Ym逜Tˆæ²”xÜÚ8ơu¦7¸ñ̃ôxa°´——1øC”>Å„hÿ@t„½‘¬ªÀ ®ê-@Ôy¨k¡Îm³Ă;˜=éS,Û xÚhS‚=ÜÚxÿî_̉» Èëæ2EÅÁv&ÚÎg UhĐƯéÈŒÅñ1—±8:B}t„j¹ˆ^—ÆÉVj @ûü̃ëơÚ%W,>K€5Œ£e K¥>ưÔ/è]äó×~^-~jµ\5UN₫p…†„©{Ä2TUàºƠ¸ª@u²fô¨²àøïYÂh"·B#̉;Ó¶`<ueq¼ZÀ`iû«zG½¬Ï FÀ=̣nË[|¿IÍ`jmPWf t  R*~‘́Ux_EÙùÁ/ïÈ<z5_3…µ­‹)i‘`4H «ÂC°¨x4Mp°„Xê¤Ă0rrÉûN:vMöœœ7L0̃d-ÈVÀĐ~Œ!Œi{¨* ®€Ú• ?Wñ9 ­;±•œ*ºÓ”X¼¡!÷C̉•!¼tm¿<)!_yúª–tˆÆƠ&Đ`ˆÚí×ëPˆ"• ̃Ṭª¬íÔÊ\é ]®…Mq\́ æ1E ±ÊVpΣơMdˆ*á‘b̀R™Û3¤C̉’”×.Ø› h;º*]Ó(½•kx7slÇPª̉óüYñ¶0¶óÄ0]µ̉»n©âT¬Á†sj9EôÍ|ñ©Ư¶dRB•>dKAi<ÚK©î” c›xơ:u‘<«R…b€öñøy%iZÎư×rùb»Ó&éx…™(΢¥¶G·p¤e Ñ^)™d˜ËèéMJ9\Y=é(ƯYïĂß[ƒ¿̀XÂâ,†]§¢;ê@aŸÛK~hNlí}oí̃8©&Q…á—±làb¬ĂLLŸAe}ơ=oT¦m§kiwPYÜ9AÉ>TÑÛ1…Í0<#úêïR]…æÏ̉¹¨Å"o×ZÓXÏå½îQ¾dSÅ€íN5†w¨-;®®Æ©ôÄKå ®^ÖÚÑ HA¡1PcSË ˆ@5º·&ƒ’1'²Ö<*,IêËÚ"äÔơ£ú.{éá½äB;E¬N‰FÜFÓö%4cˆPÛU–…Ă*ôdG̉JU˜X焹é̉‰É•51’ñ›y ̀µ#´Om @A1Fóµ çB¬̉4жíI=1Ă·.‚̉Ơ†%Pk”}TÏĐè©‚`XaÍ*ë¥ëÁƯå1$ñ8…IơVƒœtbn9ÜYMƠUP ¦ˆ70„C2Ơ´ÇK›üŒèlÔuT™¡Ñ].Y_"3Iq]Y’ê+T½ôç¯Lo¿xm\mmIH,ÚÚÏWª`-́ˆh(Ă4¦ïúƒÛ™«B'ÏŸü³– Đ`¼T]c¿“ÀàXŸ d’b†´.VÊÄ‹±„¨$Ä(9zD¨ÎSY&Q!4½A&}—L¬©ô2k)ÎP*ªæÚ‚9Íô²&UÖ₫ " é;¨óư°X/F̀×Â{ÙYQ£%ÿE øe ç|[Ê¥9.T¨Ç*Ă<ª(S°O2ÍPEgN¹1‡ƒ÷Hiă wâÛmeHù —¤>«3ϨÓ4Ô³™vŸªÔ½‡],ă¶ƒXCĂä‡b2´?‹Ÿ£ªæHɤÚ2€‘˜4³hÛuvơCÍ1Eà#7G Ê”̉°³5‹ Ï…ѡ⭠¥8·c·_u"ê\è,5œµ+Cj$«+ôÙ<öÑWè j«_©“V¾s!e[iµ7^ÛYùë€G+€†8%¹Ă¥‹̣鯧¦`¸Á67ï÷ïÚ̉>ÑœêʆJµ"; 8LB€Đ3=!Ư5 v¤m[´mÛ‰¦î.‹ü&¾¶iµb¤“åŒ<“HGĂŸWH(f2„£¯k®^~¤ôÙDßA¦'jo>ÄI¹µ"¶_b†ó­kaEeM?ÀÅî/:Ÿ°ü(XéªçHĂ>éHñFRG =ŸK©’ScŒ"аq'Đøág§·IïƤKeS0†÷‚Öµ¡ơëX Ẁy²Ñ;%¥·= ‚b@·p’œˆÆ³íJ^Ơ¡¦n€Ǘ,R,Ä¡ăl¢;rà<é#̀SYđÖg^¦V‚œÆˆSƒ°@ªµm[P̣ăZcÖÊ +¸iƒh†>Ü» ø,••êvål`̀á+c§PDgÂôĂ9‰±‡băơö€ ®Úé¦|u•{ı \·ºI—£¥C8(â~‹ƯevƯ±tiÏœ­*͈n±̃H=€#C̀½æoÿÈyäÙ—©ñAÿ¬7(¥æĂ©ó›öça8/s%%a³‰Ơñ|Åj"é ?Co`*/²í̉¢‰'ueº.ÙÎéđµÛ¿g÷}¸ƠHèÈé^Dc&1n¨Gj3ô•*MV—êæ\µŸ\!âmsq-¤m!Mxº*ô–=í¡^ú/J>§¾d ØÛ®£œ¢ơ!4pBø¿›§ø?ÿ·ƒ́ôm•¨ưƯSoÖŸZUXƠ ˨+ÆÑ¢ƯJiüÔµb)hÏz*M»¤¶ —m¢ÂviJnsa­t#¥xî-ụss.ÓïDƒ'%Ö)n­7¸yÚà?ÿçø­O~÷àù½íÁÏ>ư}Ư²ÂQmr/ßÚpáqQ׃‘Æ:•–ë}›AƯª̀!Ɤs¡]’± &Ÿc¥±eRÊ_Le7#jk‚M\TCŒáĂ½q‚WO6øß¾ßøÄ+gÛs)âüâ>¨—W«Ú`YXî»Á†ºÎÔc=tiGz#Ù̉í‰z{R¼3e Re’Ö0™Tn´Ñ­ÿ¸ÎÂÍơ¹Ưx0â.‚q²iq̉x¼íƒ_9ó¼Úóäá¾D/ưñĂ:¸ ÄTc=ö´5ó̉­}y4pƒ5æ¦sS°8¡_ïE’Q@UMÓd#Úï!¶¼ ø\Êdú‘‰ç¸ïƒMߣ*ú¾0óùL‘¾ù¿­¹<×2ç/¿ÿíº²®¯H±ZÖ¹?úđ‹^?Æá¶‡ÔGÄwR ̃g@Ê19Ø$ꉩ̀AøƯn A¨?f6`Ă½)H'0(\ĐB¾ µc½isC₫¾ơ¯ßÇï₫Å÷è¾nüÑCzd†–ËÚbµ¨{=~S"ă 8ÄÔk¼ßIËG ¥Zt±C¯é>ơ*K»Ă±LÇZcm¬¥ 0Ă‹Àû°=MbrÈûNMâÑG^:oêdƯ`ă|8đØßúî÷ñûơ÷æ¸}×§®? ¯«5 Am VË «E#ă¢´ÏéNÉ₫P–ŒNJú9 Ó@ ₫µ6ƒdbqF¨ñ^̣yW"’Ó œ[ ‡ƒIwèÍ“56m '„¾öíïáư_ç2—wtgƧQ`•|¬C]YÔ•^O(FÓ˜tÚf¡…GÁÔKöew™‹Â8œOÀ x8f£mẹ́¡é+ÁyÅÍ“Sœn8%lđ+₫§ûë ª}×箽I+ç̉Ü;c0^rƒME±ă­¡°e;03È$â b¡†—ˆÆ&=ÉHÉ7„ƒ&(n®sĐ×xàñçÎÿ É»²wéS︪+ÛĂj¨;À̃2‰I€ î>@bÍ0Ưf-ơäÁ†¡Ÿ(¡q'ë Ö‘,lđÄÇ¿qŸc8+ˆ|̣Ö†:`zçPÿÔègWídÈ é—₫£´L8è )ÇCŒÓMƒuÓ†Ă½â7×øíO~çµq̉çÜë O]Ñ)eçl"êÑ,Ci|(=ĂƒîDz°ë¬[ tẃ*ádÓÀyEăëVđÄ'₫åµwî!× ×̃ éäûöy/áÀ¶ƒÉ)£>¶W2̣…₫đ² -sSX·‚Ç?öÊ]›§{¾ÿơÓï¼¢Ç5¡N$ÊóHh´ÿÙ(ƒqtTbt„’,ô±äiíægù~¢É̃Ø“Wti)ô6¦„‹tđ˜¢ˆè¢Ë¿¤ú)£ï°ïï‘{Ä}Èđú̉ơà$*?·ƒß:Ÿ°’gÉMíZ ü]₫;Ùˆ‡?̣Íûb.î[@Êë¥ëW4c2<›dè‰ơóƯ}/*=¶±Fê‘û„× »®¯¼ûrAï£È́yxæ¯ùïxq]\×Åuq]\s®ÿC§v®Öû˜IEND®B`‚pong2-0.1.3/config.sub0000755000175000001440000007577710473646244011501 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-07-08' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | ms1 \ | msp430 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m32c) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | ms1-* \ | msp430-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; m32c-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: pong2-0.1.3/configure.ac0000644000175000001440000000334111103705532011741 00000000000000dnl Process this file with autoconf to produce a configure script. AC_INIT(src/main.cpp) AC_CANONICAL_HOST AC_CANONICAL_TARGET AM_INIT_AUTOMAKE(pong2, 0.1.3) AM_CONFIG_HEADER(config.h) dnl Checks for programs. AC_PROG_CC AC_PROG_CXX AC_PROG_RANLIB dnl Checks for header files. AC_HEADER_STDC dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST dnl Check for pthreads ACX_PTHREAD(have_pthreads=yes, have_pthreads=no) dnl Check for SSL AC_CHECK_HEADER([openssl/ssl.h], CFLAGS="$CFLAGS -DSOCK_SSL" LIBS="$LIBS -lssl",) if [[ "x$have_pthreads" = "xyes" ]]; then LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" CC="$PTHREAD_CC" else AC_MSG_ERROR([cannot find pthreads]) fi dnl Checks for libraries. AC_CHECK_LIB([GL], [glBegin],, AC_MSG_ERROR([Error! You do not have OpenGL installed. You will not be able to play this game.])) AC_CHECK_LIB([GLU], [gluLookAt],, AC_MSG_ERROR([Error! You do not have OpenGL installed. You will not be able to play this game.])) # AC_CHECK_LIB([SDL_net], [SDLNet_Init],, AC_MSG_ERROR([Error! You need # SDL_net. Check out http://www.libsdl.org/projects/SDL_net/ for # more info.])) # AC_CHECK_LIB([SDL_ttf], [TTF_OpenFont],, AC_MSG_ERROR([Error! You need SDL_ttf. # Check out http://www.libsdl.org/projects/SDL_ttf/ for more info.])) AC_CHECK_LIB([SDL_image], [IMG_Load],, AC_MSG_ERROR([SDL_image not found!])) dnl Check for SDL SDL_VERSION=1.2.4 AM_PATH_SDL($SDL_VERSION,:, AC_MSG_ERROR([*** SDL version $SDL_VERSION not found!])) dnl CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CFLAGS $SDL_CFLAGS -DPATH_PREFIX=\\\"\$(datadir)/\$(PACKAGE)/\\\"" LIBS="$LIBS $SDL_LIBS" dnl Checks for library functions. AC_OUTPUT([Makefile src/Makefile src/grapple/Makefile data/Makefile]) pong2-0.1.3/Makefile.in0000644000175000001440000004531711103705533011532 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ config.guess config.sub depcomp install-sh missing subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno configure.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ acx_pthread_config = @acx_pthread_config@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ ACLOCAL_AMFLAGS = -I m4 AUTOMAKE_OPTIONS = dist-bzip2 SUBDIRS = src data EXTRA_DIST = \ doxygen.conf \ icon.png \ m4 all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) cd $(top_srcdir) && $(AUTOHEADER) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) $(mkdir_p) $(distdir)/m4 @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ check-am clean clean-generic clean-recursive ctags \ ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \ dist-tarZ dist-zip distcheck distclean distclean-generic \ distclean-hdr distclean-recursive distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive \ mostlyclean mostlyclean-generic mostlyclean-recursive pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pong2-0.1.3/config.h.in0000644000175000001440000000356011103705540011500 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `GL' library (-lGL). */ #undef HAVE_LIBGL /* Define to 1 if you have the `GLU' library (-lGLU). */ #undef HAVE_LIBGLU /* Define to 1 if you have the `SDL_image' library (-lSDL_image). */ #undef HAVE_LIBSDL_IMAGE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define if you have POSIX threads libraries and header files. */ #undef HAVE_PTHREAD /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to empty if `const' does not conform to ANSI C. */ #undef const pong2-0.1.3/missing0000755000175000001440000002540610473646244011075 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2005-06-08.21 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case "$1" in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: pong2-0.1.3/src/0000777000175000001440000000000011103714317010326 500000000000000pong2-0.1.3/src/Client.cpp0000644000175000001440000001226110474143514012173 00000000000000#include "Client.hpp" #include #include Client::Client(void *surf, const Configuration& conf) : Framework(surf, conf, CONNECTING), playername(conf.playername) { client = initNetwork(conf.version, conf.servername, conf.port, conf.playername); if (client == -1) shutdown(); output.addMessage(Interface::CONNECTING); loop(); } Client::~Client() { if (state != CONNECTING) grapple_client_destroy(client); exit(0); } int Client::initNetwork(const std::string& version, const std::string& server, const unsigned short port, const std::string& playername) { grapple_client client = grapple_client_init("Pong2", version.c_str()); grapple_client_sequential_set(client, GRAPPLE_NONSEQUENTIAL); grapple_client_protocol_set(client, GRAPPLE_PROTOCOL_UDP); grapple_client_port_set(client, port); grapple_client_address_set(client, server.c_str()); grapple_client_name_set(client, playername.c_str()); grapple_client_start(client, 0); grapple_error error = grapple_client_error_get(client); if (error != GRAPPLE_NO_ERROR) { std::cerr << "Error starting the client: " << grapple_error_text(error) << std::endl; return -1; } return client; } void Client::movePaddle(double x, double y, unsigned int time) { if (state == RUNNING) { Buffer sbuf(PADDLEMOVE); sbuf.pushInt(time); sbuf.pushDouble(y); sbuf.pushDouble(-x); sendPacket(sbuf, false); } } // nothing to do here on the client side void Client::updateGame(int ticks) {} void Client::serveBall() { if (state == RUNNING) { output.removeMessage(Interface::YOU_SERVE); sendSimplePacket(SERVE_BALL); } } void Client::ping() { grapple_client_ping(client); } void Client::doNetworking() { grapple_message *message; while (grapple_client_messages_waiting(client)) { message=grapple_client_message_pull(client); switch (message->type) { case GRAPPLE_MSG_NEW_USER: peer[message->NEW_USER.id] = Peer("Unnamed"); break; case GRAPPLE_MSG_NEW_USER_ME: peer[message->NEW_USER.id] = Peer("Local Player"); localid = message->NEW_USER.id; sendSimplePacket(READY); break; case GRAPPLE_MSG_USER_NAME: peer[message->USER_NAME.id].name = message->USER_NAME.name; break; case GRAPPLE_MSG_SESSION_NAME: state = TRANSMITTING_DATA; output.removeMessage(Interface::CONNECTING); break; case GRAPPLE_MSG_USER_MSG: { Buffer buf((char*)message->USER_MSG.data, message->USER_MSG.length); switch (buf.getType()) { case READY: ball.push_back(Ball(this)); for (std::map::iterator i = peer.begin(); i != peer.end(); ++i) { Side side = (i->first == localid ? FRONT : BACK); i->second.player = new Player(this, i->second.name, side, field.getLength()/2.0f); player.push_back(i->second.player); i->second.player->run(); } output.updateScore(FRONT, 0); output.updateScore(BACK, 0); output.addMessage(Interface::FLASH_GAME_STARTED); state = RUNNING; break; case PAUSE_REQUEST: togglePause(true, true); break; case RESUME_REQUEST: togglePause(false, true); break; case ROUND: output.updateRound(buf.popInt()); break; case SCORE: { Side side = buf.popSide(); output.updateScore(side, buf.popInt()); if (side == BACK) output.addMessage(Interface::FLASH_YOU_LOST); else output.addMessage(Interface::FLASH_YOU_WIN); ball[0].shrink(1000); } break; case BALLPOSITION: { // in the future, we have to check for the player's side double a = -buf.popDouble(); double b = buf.popDouble(); double c = -buf.popDouble(); ball[0].setPosition(Vec3f(a, b, c)); } break; case PADDLEPOSITION: { grapple_user id = buf.popId(); if (peer[id].player != NULL) peer[id].player->setPosition(-buf.popDouble(), buf.popDouble()); else std::cerr << "Fatal: Wanted to access uninitialized player " << peer[id].name << std::endl; } break; case SERVE_BALL: ball[0].grow(500); if (buf.popId() == localid) output.addMessage(Interface::YOU_SERVE); break; } } break; case GRAPPLE_MSG_USER_DISCONNECTED: break; case GRAPPLE_MSG_SERVER_DISCONNECTED: if (state == CONNECTING) std::cout << "Unable to connect! (no answer - is the server running?)" << std::endl; else std::cout << "Server disconnected!" << std::endl; shutdown(); break; case GRAPPLE_MSG_CONNECTION_REFUSED: std::cout << "Connection refused:\t"; switch (message->CONNECTION_REFUSED.reason) { case GRAPPLE_NOCONN_VERSION_MISMATCH: std::cout << "Wrong network protocol version. (see pong2 -v)" << std::endl; case GRAPPLE_NOCONN_SERVER_FULL: std::cout << "The server is already full. :-(" << std::endl; case GRAPPLE_NOCONN_SERVER_CLOSED: std::cout << "The server is closed at the moment." << std::endl; } shutdown(); break; case GRAPPLE_MSG_PING: if (message->PING.id == localid) output.updatePing(message->PING.pingtime); break; } grapple_message_dispose(message); } } void Client::sendPacket(Buffer& data, bool reliable) { grapple_client_send(client, GRAPPLE_SERVER, reliable * GRAPPLE_RELIABLE, data.getData(), data.getSize()); } pong2-0.1.3/src/Server.hpp0000644000175000001440000000516210474143514012232 00000000000000#ifndef SERVER_H #define SERVER_H #include "Framework.hpp" //! The Server is not only a network listening server but actually master of the gameflow. /*! Even if this were a single player game (well, it's kind of hard against Mr. Wand) we would need the server as the instance caring about everything running right. */ class Server : Framework, EventReceiver { public: //! constructor which initiates the game against Mr.Wand /*! \param surf pointer to the SDL video surface created in main.cpp \param conf a Configuration structure created in main.cpp and filled with configuration from the commandline */ Server(void *surf, const Configuration& conf); //! deconstructor, which tells perhaps connected clients about our suicide /* To prevent any concurrancy to break up stuff, this hardly kills the game with exit(). Note that due to the atexit() registration this will lead to a proper deinitialization of SDL & others. */ ~Server(); static grapple_server initNetwork(const std::string& version, const std::string& name, const unsigned short port); private: //! process the player's desire to move on /*! The according Paddle is called to move itself and every Client is notified of the new position \param x desired movement on the X axis \param y desired movement on the Y axis \param time the actual timestamp (ticks) to determine the elapsed time value since the last move */ void movePaddle(double x, double y, unsigned int time); //! update the game state by moving the ball /*! this will let the ball move and report the new position to every Client afterwards \param ticks elapsed time since the last call */ void updateGame(int ticks); //! process a timer triggered event /*! \param event the event descriptor */ void action(Event event); void resetScore(); //! value a score (ball went outside the field) /*! the score will be calculated, told to the Interface and every Client \param side where the ball went out - this means the player on the opposite will get honourated */ void doScore(Side side); //! let the player kickoff the ball void serveBall(); void ping(); void doNetworking(); void sendPacket(Buffer& data, bool reliable); void startGame(); //! descriptor (index) of the timer used when the ball flies out after a score int ballouttimer; //! the ball's initial Z axis speed when it get's served double ballspeed; //! the actual gaming round /*! Not only shown by Interface but also used to calculate who is the one to serve the ball next Every player gets 5 serves at a time. */ int round; int score[2]; grapple_server server; grapple_client loopback; }; #endif pong2-0.1.3/src/Buffer.cpp0000644000175000001440000000402011102252772012154 00000000000000#include "Buffer.hpp" #include #include Buffer::Buffer() : size(sizeof(PacketType)), freemem(true) { data = (char*)malloc(size); } Buffer::Buffer(PacketType t) : size(sizeof(PacketType)), freemem(true) { data = (char*)malloc(size); setType(t); } Buffer::Buffer(char* content, int bytes) : data(content), size(bytes), pos(sizeof(PacketType)), freemem(false) { memcpy(&type, data, sizeof(PacketType)); } Buffer::~Buffer() { if (freemem) free(data); } void Buffer::setType(PacketType t) { type = t; memcpy(data, &type, sizeof(PacketType)); } void Buffer::pushInt(int value) { data = (char*)realloc(data, size + sizeof(int)); memcpy(data + size, &value, sizeof(int)); size += sizeof(int); } void Buffer::pushDouble(double value) { data = (char*)realloc(data, size + sizeof(double)); memcpy(data + size, &value, sizeof(double)); size += sizeof(double); } void Buffer::pushId(grapple_user value) { data = (char*)realloc(data, size + sizeof(grapple_user)); memcpy(data + size, &value, sizeof(grapple_user)); size += sizeof(Side); } void Buffer::pushSide(Side value) { data = (char*)realloc(data, size + sizeof(Side)); memcpy(data + size, &value, sizeof(Side)); size += sizeof(Side); } void Buffer::pushString(const std::string& str) { data = (char*)realloc(data, size + str.size() + 1); memcpy(data + size, str.c_str(), str.size() + 1); size += str.size() + 1; } int Buffer::popInt() { int value; memcpy(&value, data + pos, sizeof(int)); pos += sizeof(int); return value; } double Buffer::popDouble() { double value; memcpy(&value, data + pos, sizeof(double)); pos += sizeof(double); return value; } grapple_user Buffer::popId() { grapple_user value; memcpy(&value, data + pos, sizeof(grapple_user)); pos += sizeof(grapple_user); return value; } Side Buffer::popSide() { Side value; memcpy(&value, data + pos, sizeof(Side)); pos += sizeof(Side); return value; } std::string Buffer::popString() { char str[size - pos]; memcpy(str, data + pos, size - pos); pos = size; return std::string(str); } pong2-0.1.3/src/main.cpp0000644000175000001440000000642411102253111011665 00000000000000#include #include #include #include #include "config.h" #include "Server.hpp" #include "Client.hpp" //! usage declaration printed if the user gives in a malformed argument, like -h #define USAGE \ "[-n ] [-c ] [-p ] [-w -h ]\ \n[-b ] [-f]\ \n\ \n -n \t set your name (default: Hans)\ \n -c \t connect to already running server (default: act as server)\ \n -p \t set alternative udp networking port (default: 6642)\ \n -w \t set x resolution in pixels (default: 1024)\ \n -h \t set y resolution in pixels (default: 768)\ \n -b \t set individual bitsperpixel (default: 32)\ \n -f \t operate in fullscreen mode (default: windowed, toggle with 'f' key)\ \n -v \t show version information and exit\ \n" //! function to release used resources and hopefully restore the desktop /* This is registered with atexit() as the function to be called on every exit */ void Quit(void) { /* shutdown net2 */ //NET2_Quit(); // FE_Quit(); /* shutdown sdlnet which was used by net2 */ //SDLNet_Quit(); /* clean up the window */ SDL_Quit(); } //! parses the command line options, initializes libraries, hardware and finally gives over to a server or client object int main (int argc, char **argv) { Configuration conf; std::cout << "Pong2 version " << VERSION << " (network protocol version " << conf.version << ")\n"; int c; while ((c = getopt(argc, argv, "c:p:w:h:b:fn:v")) != EOF) { std::stringstream hlp; switch (c) { case 'c': conf.mode = Configuration::CLIENT; conf.servername = optarg; break; case 'p': hlp << optarg; hlp >> conf.port; break; case 'w': hlp << optarg; hlp >> conf.width; break; case 'h': hlp << optarg; hlp >> conf.height; break; case 'b': hlp << optarg; hlp >> conf.bpp; break; case 'f': conf.fullscreen = true; break; case 'n': conf.playername = optarg; break; case 'v': exit(1); break; default: std::cerr << "Usage: " << argv[0] << " " << USAGE; exit(1); } } /* register cleanup function */ atexit(Quit); /* initialize SDL */ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) { std::cerr << "can't initialize SDL video: " << SDL_GetError() << std::endl; exit(EXIT_FAILURE); } /* SDL_SetVideoMode flags */ int videoFlags = SDL_OPENGL; /* Sets up OpenGL double buffering */ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); /* Sets up the stencil buffer */ SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1); /* Get an SDL surface */ SDL_Surface *surface = SDL_SetVideoMode(conf.width, conf.height, conf.bpp, videoFlags); if (!surface) { std::cerr << "Can't create SDL surface: " << SDL_GetError() << std::endl; exit(EXIT_FAILURE); } SDL_WM_SetCaption("Pong²", NULL); /* Initialize the networking - net2 is based on sdlnet */ /*if (SDLNet_Init() == -1) { std::cerr << "Can't initialize networking (Stage 1): " << SDLNet_GetError() << std::endl; exit(EXIT_FAILURE); } if (NET2_Init() == -1) { std::cerr << "Can't initialize networking (Stage 2): " << NET2_GetError() << std::endl; exit(EXIT_FAILURE); }*/ /* create the Server or Client object which controls the game */ if (conf.mode == Configuration::SERVER) Server((void*)surface, conf); else Client((void*)surface, conf); return EXIT_SUCCESS; } pong2-0.1.3/src/stuff.hpp0000644000175000001440000000531210474143514012110 00000000000000#ifndef STUFF_H #define STUFF_H #include #include class Player; //! the game configuration, which can mostly be altered by command line settings struct Configuration { //! the constructor preinitializing default values inline Configuration() : version("10"), width(1024), height(768), bpp(32), fullscreen(false), playername("Hans"), mode(SERVER), servername(""), port(6642) {} //! the game's network protocol version (libgrapple wants a string here) std::string version; //! the screen size in pixels int width, height; //! the desired bits per pixel value (only used if available) int bpp; //! wether to start up in fullscreen mode or not bool fullscreen; //! what role to play (used on startup) enum Netmode { //! be a game controlling server SERVER, //! be a client to connect to a specific host CLIENT, //! be a client searching for servers (not implemented yet) BROADCAST } mode; //! the local player's name std::string playername; //! if in Client mode, the host to connect to std::string servername; //! the UDP networking port unsigned short port; }; //! A side of the field enum Side { //! just none NONE, //! in the front, where the local player acts FRONT, //! in the back, where the remote player acts BACK, //! wall of the field LEFT, //! wall of the field RIGHT, //! wall of the field TOP, //! wall of the field BOTTOM }; //! a two dimensional double (not float) vector struct Vec2f { //! default constructor inline Vec2f() {} //! constructor giving the values inline Vec2f(double xx, double xy) : x(xx), y(xy) {} //! the two values itself double x, y; }; //! a three dimensional double (not float) vector struct Vec3f { //! default constructor inline Vec3f() {} //! constructor giving the values inline Vec3f(double xx, double xy, double xz) : x(xx), y(xy), z(xz) {} //! the three values itself double x, y, z; }; //! an occured collision of a ball against stuff struct Collision { //! the ball's new position, where it got bounced Vec3f position; //! the ball's new speed values Vec3f speed; //! the opponent the ball bounced again, if there are any further policy questions void *opponent; }; //! Any object which can receive timer triggered events struct EventReceiver { //! the events descriptor enum Event { //! accelerate stuff! (used by Ball) ACCELERATE, //! decelerate stuff! (used by Player) DECELERATE, //! the ball got out of the field and needs to be reinserted BALLOUT, //! shrink the ball! SHRINK, //! grow the ball! GROW, //! decrease the alpha value of a flashing message DEFLASH }; //! responsible for actions to be taken after the timer intervall is over virtual void action(Event event)=0; }; #endif pong2-0.1.3/src/Camera.hpp0000644000175000001440000000321210473646146012156 00000000000000#ifndef CAMERA_H #define CAMERA_H #include "stuff.hpp" //! Handles the "camera", the viewing of the game /*! Yet simple this one could be extended for better glory */ class Camera { public: //! viewing/following mode selectable by the user enum View { //! no automatic transformations are done FREE = 1, /*! the camera follows the paddle in reverse order to give a better view of the paddle's surrounding area */ FOLLOW_PADDLE_REVERSE = 2, //! the camera follows the paddle to resemble it's position FOLLOW_PADDLE = 3, }; //! default constructor /*! \param w width of the screen in pixels \param h height of the screen in pixels */ Camera(unsigned int w, unsigned int h); //! set up the viewport void init(); //! returns the camera's distance to the field center inline double getDistance() { return distance; } //! returns the actual View mode inline View getMode() { return mode; } //! set the View mode inline void setMode(View selected) { mode = selected; } //! call the GL routines needed to setup the camera per frame void translate(); //! alter the camera's viewing angle /*! \param x relative adjustment on the X axis \param y relative adjustment on the Y axis */ void adjustAngle(double x, double y); //! alter the camera's distance to the field center /*! \param dist relative adjustment of the distance */ void adjustDistance(double dist); private: //! the actual viewing mode View mode; //! the actual distance to the field center double distance; //! the angle of the camera Vec2f angle; //! screen width in pixels unsigned int width; //! screen height in pixels unsigned int height; }; #endif pong2-0.1.3/src/Player.cpp0000644000175000001440000001642711102253250012205 00000000000000#include "Player.hpp" #include "Framework.hpp" #include #include #include Player::Player(Framework* control, const std::string& nick, Side where, double z) : framework(control), name(nick), side(where), position(0, 0, (where == FRONT ? 1.0 : -1.0) * z), width(1.0f), height(1.0f), speed(0, 0), maxspeed(0.01f), thickness(0.05), deceltimer(-1), attachedBall(NULL), displist(-1), lastmove(0) {} Player::~Player() { if (deceltimer != -1) framework->removeTimer(deceltimer); if (displist != -1) glDeleteLists(displist, 1); } void Player::run() { deceltimer = framework->addTimer(25, DECELERATE, this); } void Player::setSize(double w, double h) { width = w; height = h; if (displist != -1) { glDeleteLists(displist, 1); displist = -1; } } void Player::setPosition(double x, double y) { position.x = x; position.y = y; } void Player::move(double x, double y, unsigned int time) { double timediff = (double)(time - lastmove); if (timediff < 1.0) return; lastmove = time; double speedx = std::min(maxspeed, fabs(x) / timediff) * (x > 0 ? 1 : -1); double speedy = std::min(maxspeed, fabs(y) / timediff) * (y > 0 ? 1 : -1); speed.x = std::max(fabs(speed.x), fabs(speedx)) * (speedx > 0 ? 1 : -1); speed.y = std::max(fabs(speed.y), fabs(speedy)) * (speedy > 0 ? 1 : -1); x = speedx * timediff; y = speedy * timediff; if (x < 0) position.x = framework->detectBarrier(position.x + x - width/2.0f, LEFT, side) + width/2.0f; else position.x = framework->detectBarrier(position.x + x + width/2.0f, RIGHT, side) - width/2.0f; if (y < 0) position.y = framework->detectBarrier(position.y + y - height/2.0f, TOP, side) + height/2.0f; else position.y = framework->detectBarrier(position.y + y + height/2.0f, BOTTOM, side) - height/2.0f; if (attachedBall != NULL) attachedBall->setPosition(Vec3f(position.x, position.y, position.z + (side == FRONT? -1.0 : 1.0) * (thickness * 5.0 + attachedBall->getRadius()))); } void Player::draw() { if (displist == -1) { displist = glGenLists(1); glNewList(displist, GL_COMPILE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE); if (side == FRONT) { GLfloat mat_ambient[] = {0.0, 0.5, 0.0}; GLfloat mat_diffuse[] = {0.0, 0.5, 0.0}; GLfloat mat_specular[] = {0.0, 0.0, 0.0}; GLfloat mat_emission[] = {0.0, 0.0, 0.0}; GLfloat mat_shininess = 0.07812619; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emission); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess); } else { GLfloat mat_ambient[] = {0.8, 0.0, 0.0}; GLfloat mat_diffuse[] = {0.8, 0.0, 0.0}; GLfloat mat_specular[] = {0.0, 0.0, 0.0}; GLfloat mat_emission[] = {0.0, 0.0, 0.0}; GLfloat mat_shininess = 0.07812619; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emission); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess); } Vec2f diff = Vec2f(width / 2.0f / 5.0f, height / 2.0f / 5.0f); // this descibes the Z axis bending double zmod[5][5][2][2] = { 4, 5, 2, 3, 2, 3, 1, 2, 1, 2, 1, 2, 1, 2, 2, 3, 2, 3, 4, 5, 3, 4, 1, 2, 1, 2, 0, 1, 0, 1, 0, 1, 0, 1, 1, 2, 1, 2, 3, 4, 3, 3, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 3, 3, 4, 3, 2, 1, 2, 1, 1, 0, 1, 0, 1, 0, 1, 0, 2, 1, 2, 1, 4, 3, 5, 4, 3, 2, 3, 2, 2, 1, 2, 1, 2, 1, 2, 1, 3, 2, 3, 2, 5, 4, }; double z = thickness * (side == FRONT ? 1.0 : -1.0); glTranslatef(0.0, 0.0, - 5.0 * z); glBegin(GL_QUADS); for (int x = -2; x < 3; x++) { for (int y = -2; y < 3; y++) { glVertex3f(x * diff.x*2.0 + diff.x, y * diff.y*2.0 - diff.y, zmod[x+2][y+2][0][0] * z); glVertex3f(x * diff.x*2.0 - diff.x, y * diff.y*2.0 - diff.y, zmod[x+2][y+2][0][1] * z); glVertex3f(x * diff.x*2.0 - diff.x, y * diff.y*2.0 + diff.y, zmod[x+2][y+2][1][1] * z); glVertex3f(x * diff.x*2.0 + diff.x, y * diff.y*2.0 + diff.y, zmod[x+2][y+2][1][0] * z); } } glEnd(); glDisable(GL_BLEND); glEndList(); } glPushMatrix(); glTranslatef(position.x, position.y, position.z); glCallList(displist); glPopMatrix(); } Collision* Player::detectCol(const Vec3f& bposition, const Vec3f& bspeed, double radius) { // this function indeed is "work in progress" // simple tests: // wrong side if ((side == BACK) == (bposition.z > 0)) return NULL; //std::cout << fabs(bspeed.x) + fabs(bspeed.y) + fabs(bspeed.z) << std::endl; // cache the sign of our position (this is ! the sign of the ball speed) double zSign = (side == FRONT ? 1.0 : -1.0); // not in range (ball is completely in front of the paddle or yet half beyond the paddle) if ((bposition.z*zSign + radius < position.z*zSign - thickness*5.0) ||(bposition.z*zSign > position.z*zSign)) return NULL; // determine X,Y quad struct vec2i { int x, y; } quadnum = { (int)floor(fabs(bposition.x - position.x) / (width / 5.0f)), (int)floor(fabs(bposition.y - position.y) / (height / 5.0f)) }; // test if a quad is hit if ((quadnum.x > 3)||(quadnum.y > 3)) return NULL; // test if it could be with radius is missing THIS HAS TO BE IMPROVED A LOT if ((quadnum.x == 3)&&(fabs(bposition.x-radius - position.x) > width/2.0)) return NULL; if ((quadnum.x == 3)&&(fabs(bposition.y-radius - position.y) > height/2.0)) return NULL; // a little hack: // if the ball already flies in the right direction, it get's ignored if ((side == BACK) == (bspeed.z > 0)) return NULL; double absz = position.z*zSign - thickness*(5.0 - (quadnum.x + quadnum.y)); if (bposition.z*zSign + radius < absz) return NULL; // we call it a hit Collision* col = new Collision; // we should use a better way to provide new positions col->position.x = bposition.x; col->position.y = bposition.y; col->position.z = bposition.z;//absz * zSign; col->speed.x = bspeed.x + speed.x * 200.0 + quadnum.x * 0.2 * (bposition.x >= position.x ? 1.0 : -1.0); col->speed.y = bspeed.y + speed.y * 200.0 + quadnum.y * 0.2 * (bposition.y >= position.y ? 1.0 : -1.0); double zSpeed = bspeed.z * zSign; // we substract here what we added as quadnum values on x and y //zSpeed -= (quadnum.x + quadnum.y) * 0.25; //zSpeed = std::max(zSpeed, 0.1); col->speed.z = zSpeed * -zSign; std::cout << "*** HIT ***" << std::endl; return col; } void Player::attachBall(Ball* ball) { attachedBall = ball; attachedBall->setSpeed(Vec3f(0.0, 0.0, 0.0)); attachedBall->setPosition(Vec3f(position.x, position.y, position.z + (side == FRONT? -1.0 : 1.0) * (thickness * 5.0 + attachedBall->getRadius()))); attachedBall->grow(500); } void Player::detachBall(double zSpeed) { if (attachedBall != NULL) { attachedBall->setSpeed(Vec3f(speed.x * 500.0, speed.y * 500.0, (side == FRONT? -1.0 : 1.0) * zSpeed)); attachedBall = NULL; } } void Player::decelerate() { speed.x = (speed.x > 0.0 ? 1 : -1) * std::max(0.0, fabs(speed.x) - 0.001f); speed.y = (speed.x > 0.0 ? 1 : -1) * std::max(0.0, fabs(speed.y) - 0.001f); //std::cout << std::endl << name << ":\t " << speed.x << "\t " << speed.y << std::endl; } void Player::action(Event event) { if (event == DECELERATE) { decelerate(); } } pong2-0.1.3/src/Framework.cpp0000644000175000001440000003104411102253221012674 00000000000000#include #include #include #include "Framework.hpp" #include "Interface.hpp" #include "SDL_image.h" Framework::Framework(void *surf, const Configuration& conf, Networkstate initial) : field(this), output(this), surface((SDL_Surface*)surf), paused(1), timeunit(7), lasttime(SDL_GetTicks()), frames(0), state(initial), xdiff(0), camera(conf.width, conf.height) { /* initialize OpenGL */ resetGL(); /* set up the window */ camera.init(); if (conf.fullscreen) SDL_WM_ToggleFullScreen(surface); /* set unpaused state (grab input) */ togglePause(false, true); } Framework::~Framework() { for (int i = 0; i < timerdata.size(); i++) { if (timerdata[i]->timer != NULL) SDL_RemoveTimer(timerdata[i]->timer); delete timerdata[i]; } } void Framework::loop() { /* main loop variable */ bool done = false; /* used to collect events */ SDL_Event event; /* wait for events */ while (!done) { /* handle the events in the queue */ while (SDL_PollEvent(&event)) { switch(event.type) { case SDL_MOUSEMOTION: /* give away mouse movement with buttons pressed */ handleMouseMove(event.motion.xrel, event.motion.yrel, event.motion.state); break; case SDL_MOUSEBUTTONUP: /* handle mouse button release for serving */ if (event.button.button == SDL_BUTTON_LEFT) if (!paused) serveBall(); case SDL_KEYDOWN: /* handle key presses */ handleKeyPress(&event.key.keysym); break; case SDL_QUIT: /* handle quit requests */ done = true; break; case SDL_USEREVENT: if (((TimerData*)event.user.data1)->timer == NULL) { /* this means our timer has gone inactive and we are pleased to stop our work! */ } else { ((TimerData*)event.user.data1)->receiver->action(((TimerData*)event.user.data1)->event); } break; } } int tdiff = SDL_GetTicks() - lasttime; if (tdiff > timeunit) { frames++; xdiff += tdiff; // always greater 0 because we decided to let tdiff be greater than timeunit if ((xdiff >= 500)&&(xdiff >= timeunit * 25)) { output.updateFPS(frames * 1000.0 / xdiff); // There are 1000 ticks / second frames = 0; xdiff = 0; ping(); } lasttime += tdiff; // Multiplayer code doNetworking(); // Game status code updateGame(tdiff); // Rendering code drawScene(); } } } /* function to handle key press events */ void Framework::handleKeyPress(SDL_keysym *keysym) { switch (keysym->sym) { case SDLK_q: shutdown(); break; case SDLK_f: SDL_WM_ToggleFullScreen(surface); break; case SDLK_ESCAPE: case SDLK_p: togglePause(false, false); break; case SDLK_F1: camera.setMode((Camera::View)1); break; case SDLK_F2: camera.setMode((Camera::View)2); break; case SDLK_F3: camera.setMode((Camera::View)3); break; default: break; } } void Framework::handleMouseMove(int x, int y, unsigned char buttons) { if (buttons & SDL_BUTTON(SDL_BUTTON_RIGHT)) { camera.adjustAngle((double)x / 10.0, (double)y / 10.0); } else if (buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE)) { camera.adjustDistance((double)y / 10.0); resetGL(); } else { if (!paused) movePaddle((double)x / 50.0, (double)-y / 50.0, SDL_GetTicks()); if (camera.getMode() == Camera::FOLLOW_PADDLE) camera.adjustAngle((double)-x / 20.0, (double)-y / 20.0); else if (camera.getMode() == Camera::FOLLOW_PADDLE_REVERSE) camera.adjustAngle((double)x / 20.0, (double)y / 20.0); } } void Framework::togglePause(bool pause, bool external) { PacketType t; if ((((external)&&(pause))||((!external)&&(paused == 0)))&&(state != CONNECTING)) { paused = SDL_GetTicks() - lasttime; SDL_ShowCursor(1); SDL_WM_GrabInput(SDL_GRAB_OFF); output.togglePaused(true); t = PAUSE_REQUEST; } else { lasttime = SDL_GetTicks() + paused; paused = 0; if (state != CONNECTING) { SDL_ShowCursor(0); SDL_WM_GrabInput(SDL_GRAB_ON); } output.togglePaused(false); t = RESUME_REQUEST; } if (!external) sendSimplePacket(t); } /* function to load in bitmap as a GL texture */ GLuint Framework::loadTexture(const std::string& filename) { std::string fullname = std::string(PATH_PREFIX) + filename; GLuint texture = 0; /* Create temporal storage space for the texture */ SDL_Surface *image; /* trying to load the bitmap */ if ((image = IMG_Load(fullname.c_str()))) { /* As the generated SDL surface has the format of the input image, ie 24 bit or 8 bit, we have to convert it to the format GL expects from us. In this case, 24 bpp. */ SDL_PixelFormat format; format.palette = NULL; format.BitsPerPixel= 24; format.Rshift= 16; format.Gshift= 8; format.Bshift= 0; format.Rmask= 0xff<<16; format.Gmask= 0xff<<8; format.Bmask= 0xff; SDL_Surface *teximage = SDL_ConvertSurface(image, &format, SDL_SWSURFACE); if (teximage) { /* Create the texture */ glGenTextures(1, &texture); /* Load in texture */ glBindTexture(GL_TEXTURE_2D, texture); /* Nearest filtering looks good on our wall texture */ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /* Generate the texture */ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, teximage->w, teximage->h, 0, GL_BGR, GL_UNSIGNED_BYTE, teximage->pixels); SDL_FreeSurface(teximage); } else { std::cerr << "Failed to convert texture format: " << fullname << std::endl; shutdown(); } SDL_FreeSurface(image); } else { // we have no proper way to deal with missing textures, so we quit std::cerr << "Couldn't load texture: " << fullname << "\n\t" << IMG_GetError() << std::endl; shutdown(); } return texture; } /* general OpenGL initialization function */ void Framework::resetGL() { /* Enable smooth shading */ glShadeModel(GL_SMOOTH); /* Set the background black */ glClearColor(0.0f, 0.1f, 0.15f, 0.0f); /* Depth buffer setup */ glClearDepth(1.0f); /* Enable normalizing of normals, actually not needed */ //glEnable(GL_NORMALIZE); /* type of depth test to do */ glDepthFunc(GL_LEQUAL); /* really nice perspective calculations */ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glDisable(GL_COLOR_MATERIAL); // we have nice materials // Light parameters, used for all lights GLfloat l_ambient [] = { 0.1, 0.1, 0.1, 1.0 }; GLfloat l_diffuse [] = { 0.4, 0.4, 0.4, 1.0 }; GLfloat l_specular[] = { 1.0, 1.0, 1.0, 1.0 }; // Set parameters but do not activate yet glLightfv(GL_LIGHT0, GL_AMBIENT, l_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, l_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, l_specular); glLightfv(GL_LIGHT1, GL_AMBIENT, l_ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, l_diffuse); glLightfv(GL_LIGHT1, GL_SPECULAR, l_specular); glLightfv(GL_LIGHT2, GL_AMBIENT, l_ambient); glLightfv(GL_LIGHT2, GL_DIFFUSE, l_diffuse); glLightfv(GL_LIGHT2, GL_SPECULAR, l_specular); glLightfv(GL_LIGHT3, GL_AMBIENT, l_ambient); glLightfv(GL_LIGHT3, GL_DIFFUSE, l_diffuse); glLightfv(GL_LIGHT3, GL_SPECULAR, l_specular); // translate according actual camera position camera.translate(); { GLfloat l_pos[] = { -field.getWidth(), -field.getHeight(), 0.0f, 1.0f }; glLightfv(GL_LIGHT0, GL_POSITION, l_pos); } { GLfloat l_pos[] = { -field.getWidth(), field.getHeight(), 0.0f, 1.0f }; glLightfv(GL_LIGHT1, GL_POSITION, l_pos); } { GLfloat l_pos[] = { field.getWidth(), -field.getHeight(), 0.0f, 1.0f }; glLightfv(GL_LIGHT2, GL_POSITION, l_pos); } { GLfloat l_pos[] = { field.getWidth(), field.getHeight(), 0.0f, 1.0f }; glLightfv(GL_LIGHT3, GL_POSITION, l_pos); } // now activate everything: glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glEnable(GL_LIGHT2); glEnable(GL_LIGHT3); // when clearing the stencil buffer, use 0 glClearStencil(0); } /* Here goes our drawing code */ void Framework::drawScene() { /* Clear the Buffers */ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); output.drawBackground((paused)||(state == CONNECTING)); if (state != CONNECTING) { camera.translate(); /* while we draw into the stencil buffer to store where the walls are to be overdrawn with the ball reflections, we also draw the first "half" of the walls */ glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); /* we draw at half brightness, and later at half alpha. because we want to lighten it a little bit up, we use 0.6 instead of 0.5 */ glColor3f(0.6, 0.6, 0.6); field.draw(); glDisable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); glStencilFunc(GL_EQUAL, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // we will alter the modelview matrix by mirroring it glPushMatrix(); // now it's time to draw 4 reflections for every ball /* Normally we would have to reposition the lights (according to the mirroring) we have 4 lights with alike attributes which would replace themselves anyway so we don't need to change them. For different light colors / other positions we would need to add stuff here */ glScalef(1.0, -1.0, 1.0); glTranslatef(0.0, field.getHeight(),0.0); for (int i = 0; i < ball.size(); i++) ball[i].draw(); camera.translate(); glScalef(1.0, -1.0, 1.0); glTranslatef(0.0, -field.getHeight(),0.0); for (int i = 0; i < ball.size(); i++) ball[i].draw(); camera.translate(); glScalef(-1.0, 1.0, 1.0); glTranslatef(field.getWidth(), 0.0,0.0); for (int i = 0; i < ball.size(); i++) ball[i].draw(); camera.translate(); glScalef(-1.0, 1.0, 1.0); glTranslatef(-field.getWidth(), 0.0, 0.0); for (int i = 0; i < ball.size(); i++) ball[i].draw(); glDisable(GL_STENCIL_TEST); glPopMatrix(); /* we now can overdraw the ball with the half translucent wall. this will give a nice looking reflection effect */ glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_LIGHTING); glColor4f(1.0f, 1.0f, 1.0f, 0.5f); glEnable(GL_TEXTURE_2D); field.draw(); glDisable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glDisable(GL_BLEND); // finally we want to see the balls themselves, too for (int i = 0; i < ball.size(); i++) ball[i].draw(); // we conclude with translucent objects, first in the back: for (int i = 0; i < player.size(); i++) if (player[i]->getSide() == BACK) player[i]->draw(); // next the ones in the front: for (int i = 0; i < player.size(); i++) if (player[i]->getSide() == FRONT) player[i]->draw(); // these are overlays output.drawScore(); output.drawRound(); } output.drawFPS(); output.drawMessages(); /* Draw it to the screen */ SDL_GL_SwapBuffers(); } Collision* Framework::detectCol(const Vec3f& position, const Vec3f& speed, double radius) { Collision* col; // test against walls col = field.detectCol(position, speed, radius); if (col != NULL) return col; // detection for paddles for (int i = 0; i < player.size(); i++) { col = player[i]->detectCol(position, speed, radius); if (col != NULL) return col; } // wether the ball is still inside? Side side = field.zOutside(position.z); if (side != NONE) // doScore() detects itself if it's called multiple times doScore(side); return NULL; } double Framework::detectBarrier(double dest, int direction, Side side) { switch (direction) { case LEFT: return std::max(dest, -field.getWidth()/2.0f); case RIGHT: return std::min(dest, field.getWidth()/2.0f); case TOP: return std::max(dest, -field.getHeight()/2.0f); case BOTTOM: return std::min(dest, field.getHeight()/2.0f); default: return INFINITY; } } int Framework::addTimer(unsigned int intervall, EventReceiver::Event event, EventReceiver* receiver) { TimerData* data = new TimerData; data->event = event; data->receiver = receiver; data->timer = SDL_AddTimer(intervall, processTimer, data); timerdata.push_back(data); return timerdata.size() - 1; } void Framework::removeTimer(int index) { SDL_RemoveTimer(timerdata[index]->timer); timerdata[index]->timer = NULL; /* we are NOT allowed to delete the TimerData object, because it could be pointed to by a currently running timer. it has to check wether it's SDL Timer still exists and kill itself if not. */ } void Framework::sendSimplePacket(PacketType t) { Buffer sbuf(t); /* up till now, all simple packets are state control and therefor need to be sent reliable. */ sendPacket(sbuf, true); } void Framework::shutdown() { SDL_Event killer; killer.type = SDL_QUIT; SDL_PushEvent(&killer); } unsigned int processTimer(unsigned int intervall, void* data) { SDL_Event event; event.type= SDL_USEREVENT; event.user.data1 = data; SDL_PushEvent(&event); return intervall; } pong2-0.1.3/src/Makefile.in0000644000175000001440000004354411103705533012321 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = pong2$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_pong2_OBJECTS = main.$(OBJEXT) Framework.$(OBJEXT) Server.$(OBJEXT) \ Client.$(OBJEXT) Field.$(OBJEXT) Ball.$(OBJEXT) \ Player.$(OBJEXT) Camera.$(OBJEXT) Interface.$(OBJEXT) \ Buffer.$(OBJEXT) pong2_OBJECTS = $(am_pong2_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(pong2_SOURCES) DIST_SOURCES = $(pong2_SOURCES) RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-exec-recursive install-info-recursive \ install-recursive installcheck-recursive installdirs-recursive \ pdf-recursive ps-recursive uninstall-info-recursive \ uninstall-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ acx_pthread_config = @acx_pthread_config@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ SUBDIRS = grapple pong2_DEPENDENCIES = grapple/libgrapple.a pong2_LDADD = \ $(top_srcdir)/src/grapple/libgrapple.a \ @LIBS@ pong2_SOURCES = \ main.cpp stuff.hpp Framework.cpp Framework.hpp \ Server.cpp Server.hpp \ Client.cpp Client.hpp \ Field.cpp Field.hpp \ Ball.cpp Ball.hpp \ Player.cpp Player.hpp \ Camera.cpp Camera.hpp \ Interface.cpp Interface.hpp \ Buffer.cpp Buffer.hpp all: all-recursive .SUFFIXES: .SUFFIXES: .cpp .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) pong2$(EXEEXT): $(pong2_OBJECTS) $(pong2_DEPENDENCIES) @rm -f pong2$(EXEEXT) $(CXXLINK) $(pong2_LDFLAGS) $(pong2_OBJECTS) $(pong2_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Ball.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Buffer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Camera.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Field.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Framework.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Player.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ .cpp.o: @am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(mkdir_p) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(mkdir_p) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-exec-am: install-binPROGRAMS install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \ clean clean-binPROGRAMS clean-generic clean-recursive ctags \ ctags-recursive distclean distclean-compile distclean-generic \ distclean-recursive distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-exec install-exec-am \ install-info install-info-am install-man install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-recursive pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-binPROGRAMS uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pong2-0.1.3/src/Client.hpp0000644000175000001440000000346710474143514012210 00000000000000#ifndef CLIENT_H #define CLIENT_H #include "Framework.hpp" //! network game client /*! The client can't do anything by its own. It's intended to give away all the work to the Server on the other end of the line. */ class Client : Framework { public: //! constructor which initiates the connecting process /*! \param surf pointer to the SDL video surface created in main.cpp \param conf a Configuration structure created in main.cpp and filled with configuration from the commandline */ Client(void *surf, const Configuration& conf); //! deconstructor, which tells the perhaps connected server that we give up /* To prevent any concurrancy to break up stuff, this hardly kills the game with exit(). Note that due to the atexit() registration this will lead to a proper deinitialization of SDL & others. */ ~Client(); static grapple_client initNetwork(const std::string& version, const std::string& server, const unsigned short port, const std::string& playername); private: //! process the player's desire to move on /*! Tells the server that the player wants to move \param x desired movement on the X axis \param y desired movement on the Y axis \param time the actual timestamp (ticks), ignored */ void movePaddle(double x, double y, unsigned int time); void updateGame(int ticks); //! unused, see Server inline void doScore(Side side) {}; //! let the player kickoff the ball (notifies the Server) void serveBall(); void ping(); //! process messaging queue and send periodical (ping) packages void doNetworking(); void sendPacket(Buffer& data, bool reliable); //! temporary placeholder for the player's name until the Player object is created (while data is transmitted) std::string playername; //! libgrapple client object, used for network communication grapple_client client; }; #endif pong2-0.1.3/src/Ball.hpp0000644000175000001440000000414210473646146011643 00000000000000#ifndef BALL_H #define BALL_H #include #include #include "stuff.hpp" class Framework; //! The ball is the most important piece of our game.. class Ball : public EventReceiver { public: //! The constructor /*! \param control the game's Framework (ie Server or Client) object */ Ball(Framework *control); //! The destructor ~Ball(); //! returns the radius inline double getRadius() { return radius; } //! returns a reference to the position inline const Vec3f& getPosition() { return position; } //! returns a reference to the speed vector inline const Vec3f& getSpeed() { return speed; } //! set a new position /*! used by the Client \param pos reference to the new position */ void setPosition(const Vec3f& pos); //! set new speed values /*! \param spd reference to the new speed vector */ void setSpeed(const Vec3f& spd); //! process a timer triggered event /*! \param event the event descriptor */ void action(Event event); //! move on /*! Let's the ball move for some time. It will ask for collisions itself. \param ticks the time evolved in ms */ void move(int ticks); //! draw the ball using GL functions void draw(); //! shrink the ball /*! start the process of shrinking \param ticks duration of the scaling process in ms */ void shrink(int ticks); //! grow the ball /*! start the process of growing \param ticks duration of the scaling process in ms */ void grow(int ticks); private: //! pointer to the game's Framework (ie Server or Client) object Framework *framework; //! radius of the ball double radius; //! the actual position Vec3f position; //! speed values for every axis Vec3f speed; //! minimum z speed the ball constantly accelerates to double zSpeed; //! pointer to our quadrik which builds the sphere GLUquadricObj *quad; //! descriptor of the utilized display list int displist; //! actual scaling (shrink/grow) double scale; //! describing the scaling progress int spawntodo, spawndone; //! reference to the timer used for scaling int spawntimer; //! reference to the timer used for accelerating int acceltimer; }; #endif pong2-0.1.3/src/Camera.cpp0000644000175000001440000000243411102253157012140 00000000000000#include "Camera.hpp" #include #include #include Camera::Camera(unsigned int w, unsigned int h) : distance(7.75), angle(0.0, 0.0), mode(FOLLOW_PADDLE_REVERSE), width(w), height(h) { } void Camera::init() { /* Height / width ratio */ GLfloat ratio; /* Protect against a divide by zero */ if (height == 0) height = 1; ratio = (GLfloat)width / (GLfloat)height; /* Setup our viewport. */ glViewport(0, 0, (GLsizei)width, (GLsizei)height); /* change to the projection matrix and set our viewing volume. */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* Set our perspective with a FOV of 60 */ gluPerspective(60.0f, ratio, 0.01f, 100.0f); /* Make sure we'll operate on the model view and not the projection */ glMatrixMode(GL_MODELVIEW); } void Camera::translate() { glLoadIdentity(); glTranslatef(0.0, 0.0, -distance); glRotatef(angle.y, 1.0, 0.0, 0.0); glRotatef(angle.x, 0.0, 1.0, 0.0); } void Camera::adjustAngle(double x, double y) { angle.x += x; angle.y += y; angle.x = std::min(fabs(angle.x), 10.0) * (angle.x > 0 ? 1.0 : -1.0); angle.y = std::min(fabs(angle.y), 10.0) * (angle.y > 0 ? 1.0 : -1.0); } void Camera::adjustDistance(double dist) { distance += dist; if (distance < 0.0) distance = 0.0; if (distance > 11.0) distance = 11.0; } pong2-0.1.3/src/Ball.cpp0000644000175000001440000000720611102253101011611 00000000000000#include "Ball.hpp" #include "Framework.hpp" #include #include #include Ball::Ball(Framework* control) : framework(control), radius(0.2), quad(NULL), displist(-1), spawntimer(-1), acceltimer(-1), scale(0.0), position(0.0, 0.0, 0.0), speed(0.0, 0.0, 0.0), zSpeed(0.0) { } Ball::~Ball() { if (quad != NULL) gluDeleteQuadric(quad); if (displist != -1) glDeleteLists(displist, 1); } void Ball::setPosition(const Vec3f& pos) { position.x = pos.x; position.y = pos.y; position.z = pos.z; } void Ball::setSpeed(const Vec3f& spd) { speed.x = spd.x; speed.y = spd.y; speed.z = spd.z; /* we have a new speed we want to achieve actually, it is yet achieved. but after bounces, it could get lower */ zSpeed = speed.z; } void Ball::action(Event event) { if (event == GROW) { scale = double(spawndone) / (double)(spawndone + spawntodo); if (spawntodo == 0) { framework->removeTimer(spawntimer); spawntimer = -1; } else { spawndone++; spawntodo--; } } else if (event == SHRINK) { scale = double(spawntodo) / (double)(spawndone + spawntodo); if (spawntodo == 0) { framework->removeTimer(spawntimer); spawntimer = -1; } else { spawndone++; spawntodo--; } } else if (event == ACCELERATE) { } } void Ball::move(int ticks) { Vec3f destination; // determine the minimum desired stepping double time = 1000.0 * 0.05f / std::max(fabs(speed.x), std::max(fabs(speed.y), fabs(speed.z))); // perhaps our system is fast enough to provide more than our minimum desired stepping if (ticks < time) time = ticks; for (int steps = 0; steps < ticks / (int)round(time); steps++) { destination.x = position.x + speed.x * time / 1000.0; destination.y = position.y + speed.y * time / 1000.0; destination.z = position.z + speed.z * time / 1000.0; Collision* collide = framework->detectCol(destination, speed, radius); if (collide == NULL) { position.x = destination.x; position.y = destination.y; position.z = destination.z; } else { position.x = collide->position.x; position.y = collide->position.y; position.z = collide->position.z; speed.x = collide->speed.x; speed.y = collide->speed.y; speed.z = collide->speed.z; delete collide; } } } void Ball::draw() { if (displist == -1) { displist = glGenLists(1); glNewList(displist, GL_COMPILE); GLfloat mat_ambient[] = {0.22610818, 0.10305943, 0.0}; GLfloat mat_diffuse[] = {0.90440222, 0.41225299, 0.0}; GLfloat mat_specular[] = {0.09559777, 0.09559777, 0.09559777}; GLfloat mat_emission[] = {0.0, 0.0, 0.0}; GLfloat mat_shininess = 0.07812619; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emission); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess); if (quad == NULL) { quad = gluNewQuadric(); gluQuadricNormals(quad, GLU_SMOOTH); //gluQuadricTexture(quad, GL_TRUE); } gluSphere(quad, radius, 32, 32); glEndList(); } glPushMatrix(); /* Move to position */ glTranslatef(position.x, position.y, position.z); /* shrink/grow */ glScalef(scale, scale, scale); glCallList(displist); glPopMatrix(); } void Ball::shrink(int ticks) { spawntodo = (int)round(ticks / 25); spawndone = 0; if (spawntimer != -1) { framework->removeTimer(spawntimer); } spawntimer = framework->addTimer(25, SHRINK, this); } void Ball::grow(int ticks) { spawntodo = (int)round(ticks / 25); spawndone = 0; if (spawntimer != -1) {framework->removeTimer(spawntimer); } spawntimer = framework->addTimer(25, GROW, this); } pong2-0.1.3/src/Interface.cpp0000644000175000001440000004031611102253235012646 00000000000000#include #include #include #include #include "Interface.hpp" #include "Framework.hpp" #include "Player.hpp" Interface::Interface(Framework* control) : fontlist(-1), framework(control), ping(""), fps("0 FPS"), roundnum("Round 1"), paused(false), flashtimer(-1) { backTexture = framework->loadTexture("background.png"); charTexture[0] = framework->loadTexture("q1.png"); charTexture[1] = framework->loadTexture("q2.png"); charTexture[2] = framework->loadTexture("q3.png"); charTexture[3] = framework->loadTexture("q4.png"); charTexture[4] = framework->loadTexture("q5.png"); // we need to have the textures at hand first createFont(); //for (int i = 32; i<128; i++) std::cout << (char)i << "\t"; } Interface::~Interface() { if (fontlist != -1) glDeleteLists(fontlist, 96); } void Interface::updateRound(int r) { std::stringstream roundstr; roundstr << "Round " << r+1; roundnum = roundstr.str(); } void Interface::updatePing(double pingtime) { std::stringstream pingstr; pingstr << round(pingtime * 10.0)/10.0 << " ms"; ping = pingstr.str(); } void Interface::updateFPS(double frames) { std::stringstream fpsstr; fpsstr << round(frames * 10.0)/10.0 << " FPS"; fps = fpsstr.str(); } void Interface::updateScore(Side side, int points) { int idx = (side == FRONT ? 0 : 1); std::stringstream pts; pts << points; score[idx] = pts.str(); } void Interface::addMessage(Message msg) { message.push_back(msg); if ((msg == FLASH_GAME_STARTED)||(msg == FLASH_YOU_LOST)||(msg == FLASH_YOU_WIN)) { if (flashtimer != -1) { message.remove(FLASH_GAME_STARTED); message.remove(FLASH_YOU_LOST); message.remove(FLASH_YOU_WIN); framework->removeTimer(flashtimer); } flashalpha = 1.0; flashtimer = framework->addTimer(25, DEFLASH, this); } } void Interface::removeMessage(Message msg) { message.remove(msg); } void Interface::action(Event event) { if (event == DEFLASH) { if (flashalpha > 0.05) flashalpha -= 0.01 + flashalpha*0.02; else { message.remove(FLASH_GAME_STARTED); message.remove(FLASH_YOU_LOST); message.remove(FLASH_YOU_WIN); framework->removeTimer(flashtimer); flashtimer = -1; } } } void Interface::createFont() { char font_data[8][453] = { 0,0,1,0,2,1,2,0,2,1,0,0,0,0,0,1, 0,2,0,1,0,0,0,1,0,0,0,0,0,1,0,2, 1,0,2,2,1,2,2,0,1,0,0,0,0,1,0,0, 0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0, 1,0,0,2,1,2,2,2,2,1,2,2,1,0,2,2, 2,1,2,2,2,2,1,2,0,0,2,1,2,2,2,2, 1,2,2,2,0,1,2,2,2,2,1,2,2,2,2,1, 2,2,2,2,1,0,0,0,1,0,0,0,1,0,0,0, 1,0,0,0,1,0,0,0,1,2,2,2,1,2,2,2, 2,2,2,2,1,2,2,2,2,1,2,2,2,0,1,2, 2,2,1,2,2,2,0,1,2,2,2,2,1,2,2,2, 1,2,2,2,0,1,2,0,0,2,1,0,2,1,0,2, 2,2,1,2,0,0,0,1,2,0,0,1,2,0,0,0, 2,1,2,0,0,0,2,1,2,2,2,2,1,2,2,2, 2,1,2,2,2,2,1,2,2,2,2,1,2,2,2,0, 1,2,2,2,2,2,1,2,0,0,2,1,2,0,0,0, 2,1,2,0,0,0,2,1,2,0,0,2,1,2,0,0, 2,1,2,2,2,1,2,2,2,1,2,0,0,0,1,2, 2,2,1,0,0,2,0,0,1,0,0,0,1,2,0,0, 1,2,2,2,2,1,2,2,2,0,1,2,2,2,1,2, 2,2,0,1,2,2,2,2,1,2,2,2,1,2,2,2, 0,1,2,0,0,2,1,0,2,1,0,2,2,2,1,2, 0,0,0,1,2,0,0,1,2,0,0,0,2,1,2,0, 0,0,2,1,2,2,2,2,1,2,2,2,2,1,2,2, 2,2,1,2,2,2,2,1,2,2,2,0,1,2,2,2, 2,2,1,2,0,0,2,1,2,0,0,0,2,1,2,0, 0,0,2,1,2,0,0,2,1,2,0,0,2,1,2,2, 2,1,0,0,2,2,1,0,2,1,2,2,0,0,1,0, 0,0,0,0,1, 0,0,1,0,2,1,2,0,2,1,0,0,0,0,0,1, 0,2,2,1,2,0,0,1,2,2,2,0,0,1,0,2, 1,2,0,0,1,0,0,2,1,0,0,0,0,1,0,0, 2,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0, 1,0,0,2,1,2,0,0,2,1,0,2,1,0,0,0, 2,1,0,0,0,2,1,2,0,0,2,1,2,0,0,0, 1,2,0,0,0,1,0,0,0,2,1,2,0,0,2,1, 2,0,0,2,1,0,0,0,1,0,0,0,1,0,0,2, 1,0,0,0,1,2,0,0,1,0,0,2,1,2,0,0, 0,0,0,2,1,2,0,0,2,1,2,0,0,2,1,2, 0,0,1,2,0,0,2,1,2,0,0,0,1,2,0,0, 1,2,0,0,0,1,2,0,0,2,1,0,2,1,0,0, 0,2,1,2,0,0,2,1,2,0,0,1,2,2,0,2, 2,1,2,2,0,0,2,1,2,0,0,2,1,2,0,0, 2,1,2,0,0,2,1,2,0,0,2,1,2,0,0,0, 1,0,0,2,0,0,1,2,0,0,2,1,2,0,0,0, 2,1,2,0,0,0,2,1,2,0,0,2,1,2,0,0, 2,1,0,0,2,1,2,0,0,1,2,0,0,0,1,0, 0,2,1,0,2,2,2,0,1,0,0,0,1,2,2,0, 1,2,0,0,2,1,2,0,0,2,1,2,0,0,1,2, 0,0,2,1,2,0,0,0,1,2,0,0,1,2,0,0, 0,1,2,0,0,2,1,0,2,1,0,0,0,2,1,2, 0,0,2,1,2,0,0,1,2,2,0,2,2,1,2,2, 0,0,2,1,2,0,0,2,1,2,0,0,2,1,2,0, 0,2,1,2,0,0,2,1,2,0,0,0,1,0,0,2, 0,0,1,2,0,0,2,1,2,0,0,0,2,1,2,0, 0,0,2,1,2,0,0,2,1,2,0,0,2,1,0,0, 2,1,0,2,0,0,1,0,2,1,0,0,2,0,1,0, 0,0,0,0,1, 0,0,1,0,2,1,0,0,0,1,0,2,0,2,0,1, 2,2,0,1,0,0,2,1,2,0,2,0,0,1,0,0, 1,2,0,0,1,0,0,2,1,2,0,0,2,1,0,0, 2,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0, 1,0,2,2,1,2,0,0,2,1,0,2,1,0,0,0, 2,1,0,0,0,2,1,2,0,0,2,1,2,0,0,0, 1,2,0,0,0,1,0,0,0,2,1,2,0,0,2,1, 2,0,0,2,1,0,2,2,1,0,2,2,1,0,2,2, 1,2,2,2,1,2,2,0,1,0,0,2,1,2,0,2, 2,2,0,2,1,2,0,0,2,1,2,0,0,2,1,2, 0,0,1,2,0,0,2,1,2,0,0,0,1,2,0,0, 1,2,0,0,0,1,2,0,0,2,1,0,2,1,0,0, 0,2,1,2,0,0,2,1,2,0,0,1,2,2,2,2, 2,1,2,2,2,0,2,1,2,0,0,2,1,2,0,0, 2,1,2,0,0,2,1,2,0,0,2,1,2,0,0,0, 1,0,0,2,0,0,1,2,0,0,2,1,2,0,0,0, 2,1,2,0,0,0,2,1,2,0,0,2,1,2,0,0, 2,1,0,0,2,1,2,0,0,1,2,2,0,0,1,0, 0,2,1,2,2,0,2,2,1,0,0,0,1,0,2,2, 1,2,0,0,2,1,2,0,0,2,1,2,0,0,1,2, 0,0,2,1,2,0,0,0,1,2,0,0,1,2,0,0, 0,1,2,0,0,2,1,0,2,1,0,0,0,2,1,2, 0,0,2,1,2,0,0,1,2,2,2,2,2,1,2,2, 2,0,2,1,2,0,0,2,1,2,0,0,2,1,2,0, 0,2,1,2,0,0,2,1,2,0,0,0,1,0,0,2, 0,0,1,2,0,0,2,1,2,0,0,0,2,1,2,0, 0,0,2,1,2,0,0,2,1,2,0,0,2,1,0,0, 2,1,0,2,0,0,1,0,2,1,0,0,2,0,1,0, 0,0,0,0,1, 0,0,1,0,2,1,0,0,0,1,2,2,2,2,2,1, 2,2,2,1,0,2,2,1,2,0,2,0,0,1,0,0, 1,2,0,0,1,0,0,2,1,0,2,2,0,1,2,2, 2,2,2,1,0,0,0,1,2,2,2,2,1,0,0,0, 1,0,2,0,1,2,0,2,2,1,0,2,1,2,2,2, 2,1,0,2,2,2,1,2,2,2,2,1,2,2,2,2, 1,2,2,2,2,1,0,0,2,2,1,2,2,2,2,1, 2,2,2,2,1,0,2,2,1,0,2,2,1,2,2,0, 1,0,0,0,1,0,2,2,1,0,2,2,1,2,0,2, 0,2,0,2,1,2,2,2,2,1,2,2,2,0,1,2, 0,0,1,2,0,0,2,1,2,2,2,0,1,2,2,0, 1,2,0,0,0,1,2,2,2,2,1,0,2,1,0,0, 0,2,1,2,0,0,2,1,2,0,0,1,2,0,2,0, 2,1,2,0,2,2,2,1,2,0,0,2,1,2,2,2, 2,1,2,0,0,2,1,2,2,2,2,1,2,2,2,2, 1,0,0,2,0,0,1,2,0,0,2,1,2,0,0,0, 2,1,2,0,0,0,2,1,0,2,2,0,1,2,0,0, 2,1,0,2,0,1,2,0,0,1,0,2,0,0,1,0, 0,2,1,0,0,0,0,0,1,0,0,0,1,0,0,2, 1,2,2,2,2,1,2,2,2,0,1,2,0,0,1,2, 0,0,2,1,2,2,2,0,1,2,2,0,1,2,0,0, 0,1,2,2,2,2,1,0,2,1,0,0,0,2,1,2, 0,0,2,1,2,0,0,1,2,0,2,0,2,1,2,0, 2,2,2,1,2,0,0,2,1,2,2,2,2,1,2,0, 0,2,1,2,2,2,2,1,2,2,2,2,1,0,0,2, 0,0,1,2,0,0,2,1,2,0,0,0,2,1,2,0, 0,0,2,1,0,2,2,0,1,2,0,0,2,1,0,2, 0,1,2,0,0,0,1,0,2,1,0,0,0,2,1,0, 2,2,0,2,1, 0,0,1,0,2,1,0,0,0,1,0,2,0,2,0,1, 0,2,2,1,2,2,0,1,2,2,2,0,2,1,0,0, 1,2,0,0,1,0,0,2,1,0,2,2,0,1,0,0, 2,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0, 1,0,2,0,1,2,2,0,2,1,0,2,1,2,0,0, 0,1,0,0,0,2,1,0,0,0,2,1,0,0,0,2, 1,2,0,0,2,1,0,0,2,0,1,2,0,0,2,1, 0,0,0,2,1,0,0,0,1,0,0,0,1,2,2,0, 1,2,2,2,1,0,2,2,1,0,2,0,1,2,0,2, 2,2,0,2,1,2,0,0,2,1,2,0,0,2,1,2, 0,0,1,2,0,0,2,1,2,0,0,0,1,2,0,0, 1,2,0,2,2,1,2,0,0,2,1,0,2,1,0,0, 0,2,1,2,2,2,0,1,2,0,0,1,2,0,0,0, 2,1,2,0,0,2,2,1,2,0,0,2,1,2,0,0, 0,1,2,0,0,2,1,2,0,2,0,1,0,0,0,2, 1,0,0,2,0,0,1,2,0,0,2,1,2,0,0,0, 2,1,2,0,2,0,2,1,2,0,0,2,1,2,0,0, 2,1,2,0,0,1,2,0,0,1,0,2,2,0,1,0, 0,2,1,0,0,0,0,0,1,0,0,0,1,0,0,0, 1,2,0,0,2,1,2,0,0,2,1,2,0,0,1,2, 0,0,2,1,2,0,0,0,1,2,0,0,1,2,0,2, 2,1,2,0,0,2,1,0,2,1,0,0,0,2,1,2, 2,2,0,1,2,0,0,1,2,0,0,0,2,1,2,0, 0,2,2,1,2,0,0,2,1,2,0,0,0,1,2,0, 0,2,1,2,0,2,0,1,0,0,0,2,1,0,0,2, 0,0,1,2,0,0,2,1,2,0,0,0,2,1,2,0, 2,0,2,1,2,0,0,2,1,2,0,0,2,1,2,0, 0,1,0,2,0,0,1,0,2,1,0,0,2,0,1,2, 0,2,2,0,1, 0,0,1,0,0,1,0,0,0,1,2,2,2,2,2,1, 2,2,0,1,2,0,0,1,2,0,0,2,0,1,0,0, 1,2,0,0,1,0,0,2,1,2,0,0,2,1,0,0, 2,0,0,1,0,2,2,1,0,0,0,0,1,0,2,2, 1,2,2,0,1,2,0,0,2,1,0,2,1,2,0,0, 0,1,0,0,0,2,1,0,0,0,2,1,0,0,0,2, 1,2,0,0,2,1,0,2,2,0,1,2,0,0,2,1, 0,0,0,2,1,0,2,2,1,0,2,2,1,0,2,2, 1,0,0,0,1,2,2,0,1,0,0,0,1,2,0,0, 0,2,2,2,1,2,0,0,2,1,2,0,0,2,1,2, 0,0,1,2,0,0,2,1,2,0,0,0,1,2,0,0, 1,2,0,0,2,1,2,0,0,2,1,0,2,1,0,0, 0,2,1,2,0,0,2,1,2,0,0,1,2,0,0,0, 2,1,2,0,0,0,2,1,2,0,0,2,1,2,0,0, 0,1,2,0,0,2,1,2,0,2,0,1,0,0,0,2, 1,0,0,2,0,0,1,2,0,0,2,1,2,2,0,2, 2,1,2,2,2,2,2,1,2,0,0,2,1,2,2,2, 2,1,2,0,0,1,2,0,0,1,0,0,2,2,1,0, 0,2,1,0,0,0,0,0,1,0,0,0,1,0,0,0, 1,2,0,0,2,1,2,0,0,2,1,2,0,0,1,2, 0,0,2,1,2,0,0,0,1,2,0,0,1,2,0,0, 2,1,2,0,0,2,1,0,2,1,0,0,0,2,1,2, 0,0,2,1,2,0,0,1,2,0,0,0,2,1,2,0, 0,0,2,1,2,0,0,2,1,2,0,0,0,1,2,0, 0,2,1,2,0,2,0,1,0,0,0,2,1,0,0,2, 0,0,1,2,0,0,2,1,2,2,0,2,2,1,2,2, 2,2,2,1,2,0,0,2,1,2,2,2,2,1,2,0, 0,1,0,2,0,0,1,0,2,1,0,0,2,0,1,0, 0,0,0,0,1, 0,0,1,0,2,1,0,0,0,1,0,2,0,2,0,1, 0,2,0,1,0,0,2,1,2,0,0,2,0,1,0,0, 1,2,0,0,1,0,0,2,1,0,0,0,0,1,0,0, 0,0,0,1,0,2,2,1,0,0,0,0,1,0,2,2, 1,2,0,0,1,2,0,0,2,1,0,2,1,2,0,0, 0,1,0,0,0,2,1,0,0,0,2,1,0,0,0,2, 1,2,0,0,2,1,0,2,0,0,1,2,0,0,2,1, 0,0,0,2,1,0,2,2,1,0,2,2,1,0,0,2, 1,0,0,0,1,2,0,0,1,0,2,0,1,0,2,2, 0,0,0,0,1,2,0,0,2,1,2,0,0,2,1,2, 0,0,1,2,0,0,2,1,2,0,0,0,1,2,0,0, 1,2,0,0,2,1,2,0,0,2,1,0,2,1,0,0, 0,2,1,2,0,0,2,1,2,0,0,1,2,0,0,0, 2,1,2,0,0,0,2,1,2,0,0,2,1,2,0,0, 0,1,2,2,2,0,1,2,0,0,2,1,0,0,0,2, 1,0,0,2,0,0,1,2,0,0,2,1,0,2,2,2, 0,1,2,2,0,2,2,1,2,0,0,2,1,0,0,0, 2,1,2,0,0,1,2,0,0,1,0,0,2,2,1,0, 0,2,1,0,0,0,0,0,1,0,0,0,1,0,0,0, 1,2,0,0,2,1,2,0,0,2,1,2,0,0,1,2, 0,0,2,1,2,0,0,0,1,2,0,0,1,2,0,0, 2,1,2,0,0,2,1,0,2,1,0,0,0,2,1,2, 0,0,2,1,2,0,0,1,2,0,0,0,2,1,2,0, 0,0,2,1,2,0,0,2,1,2,0,0,0,1,2,2, 2,0,1,2,0,0,2,1,0,0,0,2,1,0,0,2, 0,0,1,2,0,0,2,1,0,2,2,2,0,1,2,2, 0,2,2,1,2,0,0,2,1,0,0,0,2,1,2,0, 0,1,0,2,0,0,1,0,2,1,0,0,2,0,1,0, 0,0,0,0,1, 0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,1, 0,0,0,1,0,0,0,1,2,2,2,0,2,1,0,0, 1,0,2,2,1,2,2,0,1,0,0,0,0,1,0,0, 0,0,0,1,2,0,0,1,0,0,0,0,1,0,0,0, 1,2,0,0,1,2,2,2,2,1,0,2,1,2,2,2, 2,1,2,2,2,2,1,0,0,0,2,1,0,2,2,2, 1,2,2,2,2,1,0,2,0,0,1,2,2,2,2,1, 0,0,0,2,1,0,0,0,1,2,2,0,1,0,0,0, 1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0, 0,0,0,0,1,2,0,0,2,1,2,2,2,0,1,2, 2,2,1,2,2,2,0,1,2,2,2,2,1,2,0,0, 1,2,2,2,2,1,2,0,0,2,1,0,2,1,2,2, 2,0,1,2,0,0,2,1,2,2,2,1,2,0,0,0, 2,1,2,0,0,0,2,1,2,2,2,2,1,2,0,0, 0,1,0,0,0,2,1,2,0,0,2,1,2,2,2,2, 1,0,0,2,0,0,1,2,2,2,2,1,0,0,2,0, 0,1,2,0,0,0,2,1,2,0,0,2,1,0,2,2, 2,1,2,2,2,1,2,2,2,1,0,0,0,2,1,2, 2,2,1,0,0,0,0,0,1,2,2,2,1,0,0,0, 1,2,0,0,2,1,2,2,2,0,1,2,2,2,1,2, 2,2,0,1,2,2,2,2,1,2,0,0,1,2,2,2, 2,1,2,0,0,2,1,0,2,1,2,2,2,0,1,2, 0,0,2,1,2,2,2,1,2,0,0,0,2,1,2,0, 0,0,2,1,2,2,2,2,1,2,0,0,0,1,0,0, 0,2,1,2,0,0,2,1,2,2,2,2,1,0,0,2, 0,0,1,2,2,2,2,1,0,0,2,0,0,1,2,0, 0,0,2,1,2,0,0,2,1,0,2,2,2,1,2,2, 2,1,0,0,2,2,1,0,2,1,2,2,0,0,1,0, 0,0,0,0,1 }; GLuint texture[8] = { charTexture[1], charTexture[2], charTexture[3], charTexture[4], charTexture[3], charTexture[2], charTexture[1], charTexture[0], }; double glw = 1.0; double glh = -1.0; int x = 0, z, w, h; fontlist = glGenLists(96); for (int i = 0; i < 96; i++) { z = x; while (font_data[0][x] != 1) x++; x++; character[i].width = x - z - 1; for (w = 0; w < character[i].width; w++) for (h = 0; h < 8; h++) character[i].bitmap[w][h] = font_data[h][z + w]; glNewList(fontlist + i, GL_COMPILE); for (w = 0; w < character[i].width; w++) for (h = 0; h < 8; h++) { if (character[i].bitmap[w][h] == 2) { glBindTexture(GL_TEXTURE_2D, texture[h]); glBegin(GL_QUADS); glTexCoord2f(1.0f, 1.0f); glVertex3f(glw * (double)(w+1), glh * (double)h , 0.0); glTexCoord2f(1.0f, 0.0f); glVertex3f(glw * (double)w , glh * (double)h , 0.0); glTexCoord2f(0.0f, 0.0f); glVertex3f(glw * (double)w , glh * (double)(h+1), 0.0); glTexCoord2f(0.0f, 1.0f); glVertex3f(glw * (double)(w+1), glh * (double)(h+1), 0.0); glEnd(); } } glTranslatef(glw * (character[i].width + 1), 0, 0); glEndList(); } } void Interface::beginDraw() { glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glEnable(GL_TEXTURE_2D); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0, 400, 0, 300, -1, 1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); } void Interface::endDraw() { glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); glDisable(GL_TEXTURE_2D); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); } void Interface::drawText(const std::string& text) { glListBase(fontlist - 32); glCallLists(text.length(), GL_UNSIGNED_BYTE, text.c_str()); } double Interface::textWidth(const std::string& text) { float width = 0.0; for (int i = 0; i < text.size(); i++) { width += character[text[i] - 32].width + 1.0; } return std::max(width - 1.0, 0.0); } void Interface::drawBackground(bool cruel) { beginDraw(); // this is dirty, but it looks cruel :) if (cruel) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE); } glBindTexture(GL_TEXTURE_2D, backTexture); glColor3f(1.0, 1.0, 1.0); glBegin(GL_QUADS); glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0,0.0,0.0); glTexCoord2f(1.0f, 1.0f); glVertex3f(400.0,0.0,0.0); glTexCoord2f(1.0f, 0.0f); glVertex3f(400.0,300.0,0.0); glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0,300.0,0.0); glEnd(); endDraw(); } void Interface::drawRound() { beginDraw(); glColor3f(1.0, 1.0, 1.0); glTranslatef(200.0 - textWidth(roundnum)/2.0 * 2.0, 300.0 - 2.0, 0); glScalef(2.0, 2.0, 2.0); drawText(roundnum); endDraw(); } void Interface::drawFPS() { beginDraw(); glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE); glColor4f(0.5, 1.0, 1.0, 0.75f); // the font has a height of 8 glTranslatef(2.0, 10.0, 0); glScalef(1.0, 1.0, 1.0); drawText(fps); glLoadIdentity(); glTranslatef(2.0, 20.0, 0); drawText(ping); glDisable(GL_BLEND); endDraw(); } void Interface::drawScore() { const std::vector& player = framework->getPlayers(); beginDraw(); for(int i = 0; i < 2; i++) { if (i == 0) { glColor3f(0.5, 1.0, 0.5); } else { glColor3f(1.0, 0.5, 0.5); } int namecount = 0; for (int j = 0; j < player.size(); ++j) { if (player[j]->getSide() == (i == 0 ? FRONT : BACK)) { const char* name = player[j]->getName().c_str(); glLoadIdentity(); if (i == 0) { glTranslatef(2.0, 0, 0); } else { glTranslatef(400.0 - textWidth(name)*2.0 - 2.0, 0, 0); } glTranslatef(0, 300.0 - 2.0 - 18.0 * namecount, 0); glScalef(2.0, 2.0, 2.0); drawText(name); namecount++; } } glLoadIdentity(); if (i == 0) { glTranslatef(2.0, 0, 0); } else { glTranslatef(400.0 - textWidth(score[i])*5.0 - 2.0, 0, 0); } glTranslatef(0, 300.0 - 2.0 - 18.0 * namecount, 0); glScalef(5.0, 5.0, 5.0); drawText(score[i]); } endDraw(); } void Interface::drawMessages() { beginDraw(); for (std::list::iterator it = message.begin(); it != message.end(); it++) { switch (*it) { case YOU_SERVE: glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE); glColor4f(0.5, 0.5, 1.0, 0.65); glTranslatef(200.0 - textWidth("")/2.0 * 6.0, 150.0 + 4.0 * 6.0, 0); glScalef(6.0, 6.0, 6.0); drawText(""); glLoadIdentity(); glColor4f(1.0, 1.0, 1.0, 0.5); glTranslatef(200.0 - textWidth("Press the left mouse button to serve the ball.")/2.0 * 0.8, 10.0, 0); glScalef(0.8, 0.8, 0.8); drawText("Press the left mouse button to serve the ball."); glDisable(GL_BLEND); break; case CONNECTING: glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE); glColor4f(0.5, 0.5, 1.0, 0.65); glTranslatef(200.0 - textWidth("")/2.0 * 6.0, 150.0 + 4.0 * 6.0, 0); glScalef(6.0, 6.0, 6.0); drawText(""); glLoadIdentity(); glColor4f(1.0, 1.0, 1.0, 0.5); glTranslatef(200.0 - textWidth("Please make sure a server is running.")/2.0 * 0.8, 10.0, 0); glScalef(0.8, 0.8, 0.8); drawText("Please make sure a server is running."); glDisable(GL_BLEND); break; case WAITING_FOR_OPPONENT: glEnable(GL_BLEND); glBlendFunc(GL_SRC_COLOR, GL_ONE); glColor4f(0.5, 0.5, 1.0, 0.5); glTranslatef(200.0 - textWidth("")/2.0 * 2.0, 250.0 + 4.0 * 2.0, 0); glScalef(2.0, 2.0, 2.0); drawText(""); glDisable(GL_BLEND); break; case FLASH_GAME_STARTED: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1.0, 1.0, 0.5, flashalpha); glTranslatef(200.0 - textWidth("")/2.0 * 4.0, 200.0 + 4.0 * 4.0, 0); glScalef(4.0, 4.0, 4.0); drawText(""); glDisable(GL_BLEND); break; case FLASH_YOU_LOST: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1.0, 0.5, 0.0, flashalpha); glTranslatef(200.0 - textWidth("): YOU LOST :(")/2.0 * 4.0, 200.0 + 4.0 * 4.0, 0); glScalef(4.0, 4.0, 4.0); drawText("): YOU LOST :("); glDisable(GL_BLEND); break; case FLASH_YOU_WIN: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(0.5, 1.0, 0.0, flashalpha); glTranslatef(200.0 - textWidth("(: YOU WIN :)")/2.0 * 4.0, 200.0 + 4.0 * 4.0, 0); glScalef(4.0, 4.0, 4.0); drawText("(: YOU WIN :)"); glDisable(GL_BLEND); break; } glLoadIdentity(); } if (paused) { glColor4f(1.0, 1.0, 1.0, 1.0); glTranslatef(200.0 - textWidth("* PAUSED *")/2.0 * 8.0, 150.0 + 4.0 * 8.0, 0); glScalef(8.0, 8.0, 8.0); drawText("* PAUSED *"); } endDraw(); } pong2-0.1.3/src/Buffer.hpp0000644000175000001440000000550410474143514012175 00000000000000#ifndef BUFFER_H #define BUFFER_H #include "stuff.hpp" #include #include "grapple/grapple.h" //! the type of a network packet enum PacketType { //! client or server responding ready for the game READY, //! clients annulating ready state UNREADY, //! requesting paused state PAUSE_REQUEST, //! requesting non-paused state RESUME_REQUEST, //! server telling the ball's position BALLPOSITION, //! server telling a paddle's position PADDLEPOSITION, //! client requesting paddle movement PADDLEMOVE, //! server reporting a score SCORE, //! server telling the actual round ROUND, //! demanding and reporting the ball to be served SERVE_BALL }; //! Used to manage any incoming packet or create an outgoing packet class Buffer { public: //! default constructor for an outgoing packet Buffer(); //! constructor with type for an outgoing packet /*! \param t the type of the packet we want to send */ Buffer(PacketType t); //! constructor for an incoming packet /*! store the packet's data in the Buffer to have easy access \param content the data itself \param bytes the data's size */ Buffer(char* content, int bytes); //! destructor cleaning up if the Buffer holds it's own memory field ~Buffer(); //! set the packet's type /*! \param t the type of the packet we want to send */ void setType(PacketType t); //! add an integer value to the packet /*! \param value the value itself */ void pushInt(int value); //! add a double value to the packet /*! \param value the value itself */ void pushDouble(double value); void pushId(grapple_user value); //! add a Side value to the packet /*! \param value the value itself */ void pushSide(Side value); //! add a variable sized string to the packet /*! This is only possible at the end of a packet. \param str the string */ void pushString(const std::string& str); //! collect an integer value from the packet /*! \result the value itself */ int popInt(); //! collect a double value from the packet /*! \result the value itself */ double popDouble(); grapple_user popId(); //! collect a Side value from the packet /*! \result the value itself */ Side popSide(); //! collect a string from the packet /*! The length is determined by the remaining data size \result the value itself */ std::string popString(); //! return the actually stored type, used for incoming packages inline PacketType getType() { return type; } //! return the data, used for outgoing packages inline char* getData() { return data; } //! return the data size, used for outgoing packages inline int getSize() { return size; } private: //! wether we need to free the memory or it was allocated outside bool freemem; //! pointer to the data char* data; //! the data field size int size; //! actual position in the data field int pos; //! the packet type PacketType type; }; #endif pong2-0.1.3/src/Framework.hpp0000644000175000001440000001604710474143514012725 00000000000000#ifndef FRAMEWORK_H #define FRAMEWORK_H #include #include #include #include #include "SDL.h" #include #include "grapple/grapple.h" #include "stuff.hpp" #include "Interface.hpp" #include "Field.hpp" #include "Ball.hpp" #include "Player.hpp" #include "Camera.hpp" #include "Buffer.hpp" class Ball; class Player; //! Framework provides the functionality of underlying libraries /*! Both Server and Client are derived from Framework to have the necessary functionality handy and also to be called through pure virtual functions by the Framework code. Whenever the user presses a button, the Server has to do other stuff with it than the Client. */ class Framework { public: //! holds a timer call struct TimerData { //! the event descriptor EventReceiver::Event event; //! the receiving object who demanded the timer EventReceiver* receiver; //! the timer itself provided by the SDL SDL_TimerID timer; }; struct Peer { std::string name; Player* player; bool ready; inline Peer(std::string id) : name(id), player(NULL), ready(false) {} // needed by std::map, do not use inline Peer() {} }; //! holds the actual networking state enum Networkstate { //! initialization isn't finished yet UNINITIALIZED, //! the server is waiting for a client to arrive WAITING, //! the client tries to connect to a server CONNECTING, //! server & client are exchanging data TRANSMITTING_DATA, //! a networked game is running RUNNING } state; //! shutdown the game /*! This will push a quit event and is called whenever we want to exit cleanly. We need to exit that way because using exit() wouldn't call destructors, therefore the opposite player wouldn't get told about quitting. */ void shutdown(); //! the constructor, called by Server or Client /*! \param surf pointer to the SDL video surface created in main.cpp \param conf a Configuration structure created in main.cpp and filled with configuration from the commandline \param initial the desired initial networking state, actually WAITING from the Server, CONNECTING from the Client */ Framework(void *surf, const Configuration& conf, Networkstate initial); //! the destructor only frees left SDL timers and the TimerData structures ~Framework(); //! load a texture into OpenGL /*! \param filename the file containing the texture (has to be readable by SDL_image) \result the number given to the texture for further binding */ GLuint loadTexture(const std::string& filename); //! test for collisions of a ball against the world /*! \param position the position to test for \param speed the speed of the ball flying \param radius the ball's radius \result pointer to a Collision structure which provides the according data */ Collision* detectCol(const Vec3f& position, const Vec3f& speed, double radius); //! test for something in the way, paddle movement /*! only tests for one direction (x or y axis) at once \param dest where the paddle wants to go to \param direction the according direction \param side wether the paddle is in the FRONT or in the BACK \result how far the paddle can go without crossing a barriere */ double detectBarrier(double dest, int direction, Side side); //! add a timer (in fact SDL timer) /*! \param intervall the intervall in ticks (ms) of the wanted timer \param event the event the timer should trigger \param receiver pointer to the receiving object \result the timer's number needed later to remove the timer */ int addTimer(unsigned int intervall, EventReceiver::Event event, EventReceiver* receiver); //! remove a previously added timer by it's index /*! \param index the timer's number which was given by addTimer() */ void removeTimer(int index); inline const std::vector& getPlayers() { return player; } protected: //! enter the event loop, which indefinitely runs and processes events void loop(); //! set/unset pause state /*! In pause mode, the mouse & keyboard input isn't grabbed and the game can't go on. Pause mode is shared between Server and Client. \param pause wether to pause (true) or resume (false) - ignored if external is false \param external wether this was triggered by network or locally */ void togglePause(bool pause, bool external); virtual void ping()=0; //! process message queue, send periodical packages, called by loop() virtual void doNetworking()=0; virtual void sendPacket(Buffer& data, bool reliable)=0; void sendSimplePacket(PacketType t); //! our Camera object setting up the viewport Camera camera; //! our Interface object responsible for UI/HUD output Interface output; //! the playing field, 4 walls Field field; //! vector holding all involved balls. /*! Up till now we have only one ball. */ std::vector ball; //! vector holding all involved players (with their paddles). /*! Up till now we have only two players. If noone is connected as client, the server provides the famous "Mr. Wand" called opponent. Better not try to beat him! */ std::vector player; std::map peer; grapple_user localid; //! pause state /*! Is 0 if not paused and otherwise holds the ticks (ms) which need to be processed after the pause. */ unsigned int paused; private: //! initialize GL void resetGL(); //! draw the whole scene; called by loop() on every frame void drawScene(); //! processe a pressed key, called by loop() void handleKeyPress(SDL_keysym *keysym); //! processe mouse movement, called by loop() /*! the button's state determines which action to take \param x relative movement, X axis \param y relative movement, Y axis \param buttons bitfield containing the buttons actually pressed */ void handleMouseMove(int x, int y, unsigned char buttons); //! move the paddle, called by handleMouseMove() virtual void movePaddle(double x, double y, unsigned int time)=0; //! update the game per frame, therefore called by loop() virtual void updateGame(int ticks)=0; //! process an occured score (the ball went out of the field), called by detectCol() virtual void doScore(Side side)=0; //! serve the ball, i.e. the player wants to kick it off, called by loop() virtual void serveBall()=0; /*! the SDL video surface */ SDL_Surface *surface; //! vector holding the TimerData structures; they have to be held to remove timers and free them std::vector timerdata; //! the minimum stepping in ticks (ms) - can be used to achieve a fps maximum setting unsigned int timeunit; //! time in ticks (ms) of the latest frame unsigned int lasttime; //! frames we did since the last fps calculation unsigned int frames; //! ticks (ms) since the last fps calculation unsigned int xdiff; }; //! function given to every created timer to process it /*! SDL needs a C function to call when the timer has finished one intervall. This one runs in another thread. so it pushes an event providing the necessary data to the SDL event queue. This event will be processed by loop(), inside of the Framework :) */ unsigned int processTimer(unsigned int intervall, void* data); #endif pong2-0.1.3/src/Field.cpp0000644000175000001440000000733411102253172011774 00000000000000#include "Field.hpp" #include #include #include "Framework.hpp" Field::Field(Framework *control) : framework(control), displist(-1), width(4.0), height(4.0), length(8.0) { wallTexture = framework->loadTexture("wall.png"); } Collision* Field::detectCol(const Vec3f& position, const Vec3f& speed, double radius) { Collision *col = NULL; // first we make the "simple" z coord test if (fabs(position.z) - radius > fabs(length/2.0)) return col; // second we test against the planes // LEFT / RIGHT double sign = (speed.x < 0 ? -1.0 : 1.0); if (fabs(position.x) + radius >= width/2.0) { // we could extend here with a test of the according circle against the rectangular col = new Collision; col->position.y = position.y; col->position.z = position.z; col->speed.y = speed.y; col->speed.z = speed.z; col->position.x = (width/2.0 - radius) * sign; col->speed.x = -speed.x; } // TOP / BOTTOM sign = (speed.y < 0 ? -1.0 : 1.0); if (fabs(position.y) + radius >= height/2.0) { // we could extend here with a test of the according circle against the rectangular if (col == NULL) { col = new Collision; col->position.x = position.x; col->position.z = position.z; col->speed.x = speed.x; col->speed.z = speed.z; } col->position.y = (height/2.0 - radius) * sign; col->speed.y = -speed.y; } return col; } Side Field::zOutside(double z) { if (z < -length/2.0 - 1.0) return BACK; if (z > length/2.0 + 1.0) return FRONT; return NONE; } void Field::draw() { /* GLfloat mat_ambient[] = {1.0, 1.0, 1.0}; GLfloat mat_diffuse[] = {0.68456549, 0.68319218, 0.68613717}; GLfloat mat_specular[] = {0.33476005, 0.33355458, 0.39387350}; GLfloat mat_emission[] = {0.0, 0.0, 0.0}; GLfloat mat_shininess = 0.07142748; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emission); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);*/ if (displist == -1) { displist = glGenLists(1); glNewList(displist, GL_COMPILE); glBindTexture(GL_TEXTURE_2D, wallTexture); glBegin(GL_QUADS); // bottom glNormal3f(0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( width/2.0f, -height/2.0f, -length/2.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-width/2.0f, -height/2.0f, -length/2.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-width/2.0f, -height/2.0f, length/2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( width/2.0f, -height/2.0f, length/2.0f); // top glNormal3f(0.0f,-1.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( width/2.0f, height/2.0f, -length/2.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-width/2.0f, height/2.0f, -length/2.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-width/2.0f, height/2.0f, length/2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( width/2.0f, height/2.0f, length/2.0f); // left glNormal3f(1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-width/2.0f, height/2.0f, -length/2.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-width/2.0f, -height/2.0f, -length/2.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-width/2.0f, -height/2.0f, length/2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-width/2.0f, height/2.0f, length/2.0f); // right glNormal3f(-1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( width/2.0f, height/2.0f, -length/2.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( width/2.0f, -height/2.0f, -length/2.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( width/2.0f, -height/2.0f, length/2.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( width/2.0f, height/2.0f, length/2.0f); glEnd(); glEndList(); } glCallList(displist); } pong2-0.1.3/src/grapple/0000777000175000001440000000000011103714317011760 500000000000000pong2-0.1.3/src/grapple/grapple_group.c0000644000175000001440000003564410473646146014737 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include #include "grapple_group.h" #include "grapple_structs.h" //Allocate the memory for a group container. This is what sits in a group, //one each per member of the group. //When allocating, set the ID of the container user grapple_group_container *group_container_aquire(int id) { grapple_group_container *container; container=(grapple_group_container *)calloc(1,sizeof(grapple_group_container)); container->id=id; return container; } //Free the container memory static int group_container_dispose(grapple_group_container *item) { free(item); return 0; } //Link a group into a list of groups static internal_grapple_group *group_link(internal_grapple_group *list, internal_grapple_group *item) { if (!list) { item->next=item; item->prev=item; return item; } item->next=list; item->prev=list->prev; item->next->prev=item; item->prev->next=item; return list; } //Unlink a group from a list of groups internal_grapple_group *group_unlink(internal_grapple_group *list, internal_grapple_group *item) { if (list->next==list) { return NULL; } item->next->prev=item->prev; item->prev->next=item->next; if (item==list) list=item->next; return list; } //Link a group container into a list of group containers grapple_group_container *group_container_link(grapple_group_container *list, grapple_group_container *item) { if (!list) { item->next=item; item->prev=item; return item; } item->next=list; item->prev=list->prev; item->next->prev=item; item->prev->next=item; return list; } //Unlink a group container from a list of group containers static grapple_group_container *group_container_unlink(grapple_group_container *list, grapple_group_container *item) { if (list->next==list) { return NULL; } item->next->prev=item->prev; item->prev->next=item->next; if (item==list) list=item->next; return list; } //Allocate the memory for the group structure, and assign it a groupID static internal_grapple_group *group_aquire(int id) { internal_grapple_group *group; group=(internal_grapple_group *)calloc(1,sizeof(internal_grapple_group)); group->id=id; return group; } //Free all memory associated with a group, including all subcontainers int group_dispose(internal_grapple_group *group) { grapple_group_container *target; while (group->contents) { target=group->contents; group->contents=group_container_unlink(group->contents, group->contents); group_container_dispose(target); } if (group->name) free(group->name); free(group); return 0; } //Locate a group by its ID number from a list internal_grapple_group *group_locate(internal_grapple_group *list, int id) { internal_grapple_group *scan; scan=list; while (scan) { if (scan->id == id) //It is the correct one return scan; scan=scan->next; if (scan==list) scan=NULL; } return NULL; } //Find the container holding a specific user ID in a group static grapple_group_container *group_locate_id_in_group(internal_grapple_group *group,int id) { grapple_group_container *scan; scan=group->contents; while (scan) { if (scan->id == id) //It matches return scan; scan=scan->next; if (scan==group->contents) scan=NULL; } return NULL; } //Create a group for a client int create_client_group(internal_client_data *client,int id,const char *name) { internal_grapple_group *group; group=group_aquire(id); //Assign the name group->name=(char *)malloc(strlen(name)+1); strcpy(group->name,name); pthread_mutex_lock(&client->group_mutex); //Link it in client->groups=group_link(client->groups,group); pthread_mutex_unlock(&client->group_mutex); return 0; } //Create a group for the server int create_server_group(internal_server_data *server,int id,const char *name) { internal_grapple_group *group; group=group_aquire(id); //Allocate the name group->name=(char *)malloc(strlen(name)+1); strcpy(group->name,name); pthread_mutex_lock(&server->group_mutex); server->groups=group_link(server->groups,group); pthread_mutex_unlock(&server->group_mutex); return 0; } //Add a user or another group to a group int client_group_add(internal_client_data *client,int groupid,int add) { internal_grapple_group *group; grapple_group_container *item; pthread_mutex_lock(&client->group_mutex); //Find the group by its ID group=group_locate(client->groups,groupid); if (!group) { //No such group pthread_mutex_unlock(&client->group_mutex); return 0; } //We have the group, now see if this target is already in the group item=group_locate_id_in_group(group,add); if (item) { //It is pthread_mutex_unlock(&client->group_mutex); return 0; } //Add the new container into the group item=group_container_aquire(add); group->contents=group_container_link(group->contents,item); pthread_mutex_unlock(&client->group_mutex); return 1; } //Add a member to a group on the server int server_group_add(internal_server_data *server,int groupid,int add) { internal_grapple_group *group; grapple_group_container *item; pthread_mutex_lock(&server->group_mutex); //Find the group group=group_locate(server->groups,groupid); if (!group) { pthread_mutex_unlock(&server->group_mutex); return 0; } //We have the group, now see if this target is already in the group item=group_locate_id_in_group(group,add); if (item) { pthread_mutex_unlock(&server->group_mutex); return 0; } item=group_container_aquire(add); //Now add it to the group group->contents=group_container_link(group->contents,item); pthread_mutex_unlock(&server->group_mutex); return 1; } //Remove a user from a group on the client int client_group_remove(internal_client_data *client,int groupid,int removeid) { internal_grapple_group *group; grapple_group_container *item; pthread_mutex_lock(&client->group_mutex); //Find the group group=group_locate(client->groups,groupid); if (!group) { pthread_mutex_unlock(&client->group_mutex); return 0; } //We have the group, now see if this target is still in the group item=group_locate_id_in_group(group,removeid); if (!item) { //Its already gone pthread_mutex_unlock(&client->group_mutex); return 0; } //Remove from the group group->contents=group_container_unlink(group->contents,item); pthread_mutex_unlock(&client->group_mutex); group_container_dispose(item); return 1; } //Remove a member of a group on the server int server_group_remove(internal_server_data *server,int groupid,int removeid) { internal_grapple_group *group; grapple_group_container *item; pthread_mutex_lock(&server->group_mutex); //Find the group group=group_locate(server->groups,groupid); if (!group) { pthread_mutex_unlock(&server->group_mutex); return 0; } //We have the group, now see if this target is still in the group item=group_locate_id_in_group(group,removeid); if (!item) { //Already gone pthread_mutex_unlock(&server->group_mutex); return 0; } //Remove it from the group group->contents=group_container_unlink(group->contents,item); pthread_mutex_unlock(&server->group_mutex); group_container_dispose(item); return 1; } //Delete a whole group from the client int delete_client_group(internal_client_data *client,int id) { internal_grapple_group *group; pthread_mutex_lock(&client->group_mutex); //Find the group group=group_locate(client->groups,id); if (!group) { pthread_mutex_unlock(&client->group_mutex); return 0; } //Unlink it client->groups=group_unlink(client->groups,group); pthread_mutex_unlock(&client->group_mutex); //Delete it group_dispose(group); return 1; } //Delete a group from the server int delete_server_group(internal_server_data *server,int id) { internal_grapple_group *group; pthread_mutex_lock(&server->group_mutex); //Locate the group group=group_locate(server->groups,id); if (!group) { pthread_mutex_unlock(&server->group_mutex); return 0; } //Unlink it server->groups=group_unlink(server->groups,group); pthread_mutex_unlock(&server->group_mutex); //Delete it group_dispose(group); return 1; } //This function locates a member of an unpack array. An unpack array is //an integer array in numerical order. static int group_unpack_locate(int *data,int *size,int id) { int max,min,mid; if (*size==0) return 0; max=(*size)-1; min=0; //Binary search while (min<=max) { mid=(min+max)/2; if (data[mid]>id) max=mid-1; else if (data[mid] data[(*size)-1]) mid=(*size); else { max=(*size)-1; min=0; mid=0; while (minid) max=mid-1; else if (data[mid] 0 && data[mid-1]>id) { mid--; } if (mid!=(*size)) { //Memmove just seems very very broken, gives completely bad values //in this instance, so do it the slow way. Shouldnt be too slow //groups arent likely to get that big anyway for (loopa=(*size-1);loopa>=mid;loopa--) data[loopa+1]=data[loopa]; } data[mid]=id; //Incriment the size (*size)++; return data; } //Unpack a group. Recursively burrow down into subgroups. Put all the //data into an int* array, and return the size of that array as //the int *size passed in here static int *server_group_unpack(internal_server_data *server, internal_grapple_group *group, int *data,int *maxsize,int *size) { grapple_group_container *scan; internal_grapple_group *newgroup; pthread_mutex_lock(&server->group_mutex); scan=group->contents; while (scan) { //Loop through each container in the group if (!group_unpack_locate(data,size,scan->id)) { //This isnt already in the group //Insert it into the group data=group_unpack_insert(data,maxsize,size,scan->id); //Test if this is a group itself newgroup=group_locate(server->groups,scan->id); if (newgroup) //It is, recursively call this function data=server_group_unpack(server,newgroup,data,maxsize,size); } scan=scan->next; if (scan==group->contents) scan=NULL; } pthread_mutex_unlock(&server->group_mutex); return data; } //function that the server calls to expand a group and return an int* array //of members. The size of the aray is returned in the size int* that is //passed in int *server_group_unroll(internal_server_data *server,int groupid) { static int targetmaxsize=100; int maxsize; int *returnval; int size; internal_grapple_group *group; maxsize=targetmaxsize; //now find the group, and then unroll it pthread_mutex_lock(&server->group_mutex); group=group_locate(server->groups,groupid); if (!group) { pthread_mutex_unlock(&server->group_mutex); return NULL; } size=0; returnval=(int *)malloc(maxsize * sizeof (int)); returnval=server_group_unpack(server,group,returnval,&maxsize,&size); pthread_mutex_unlock(&server->group_mutex); if (maxsize == size) { maxsize *= 2; returnval=(int *)realloc(returnval,maxsize); } returnval[size]=0; if (maxsize>targetmaxsize) targetmaxsize=maxsize; return returnval; } //Unpack a group. Recursively burrow down into subgroups. Put all the //data into an int* array, and return the size of that array as //the int *size passed in here static int *client_group_unpack(internal_client_data *client, internal_grapple_group *group, int *data,int *maxsize,int *size) { grapple_group_container *scan; internal_grapple_group *newgroup; pthread_mutex_lock(&client->group_mutex); scan=group->contents; while (scan) { //Loop through each container in the group if (!group_unpack_locate(data,size,scan->id)) { //This isnt already in the group //Insert it into the group data=group_unpack_insert(data,maxsize,size,scan->id); //Test if this is a group itself newgroup=group_locate(client->groups,scan->id); if (newgroup) //It is, recursively call this function data=client_group_unpack(client,newgroup,data,maxsize,size); } scan=scan->next; if (scan==group->contents) scan=NULL; } pthread_mutex_unlock(&client->group_mutex); return data; } //function that the client calls to expand a group and return an int* array //of members. The size of the aray is returned in the size int* that is //passed in int *client_group_unroll(internal_client_data *client,int groupid) { static int targetmaxsize=100; int maxsize; int *returnval; internal_grapple_group *group; int size; maxsize=targetmaxsize; //now find the group, and then unroll it pthread_mutex_lock(&client->group_mutex); group=group_locate(client->groups,groupid); if (!group) { pthread_mutex_unlock(&client->group_mutex); return NULL; } size=0; returnval=(int *)malloc(maxsize * sizeof (int)); returnval=client_group_unpack(client,group,returnval,&maxsize,&size); pthread_mutex_unlock(&client->group_mutex); if (maxsize == size) { maxsize *= 2; returnval=(int *)realloc(returnval,maxsize); } returnval[size]=0; if (maxsize > targetmaxsize) targetmaxsize=maxsize; return returnval; } pong2-0.1.3/src/grapple/grapple_lobbyclient_thread.h0000644000175000001440000000213410473646146017431 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_LOBBYCLIENT_THREAD_H #define GRAPPLE_LOBBYCLIENT_THREAD_H extern void *grapple_lobbyclient_serverthread_main(void *); extern void *grapple_lobbyclient_clientthread_main(void *); #endif pong2-0.1.3/src/grapple/dynstring.h0000644000175000001440000000374510473646146014114 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef DYNSTRING_H #define DYNSTRING_H typedef struct { char *buf; int len; int maxlen; } dynstring; typedef struct { unsigned char *buf; int len; int maxlen; } udynstring; typedef struct { signed char *buf; int len; int maxlen; } sdynstring; extern void dynstringCheckAvailableLength(dynstring *,int); extern dynstring *dynstringInit(int); extern void dynstringAppend(dynstring *,const char *); extern void dynstringUninit(dynstring *); extern void dynstringRawappend(dynstring *,const char *,size_t); extern void dynstringUCheckAvailableLength(udynstring *,int); extern udynstring *dynstringUInit(int); extern void dynstringUAppend(udynstring *,const unsigned char *); extern void dynstringUUninit(udynstring *); extern void dynstringURawappend(udynstring *,const unsigned char *,size_t); extern void dynstringSCheckAvailableLength(sdynstring *,int); extern sdynstring *dynstringSInit(int); extern void dynstringSAppend(sdynstring *,const signed char *); extern void dynstringSUninit(sdynstring *); extern void dynstringSRawappend(sdynstring *,const signed char *,size_t); #endif pong2-0.1.3/src/grapple/grapple_lobby.c0000644000175000001440000006440510473646146014707 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #define _XOPEN_SOURCE 500 #include #include #include #include #include "grapple_lobby.h" #include "grapple_lobby_internal.h" #include "grapple_defines.h" #include "grapple_error.h" #include "grapple_server.h" #include "grapple_lobbyconnection.h" #include "grapple_lobbymessage.h" #include "grapple_lobbygame.h" /************************************************************************** ** The functions in this file are generally those that are accessible ** ** to the end user. Obvious exceptions are those that are static which ** ** are just internal utilities. ** ** Care should be taken to not change the parameters of outward facing ** ** functions unless absolutely required ** **************************************************************************/ //This is a static variable which keeps track of the list of all lobbys //run by this program. The lobbys are kept in a linked list. This variable //is global to this file only. static internal_lobby_data *grapple_lobby_head=NULL; //Link a lobby to the list static int internal_lobby_link(internal_lobby_data *data) { if (!grapple_lobby_head) { grapple_lobby_head=data; data->next=data; data->prev=data; return 1; } data->next=grapple_lobby_head; data->prev=grapple_lobby_head->prev; data->next->prev=data; data->prev->next=data; grapple_lobby_head=data; return 1; } //Remove a lobby from the linked list static int internal_lobby_unlink(internal_lobby_data *data) { if (data->next==data) { grapple_lobby_head=NULL; return 1; } data->next->prev=data->prev; data->prev->next=data->next; if (data==grapple_lobby_head) grapple_lobby_head=data->next; data->next=NULL; data->prev=NULL; return 1; } //Find the lobby from the ID number passed by the user static internal_lobby_data *internal_lobby_get(grapple_lobby num) { internal_lobby_data *scan; //By default if passed 0, then the oldest lobby is returned if (!num) return grapple_lobby_head; //This is a cache as most often you will want the same one as last time //Loop through the lobbys scan=grapple_lobby_head; while (scan) { if (scan->lobbynum==num) { return scan; } scan=scan->next; if (scan==grapple_lobby_head) return NULL; } //No match return NULL; } //Create a new lobby static internal_lobby_data *lobby_create(void) { static int nextval=1; internal_lobby_data *data; pthread_mutexattr_t attr; //Create the structure data=(internal_lobby_data *)calloc(1,sizeof(internal_lobby_data)); //Assign it a default ID data->lobbynum=nextval++; //Set up the mutexes pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&data->userlist_mutex,&attr); pthread_mutex_init(&data->message_mutex,&attr); pthread_mutex_init(&data->games_mutex,&attr); //Link it into the array of lobbies internal_lobby_link(data); return data; } //User function for initialising the lobby grapple_lobby grapple_lobby_init(const char *name,const char *version) { internal_lobby_data *data; //Create the internal data data=lobby_create(); data->server=grapple_server_init(name,version); //Return the client ID - the end user only gets an integer, called a //'grapple_lobby' return data->lobbynum; } //Set the port number to connect to int grapple_lobby_port_set(grapple_lobby lobby,int port) { internal_lobby_data *data; //Get the lobby data data=internal_lobby_get(lobby); if (!data || !data->server) { return GRAPPLE_FAILED; } //Set this in the grapple data return grapple_server_port_set(data->server,port); } //Set the IP address to bind to. This is an optional, if not set, then all //local addresses are bound to int grapple_lobby_ip_set(grapple_lobby lobby,const char *ip) { internal_lobby_data *data; //Get the lobby data data=internal_lobby_get(lobby); if (!data || !data->server) { return GRAPPLE_FAILED; } return grapple_server_ip_set(data->server,ip); } //Check if a room is empty, return 1 if it is static int grapple_lobby_room_empty(internal_lobby_data *server, grapple_user roomid) { int returnval=0; grapple_user *userlist; grapple_lobbygame_internal *scan; int count; userlist=grapple_server_groupusers_get(server->server,roomid); if (!userlist || !userlist[0]) if (roomid!=server->mainroom) { //If the room is now empty, and this ISNT the main room, delete //the group (room) //also need to check if there are any games running in this room pthread_mutex_lock(&server->games_mutex); scan=server->games; count=0; while (scan && !count) { if (scan->room==roomid) count=1; scan=scan->next; if (scan==server->games) scan=NULL; } pthread_mutex_unlock(&server->games_mutex); if (!count) returnval=1; } free(userlist); return returnval; } //The lobby server has been passed a message to delete a game static int grapple_lobby_process_lobbymsg_delete_game(internal_lobby_data *server, grapple_message *message) { intchar val; grapple_lobbygameid gameid; grapple_lobbygame_internal *game; char outdata[8]; memcpy(val.c,message->USER_MSG.data+4,4); gameid=ntohl(val.i); pthread_mutex_lock(&server->games_mutex); //Locate the game game=grapple_lobbygame_internal_locate_by_id(server->games,gameid); //delete the game for the server if (game && game->owner==message->USER_MSG.id) { //Unlink from the list server->games=grapple_lobbygame_internal_unlink(server->games,game); //Its not in the list we can release the mutex now pthread_mutex_unlock(&server->games_mutex); //Send a message to all clients informing them val.i=htonl(GRAPPLE_LOBBYMESSAGE_DELETEGAME); memcpy(outdata,val.c,4); val.i=htonl(game->id); memcpy(outdata+4,val.c,4); //Send the message grapple_server_send(server->server,GRAPPLE_EVERYONE,0,outdata,8); //Do NOT delete the room here cos all the users in the game are about //to be tossed back into this room. It will NOT be empty at this point grapple_lobbygame_internal_dispose(game); } else { pthread_mutex_unlock(&server->games_mutex); } return 0; } //The client has sent us a count of how many people are connected to their game static int grapple_lobby_process_lobbymsg_game_usercount(internal_lobby_data *server, grapple_message *message) { intchar val; grapple_lobbygameid gameid; grapple_lobbygame_internal *game; int count; memcpy(val.c,message->USER_MSG.data+4,4); gameid=ntohl(val.i); memcpy(val.c,message->USER_MSG.data+8,4); count=ntohl(val.i); pthread_mutex_lock(&server->games_mutex); game=grapple_lobbygame_internal_locate_by_id(server->games,gameid); //Only the owner can send the data if (game && game->owner==message->USER_MSG.id) { //Set the value in the game data game->currentusers=count; pthread_mutex_unlock(&server->games_mutex); //We can just resend the data, it is all correct as needed grapple_server_send(server->server,GRAPPLE_EVERYONE,0, message->USER_MSG.data,12); } else pthread_mutex_unlock(&server->games_mutex); return 0; } //We have been told how many users at maximum a game can now have static int grapple_lobby_process_lobbymsg_game_maxusercount(internal_lobby_data *server, grapple_message *message) { intchar val; grapple_lobbygameid gameid; grapple_lobbygame_internal *game; int count; memcpy(val.c,message->USER_MSG.data+4,4); gameid=ntohl(val.i); memcpy(val.c,message->USER_MSG.data+8,4); count=ntohl(val.i); pthread_mutex_lock(&server->games_mutex); //FInd the game game=grapple_lobbygame_internal_locate_by_id(server->games,gameid); //Only do it if the user is the owner if (game && game->owner==message->USER_MSG.id) { //Set the value game->maxusers=count; pthread_mutex_unlock(&server->games_mutex); //We can just resend the data, it is all correct as needed grapple_server_send(server->server,GRAPPLE_EVERYONE,0, message->USER_MSG.data,12); } else pthread_mutex_unlock(&server->games_mutex); return 0; } //We have been told if the game is open or closed static int grapple_lobby_process_lobbymsg_game_closed(internal_lobby_data *server, grapple_message *message) { intchar val; grapple_lobbygameid gameid; grapple_lobbygame_internal *game; int state; memcpy(val.c,message->USER_MSG.data+4,4); gameid=ntohl(val.i); memcpy(val.c,message->USER_MSG.data+8,4); state=ntohl(val.i); pthread_mutex_lock(&server->games_mutex); //FInd the game game=grapple_lobbygame_internal_locate_by_id(server->games,gameid); //Only do it if the user is the owner if (game && game->owner==message->USER_MSG.id) { //Set the value game->closed=state; pthread_mutex_unlock(&server->games_mutex); //We can just resend the data, it is all correct as needed grapple_server_send(server->server,GRAPPLE_EVERYONE,0, message->USER_MSG.data,12); } else pthread_mutex_unlock(&server->games_mutex); return 0; } //We have been asked to register a game static int grapple_lobby_process_lobbymsg_register_game(internal_lobby_data *server, grapple_message *message) { void *data; char *outdata; int length,outlength,addresslength,sessionlength; intchar val; int offset; grapple_lobbygame_internal *game; int varlength; static int gameid=1; int localgameid; grapple_lobbyconnection *user; length=message->USER_MSG.length-4; data=message->USER_MSG.data+4; if (length < 4) return 0; //Unpack all the data //4 bytes : Session name length // ; Session name //4 bytes : Address length // : address (may be 0 bytes) //4 bytes : portnumber //4 bytes : protocol //4 bytes : Maximum number of users //4 bytes : Password required (could be 1 byte but lets stick with ints) //Allocate a new grapple_lobbygame structure game=grapple_lobbygame_internal_create(); memcpy(val.c,data,4); varlength=ntohl(val.i); game->session=(char *)malloc(varlength+1); memcpy(game->session,data+4,varlength); game->session[varlength]=0; offset=varlength+4; memcpy(val.c,data+offset,4); varlength=ntohl(val.i); offset+=4; if (varlength) { game->address=(char *)malloc(varlength+1); memcpy(game->address,data+offset,varlength); game->address[varlength]=0; offset+=varlength; } memcpy(val.c,data+offset,4); game->port=ntohl(val.i); offset+=4; memcpy(val.c,data+offset,4); game->protocol=ntohl(val.i); offset+=4; memcpy(val.c,data+offset,4); game->maxusers=ntohl(val.i); offset+=4; memcpy(val.c,data+offset,4); game->needpassword=ntohl(val.i); //The game structure is allocated. //Now check there is an address. If not, get one if (!game->address) { game->address=grapple_server_client_address_get(server->server, message->USER_MSG.id); if (!game->address) { //We have NO idea where the request actually came from - this //should never happen, but if it does... outdata=(char *)malloc(8); val.i=htonl(GRAPPLE_LOBBYMESSAGE_YOURGAMEID); memcpy(outdata,val.c,4); val.i=htonl(-1); memcpy(outdata+4,val.c,4); //Sent this message - game ID is -1, to the client - that is a fail grapple_server_send(server->server,message->USER_MSG.id,0, outdata,8); free(outdata); return 0; } } localgameid=gameid++; game->id=localgameid; //Find the room that the game has been created in pthread_mutex_lock(&server->userlist_mutex); user=grapple_lobbyconnection_locate_by_id(server->userlist, message->USER_MSG.id); if (user) { game->room=user->currentroom; //This sets the users game so we can unlink the game when the user goes user->game=game->id; } pthread_mutex_unlock(&server->userlist_mutex); game->owner=message->USER_MSG.id; //set the length to be: outlength=28; /*Ints for lobbyprotocol, port, protocol, maxusers, needpassword , game ID and roomnumber */ sessionlength=strlen(game->session); outlength+=(sessionlength+4); //The length of the session plus a length int addresslength=strlen(game->address); outlength+=(addresslength+4); //The length of the address plus a length int outdata=(char *)malloc(outlength); //Now we need to put together the more complicated data packet that is //showing the new game to the players. //4 bytes : Lobby protocol //4 bytes : game ID //4 bytes : Session name length // ; Session name //4 bytes : Address length // : address //4 bytes : portnumber //4 bytes : protocol //4 bytes : Maximum number of users //4 bytes : Password required (could be 1 byte but lets stick with ints) //4 bytes : Room number val.i=htonl(GRAPPLE_LOBBYMESSAGE_REGISTERGAME); memcpy(outdata,val.c,4); val.i=htonl(game->id); memcpy(outdata+4,val.c,4); val.i=htonl(sessionlength); memcpy(outdata+8,val.c,4); memcpy(outdata+12,game->session,sessionlength); offset=sessionlength+12; val.i=htonl(addresslength); memcpy(outdata+offset,val.c,4); offset+=4; memcpy(outdata+offset,game->address,addresslength); offset+=addresslength; val.i=htonl(game->port); memcpy(outdata+offset,val.c,4); offset+=4; val.i=htonl(game->protocol); memcpy(outdata+offset,val.c,4); offset+=4; val.i=htonl(game->maxusers); memcpy(outdata+offset,val.c,4); offset+=4; val.i=htonl(game->needpassword); memcpy(outdata+offset,val.c,4); offset+=4; val.i=htonl(game->room); memcpy(outdata+offset,val.c,4); //Link this into the servers list before we tell everyone about it pthread_mutex_lock(&server->games_mutex); server->games=grapple_lobbygame_internal_link(server->games,game); pthread_mutex_unlock(&server->games_mutex); //Send this message to everyone now, so they can all register the new game grapple_server_send(server->server,GRAPPLE_EVERYONE,0,outdata,outlength); free(outdata); //Now tell the client the new ID of their game outdata=(char *)malloc(8); val.i=htonl(GRAPPLE_LOBBYMESSAGE_YOURGAMEID); memcpy(outdata,val.c,4); val.i=htonl(localgameid); memcpy(outdata+4,val.c,4); grapple_server_send(server->server,message->USER_MSG.id,0,outdata,8); free(outdata); return 0; } //A generic user message. This is a grapple message containing user data, //in this case, the data for the lobby protocol //This gets handed off to protocol handling functions static int grapple_lobby_process_user_msg(internal_lobby_data *server, grapple_message *message) { grapple_lobbymessagetype_internal type; intchar val; //User message - break it into its components if (message->USER_MSG.length < 4) return 0; memcpy(val.c,message->USER_MSG.data,4); type=ntohl(val.i); //Send off to a handler switch (type) { case GRAPPLE_LOBBYMESSAGE_REGISTERGAME: grapple_lobby_process_lobbymsg_register_game(server,message); break; case GRAPPLE_LOBBYMESSAGE_DELETEGAME: grapple_lobby_process_lobbymsg_delete_game(server,message); break; case GRAPPLE_LOBBYMESSAGE_GAME_USERCOUNT: grapple_lobby_process_lobbymsg_game_usercount(server,message); break; case GRAPPLE_LOBBYMESSAGE_GAME_MAXUSERCOUNT: grapple_lobby_process_lobbymsg_game_maxusercount(server,message); break; case GRAPPLE_LOBBYMESSAGE_GAME_CLOSED: grapple_lobby_process_lobbymsg_game_closed(server,message); break; case GRAPPLE_LOBBYMESSAGE_CONNECTED: case GRAPPLE_LOBBYMESSAGE_CHAT: case GRAPPLE_LOBBYMESSAGE_DUPLICATENAME: case GRAPPLE_LOBBYMESSAGE_YOURGAMEID: //Never sent to the server break; } return 0; } //A new user has connected static int grapple_lobby_process_new_user(internal_lobby_data *server, grapple_message *message) { grapple_lobbyconnection *newuser; //Create the users local data newuser=grapple_lobbyconnection_create(); newuser->id=message->NEW_USER.id; pthread_mutex_lock(&server->userlist_mutex); server->userlist=grapple_lobbyconnection_link(server->userlist,newuser); pthread_mutex_unlock(&server->userlist_mutex); //We dont tell the clients, because //a) Grapple will tell them //b) we tell them to activate the client when a clients name is set as OK return 0; } static int grapple_lobby_process_user_name(internal_lobby_data *server, grapple_message *message) { int found=0; intchar val; char outdata[8]; grapple_lobbyconnection *user; //Check there isnt a user by this name already - names are unique pthread_mutex_lock(&server->userlist_mutex); if (grapple_lobbyconnection_locate_by_name(server->userlist, message->USER_NAME.name)) found=1; pthread_mutex_unlock(&server->userlist_mutex); if (found) { val.i=htonl(GRAPPLE_LOBBYMESSAGE_DUPLICATENAME); //Send them the rejection message grapple_server_send(server->server, message->USER_NAME.id, 0,val.c,4); //Dont disconnect them, they will close themself, and reconnect //with a new name return 0; } pthread_mutex_lock(&server->userlist_mutex); user=grapple_lobbyconnection_locate_by_id(server->userlist, message->USER_NAME.id); if (!user) { pthread_mutex_unlock(&server->userlist_mutex); //This user seems to have vanished return 0; } //The name is fine, allocate it to the user if (user->name) free(user->name); user->name=(char *)malloc(strlen(message->USER_NAME.name)+1); strcpy(user->name,message->USER_NAME.name); pthread_mutex_unlock(&server->userlist_mutex); user->connected=1; //Now tell all users that this user is connected val.i=htonl(GRAPPLE_LOBBYMESSAGE_CONNECTED); memcpy(outdata,val.c,4); val.i=htonl(message->USER_NAME.id); memcpy(outdata+4,val.c,4); //Send them the accept message grapple_server_send(server->server, GRAPPLE_EVERYONE, 0,outdata,8); //Join the user to the entry group grapple_server_group_add(server->server,server->mainroom, message->USER_NAME.id); user->currentroom=server->mainroom; //The user is now connected return 0; } //The user has added themself to a group - they have entered a room static int grapple_lobby_process_group_add(internal_lobby_data *server, grapple_message *message) { grapple_lobbyconnection *user; //Change their current room in the user data pthread_mutex_lock(&server->userlist_mutex); user=grapple_lobbyconnection_locate_by_id(server->userlist, message->GROUP.memberid); user->currentroom=message->GROUP.groupid; pthread_mutex_unlock(&server->userlist_mutex); return 0; } //The user has removed themself from a group - they have left a room static int grapple_lobby_process_group_remove(internal_lobby_data *server, grapple_message *message) { //If the room is now empty, delete the room if (grapple_lobby_room_empty(server,message->GROUP.groupid)) grapple_server_group_delete(server->server,message->GROUP.groupid); return 0; } //A user has disconnected static int grapple_lobby_process_user_disconnected(internal_lobby_data *server, grapple_message *message) { grapple_lobbyconnection *user; grapple_lobbygame_internal *game; char outdata[8]; intchar val; pthread_mutex_lock(&server->userlist_mutex); //Find the users details user=grapple_lobbyconnection_locate_by_id(server->userlist, message->USER_DISCONNECTED.id); if (user) { //Remove them from the list server->userlist=grapple_lobbyconnection_unlink(server->userlist,user); pthread_mutex_unlock(&server->userlist_mutex); //Remove them from their room (group) grapple_server_group_remove(server->server,user->currentroom, user->id); //Check the room - is it now empty? //We dont do this if the user is in a game, because the users in the //game will be bailed out into the room when the game ends, so the room //needs to still be here if (!user->game) { if (grapple_lobby_room_empty(server,user->currentroom)) grapple_server_group_delete(server->server,user->currentroom); } else { //Find the users game and remove it if (user->game) { pthread_mutex_lock(&server->games_mutex); game=grapple_lobbygame_internal_locate_by_id(server->games,user->game); if (game) { server->games=grapple_lobbygame_internal_unlink(server->games,game); pthread_mutex_unlock(&server->games_mutex); //Let everyone know that this game is gone now val.i=htonl(GRAPPLE_LOBBYMESSAGE_DELETEGAME); memcpy(outdata,val.c,4); val.i=htonl(user->game); memcpy(outdata+4,val.c,4); grapple_server_send(server->server,GRAPPLE_EVERYONE,0, outdata,8); grapple_lobbygame_internal_dispose(game); user->game=0; } else pthread_mutex_unlock(&server->games_mutex); } } //Dispose of the user grapple_lobbyconnection_dispose(user); } else pthread_mutex_unlock(&server->userlist_mutex); return 0; } //A generic callback to handle all grapple messages that come through from the //network static int grapple_lobby_generic_callback(grapple_message *message, void *context) { internal_lobby_data *server; server=(internal_lobby_data *)context; //Hand off the message based on what it is switch (message->type) { case GRAPPLE_MSG_USER_NAME: grapple_lobby_process_user_name(server,message); break; case GRAPPLE_MSG_NEW_USER: grapple_lobby_process_new_user(server,message); break; case GRAPPLE_MSG_GROUP_REMOVE: grapple_lobby_process_group_remove(server,message); break; case GRAPPLE_MSG_GROUP_ADD: grapple_lobby_process_group_add(server,message); break; case GRAPPLE_MSG_USER_DISCONNECTED: grapple_lobby_process_user_disconnected(server,message); break; case GRAPPLE_MSG_USER_MSG: grapple_lobby_process_user_msg(server,message); break; case GRAPPLE_MSG_CONFIRM_RECEIVED: case GRAPPLE_MSG_CONFIRM_TIMEOUT: case GRAPPLE_MSG_SESSION_NAME: case GRAPPLE_MSG_GROUP_CREATE: case GRAPPLE_MSG_GROUP_DELETE: case GRAPPLE_MSG_PING: //Dont care about these ones break; case GRAPPLE_MSG_NEW_USER_ME: case GRAPPLE_MSG_YOU_ARE_HOST: case GRAPPLE_MSG_SERVER_DISCONNECTED: case GRAPPLE_MSG_CONNECTION_REFUSED: //These never come to the server break; } grapple_message_dispose(message); return 0; } //Start the lobby int grapple_lobby_start(grapple_lobby lobby) { internal_lobby_data *data; int returnval; data=internal_lobby_get(lobby); //Check the lobbys minimum defaults are set if (!data || !data->server) { return GRAPPLE_FAILED; } //Set the servers network details grapple_server_protocol_set(data->server,GRAPPLE_PROTOCOL_TCP); grapple_server_session_set(data->server,"Grapple Lobby"); grapple_server_callback_setall(data->server, grapple_lobby_generic_callback, (void *)data); //Start the server returnval=grapple_server_start(data->server); if (returnval!=GRAPPLE_OK) return returnval; //Set up the room as the mainroom data->mainroom=grapple_server_group_create(data->server, GRAPPLE_LOBBY_ENTRY_ROOM); return GRAPPLE_OK; } //Destroy the lobby int grapple_lobby_destroy(grapple_lobby lobby) { internal_lobby_data *data; grapple_lobbygame_internal *gametarget; grapple_lobbyconnection *connection; grapple_lobbymessage *message; data=internal_lobby_get(lobby); if (!data) { return GRAPPLE_FAILED; } //Destrouy the grapple layer if (data->server) grapple_server_destroy(data->server); //remove it from the list internal_lobby_unlink(data); //Delete connected games pthread_mutex_lock(&data->games_mutex); while (data->games) { gametarget=data->games; data->games=grapple_lobbygame_internal_unlink(data->games,data->games); grapple_lobbygame_internal_dispose(gametarget); } pthread_mutex_unlock(&data->games_mutex); //Unlink all the users pthread_mutex_lock(&data->userlist_mutex); while (data->userlist) { connection=data->userlist; data->userlist=grapple_lobbyconnection_unlink(data->userlist, data->userlist); grapple_lobbyconnection_dispose(connection); } pthread_mutex_unlock(&data->userlist_mutex); //Unlink all the remaining incoming messages pthread_mutex_lock(&data->message_mutex); while (data->messages) { message=data->messages; data->messages=grapple_lobbymessage_unlink(data->messages, data->messages); grapple_lobbymessage_dispose(message); } pthread_mutex_unlock(&data->message_mutex); //Delete the mutexes pthread_mutex_destroy(&data->userlist_mutex); pthread_mutex_destroy(&data->message_mutex); pthread_mutex_destroy(&data->games_mutex); free(data); return GRAPPLE_OK; } //Get the last error grapple_error grapple_lobby_error_get(grapple_lobby num) { internal_lobby_data *data; grapple_error returnval; data=internal_lobby_get(num); if (!data) { return GRAPPLE_ERROR_NOT_INITIALISED; } returnval=data->last_error; //Now wipe the last error data->last_error=GRAPPLE_NO_ERROR; return returnval; } pong2-0.1.3/src/grapple/grapple_server.h0000644000175000001440000001127410473646146015107 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_SERVER_H #define GRAPPLE_SERVER_H #include "grapple_callback.h" #include "grapple_protocols.h" #include "grapple_message.h" #include "grapple_error.h" #include "grapple_types.h" #ifdef __cplusplus extern "C" { #endif extern grapple_server grapple_server_init(const char *,const char *); extern int grapple_server_port_set(grapple_server,int); extern int grapple_server_port_get(grapple_server); extern int grapple_server_ip_set(grapple_server,const char *); extern const char *grapple_server_ip_get(grapple_server); extern int grapple_server_protocol_set(grapple_server,grapple_protocol); extern grapple_protocol grapple_server_protocol_get(grapple_server); extern int grapple_server_session_set(grapple_server,const char *); extern const char *grapple_server_session_get(grapple_server); extern int grapple_server_start(grapple_server); extern int grapple_server_running(grapple_server); extern int grapple_server_stop(grapple_server); extern int grapple_server_destroy(grapple_server); extern int grapple_server_enumgrouplist(grapple_server, grapple_user_enum_callback, void *); extern int grapple_server_enumgroup(grapple_server, grapple_user, grapple_user_enum_callback, void *); extern int grapple_server_enumusers(grapple_server, grapple_user_enum_callback, void *); extern int grapple_server_sequential_set(grapple_server,int); extern int grapple_server_sequential_get(grapple_server); extern int grapple_server_failover_set(grapple_server,int); extern int grapple_server_maxusers_set(grapple_server,int); extern int grapple_server_maxusers_get(grapple_server); extern int grapple_server_currentusers_get(grapple_server); extern int grapple_server_password_set(grapple_server,const char *); extern int grapple_server_password_required(grapple_server); extern int grapple_server_messagecount_get(grapple_server); extern int grapple_server_messages_waiting(grapple_server); extern grapple_message *grapple_server_message_pull(grapple_server); extern grapple_confirmid grapple_server_send(grapple_server,grapple_user, int,void *,int); extern grapple_user *grapple_server_userlist_get(grapple_server); extern int grapple_server_callback_set(grapple_server, grapple_messagetype, grapple_callback, void *); extern int grapple_server_callback_setall(grapple_server, grapple_callback, void *); extern int grapple_server_callback_unset(grapple_server, grapple_messagetype); extern grapple_server grapple_server_default_get(void); extern int grapple_server_closed_get(grapple_server); extern void grapple_server_closed_set(grapple_server,int); extern int grapple_server_disconnect_client(grapple_server,grapple_user); extern int grapple_server_ping(grapple_server,grapple_user); extern double grapple_server_ping_get(grapple_server,grapple_user); extern int grapple_server_autoping(grapple_server,double); extern grapple_user grapple_server_group_create(grapple_server,const char *); extern int grapple_server_group_add(grapple_server,grapple_user, grapple_user); extern int grapple_server_group_remove(grapple_server,grapple_user, grapple_user); extern int grapple_server_group_delete(grapple_server,grapple_user); extern grapple_user grapple_server_group_from_name(grapple_server,const char *); extern grapple_user *grapple_server_groupusers_get(grapple_server, grapple_user); extern grapple_user *grapple_server_grouplist_get(grapple_server); extern char *grapple_server_client_address_get(grapple_server, grapple_user); extern char *grapple_server_groupname_get(grapple_server,grapple_user); extern grapple_error grapple_server_error_get(grapple_server); #ifdef __cplusplus } #endif #endif pong2-0.1.3/src/grapple/grapple_error.h0000644000175000001440000000317110473646146014727 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_ERROR_H #define GRAPPLE_ERROR_H typedef enum { GRAPPLE_NO_ERROR=0, GRAPPLE_ERROR_NOT_INITIALISED, GRAPPLE_ERROR_SERVER_CONNECTED, GRAPPLE_ERROR_SERVER_NOT_CONNECTED, GRAPPLE_ERROR_CLIENT_CONNECTED, GRAPPLE_ERROR_CLIENT_NOT_CONNECTED, GRAPPLE_ERROR_ADDRESS_NOT_SET, GRAPPLE_ERROR_PORT_NOT_SET, GRAPPLE_ERROR_NAME_NOT_SET, GRAPPLE_ERROR_NAME_NOT_UNIQUE, GRAPPLE_ERROR_SESSION_NOT_SET, GRAPPLE_ERROR_PROTOCOL_NOT_SET, GRAPPLE_ERROR_CANNOT_CONNECT, GRAPPLE_ERROR_NO_SUCH_USER, GRAPPLE_ERROR_SERVER_CANNOT_BIND_SOCKET, } grapple_error; #ifdef __cplusplus extern "C" { #endif extern const char *grapple_error_text(grapple_error); #ifdef __cplusplus } #endif #endif pong2-0.1.3/src/grapple/dynstring.c0000644000175000001440000001322210473646146014076 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include "dynstring.h" //A set of variables for dynamically growing strings ///////////////////// chars /////////////////////////// dynstring *dynstringInit(int datasize) { dynstring *newstruct; newstruct=(dynstring *)malloc(sizeof(dynstring)); newstruct->buf=(char *)malloc(datasize); //The actual string newstruct->len=0; newstruct->buf[0]=0; newstruct->maxlen=datasize; //The maximum string length return newstruct; } //Check a length of string will fit, if it wont, grow the buffer void dynstringCheckAvailableLength(dynstring *data,int length) { length+=2; if (length+data->len > data->maxlen) { data->maxlen=length+data->len; data->buf=(char *)realloc(data->buf,data->maxlen); } } //Append some text to a dynstring void dynstringAppend(dynstring *data,const char *buf) { int length; if (!buf || !*buf) return; length=strlen(buf); //grow the buffer if required dynstringCheckAvailableLength(data,length); //Append the text strcat((char *)data->buf,buf); data->len+=length; data->buf[data->len]=0; //NULL it return; } //Append raw data to a dynstring void dynstringRawappend(dynstring *data,const char *buf,size_t len) { if (!buf) return; //Check the length dynstringCheckAvailableLength(data,len); //Set the data into the buffer memcpy(data->buf+data->len,buf,len); data->len+=len; data->buf[data->len]=0; //NULL it - this may not matter but its not expensive return; } //Delete a dynstring void dynstringUninit(dynstring *data) { free(data->buf); free(data); return; } ///////////////////// unsigned chars /////////////////////////// udynstring *dynstringUInit(int datasize) { udynstring *newstruct; newstruct=(udynstring *)malloc(sizeof(udynstring)); newstruct->buf=(unsigned char *)malloc(datasize); //The actual string newstruct->len=0; newstruct->buf[0]=0; newstruct->maxlen=datasize; //The maximum string length return newstruct; } //Check a length of string will fit, if it wont, grow the buffer void dynstringUCheckAvailableLength(udynstring *data,int length) { length+=2; if (length+data->len > data->maxlen) { data->maxlen=length+data->len; data->buf=(unsigned char *)realloc(data->buf,data->maxlen); } } //Append some text to an unsigned dynstring void dynstringUAppend(udynstring *data,const unsigned char *buf) { int length; if (!buf || !*buf) return; length=strlen((const char *)buf); //grow the buffer if required dynstringUCheckAvailableLength(data,length); //Append the text strcat((char *)data->buf,(const char *)buf); data->len+=length; data->buf[data->len]=0; //NULL it return; } //Append raw data to an unsigned dynstring void dynstringURawappend(udynstring *data,const unsigned char *buf,size_t len) { if (!buf) return; //Check the length dynstringUCheckAvailableLength(data,len); //Set the data into the buffer memcpy(data->buf+data->len,buf,len); data->len+=len; data->buf[data->len]=0; //NULL it - this may not matter but its not expensive return; } //Delete an unsigned dynstring void dynstringUUninit(udynstring *data) { free(data->buf); free(data); return; } ///////////////////// signed chars /////////////////////////// sdynstring *dynstringSInit(int datasize) { sdynstring *newstruct; newstruct=(sdynstring *)malloc(sizeof(sdynstring)); newstruct->buf=(signed char *)malloc(datasize); //The actual string newstruct->len=0; newstruct->buf[0]=0; newstruct->maxlen=datasize; //The maximum string length return newstruct; } //Check a length of string will fit, if it wont, grow the buffer void dynstringSCheckAvailableLength(sdynstring *data,int length) { length+=2; if (length+data->len > data->maxlen) { data->maxlen=length+data->len; data->buf=(signed char *)realloc(data->buf,data->maxlen); } } //Append some text to a signed dynstring void dynstringSAppend(sdynstring *data,const signed char *buf) { int length; if (!buf || !*buf) return; length=strlen((const char *)buf); //grow the buffer if required dynstringSCheckAvailableLength(data,length); //Append the text strcat((char *)data->buf,(const char *)buf); data->len+=length; data->buf[data->len]=0; //NULL it return; } //Append raw data to a signed dynstring void dynstringSRawappend(sdynstring *data,const signed char *buf,size_t len) { if (!buf) return; //Check the length dynstringSCheckAvailableLength(data,len); //Set the data into the buffer memcpy(data->buf+data->len,buf,len); data->len+=len; data->buf[data->len]=0; //NULL it - this may not matter but its not expensive return; } //Delete a signed dynstring void dynstringSUninit(sdynstring *data) { free(data->buf); free(data); return; } pong2-0.1.3/src/grapple/grapple_confirm.c0000644000175000001440000003752110473646146015234 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #define _XOPEN_SOURCE 500 #include #include #include #include "grapple_confirm.h" #include "grapple_structs.h" #include "grapple_comms_api.h" //Create the confirm data static grapple_confirm *grapple_confirm_aquire(void) { grapple_confirm *returnval; returnval=(grapple_confirm *)calloc(1,sizeof(grapple_confirm)); //By default add space for 50 receivers. If we need more this will expand //dynamically, but it isnt really likely. returnval->maxreceiver=50; returnval->receivers=(int *)malloc(50*sizeof(int)); return returnval; } //Delete the confirm struct and all memory associated with it int grapple_confirm_dispose(grapple_confirm *target) { free(target->receivers); free(target); return 1; } //Link a confirm struct into a list of confirm structs static grapple_confirm *grapple_confirm_link(grapple_confirm *list, grapple_confirm *item) { if (!list) { item->next=item; item->prev=item; return item; } item->next=list; item->prev=list->prev; item->next->prev=item; item->prev->next=item; return list; } //Unlink a confirm struct from a list of confirm structs grapple_confirm *grapple_confirm_unlink(grapple_confirm *list, grapple_confirm *item) { if (list->next==list) { return NULL; } item->next->prev=item->prev; item->prev->next=item->next; if (item==list) list=item->next; return list; } //Locate a confirm struct inside a list by its ID static grapple_confirm *locate_confirm_message(grapple_confirm *list, int messageid) { grapple_confirm *scan; scan=list; while (scan) { if (scan->messageid==messageid) //IDs match, return the confirm return scan; scan=scan->next; if (scan==list) scan=NULL; } return NULL; } //Find the index in the int array of a specific receiver of a message static int locate_confirm_message_receiver_index(grapple_confirm *confirm, int target) { int loopa; for (loopa=0;loopareceivercount;loopa++) { if (confirm->receivers[loopa]==target) //Matches, return the index return loopa; } //No match, return -1 return -1; } //Add a new receiver to the int array static int confirm_message_add_receiver(grapple_confirm *confirm,int target) { //Incriment the count confirm->receivercount++; //If we dont have enough space, add more if (confirm->receivercount>confirm->maxreceiver) { confirm->maxreceiver*=2; confirm->receivers=(int *)realloc(confirm->receivers, confirm->maxreceiver*(sizeof(int))); } //Set the value into the array confirm->receivers[confirm->receivercount-1]=target; return 1; } //Remove a message from a confirm struct static int confirm_message_remove_receiver(grapple_confirm *confirm,int target) { int found=0,loopa,loopend; loopend=confirm->receivercount-1; //Loop through each one, if we have found the match start moving the rest //back one. Originally done with memmove but memmove had some issues for (loopa=0;loopa < loopend;loopa++) { if (found) { confirm->receivers[loopa]=confirm->receivers[loopa+1]; } else { if (confirm->receivers[loopa]==target) { found=1; confirm->receivers[loopa]=confirm->receivers[loopa+1]; } } } if (found || confirm->receivers[confirm->receivercount-1]==target) { //decriment the count confirm->receivercount--; } return 1; } //Register that a user is expected to confirm to this message int register_confirm(grapple_connection *origin,int messageid,int target) { grapple_confirm *confirm; pthread_mutex_lock(&origin->confirm_mutex); //Locate the message confirm=locate_confirm_message(origin->confirm,messageid); if (!confirm) { //If we couldnt find it, make it confirm=grapple_confirm_aquire(); //And link it in origin->confirm=grapple_confirm_link(origin->confirm,confirm); confirm->messageid=messageid; confirm->timeout=time(NULL)+GRAPPLE_CONFIRM_TIMEOUT; } else { //Dont add in duplicates if (locate_confirm_message_receiver_index(confirm,target)!=-1) { pthread_mutex_unlock(&origin->confirm_mutex); return 0; } } //Add the receiver confirm_message_add_receiver(confirm,target); pthread_mutex_unlock(&origin->confirm_mutex); return 0; } //Register the confirm for a user from a server message int server_register_confirm(internal_server_data *server, int messageid,int target) { grapple_confirm *confirm; pthread_mutex_lock(&server->confirm_mutex); //Locate the message confirm list confirm=locate_confirm_message(server->confirm,messageid); if (!confirm) { //Cant find it - make it confirm=grapple_confirm_aquire(); server->confirm=grapple_confirm_link(server->confirm,confirm); confirm->messageid=messageid; confirm->timeout=time(NULL)+GRAPPLE_CONFIRM_TIMEOUT; } else { if (locate_confirm_message_receiver_index(confirm,target)!=-1) { pthread_mutex_unlock(&server->confirm_mutex); return 0; } } //Add the user into the list confirm_message_add_receiver(confirm,target); pthread_mutex_unlock(&server->confirm_mutex); return 0; } //Remove a user from the list of confirmations, usually cos they have confirmed int unregister_confirm(internal_server_data *server, grapple_connection *origin,int messageid,int target) { grapple_confirm *confirm; int done=0; pthread_mutex_lock(&origin->confirm_mutex); //Locate the message confirm=locate_confirm_message(origin->confirm,messageid); if (!confirm) { pthread_mutex_unlock(&origin->confirm_mutex); return 0; } else { //And the receiver if (locate_confirm_message_receiver_index(confirm,target)==-1) { pthread_mutex_unlock(&origin->confirm_mutex); return 0; } } //Remove the receiver confirm_message_remove_receiver(confirm,target); if (confirm->receivercount==0) { //If there are no more receivers done=1; //Remove this message origin->confirm=grapple_confirm_unlink(origin->confirm,confirm); grapple_confirm_dispose(confirm); } pthread_mutex_unlock(&origin->confirm_mutex); if (done) //Let the user know the message is confirmed, if all have confirmed s2c_confirm_received(server,origin,messageid); return 0; } //Remove a user from the list of confirmations on a server message, //usually cos they have confirmed int server_unregister_confirm(internal_server_data *server, int messageid,int target) { grapple_confirm *confirm; int done=0; pthread_mutex_lock(&server->confirm_mutex); //Locate the message confirm=locate_confirm_message(server->confirm,messageid); if (!confirm) { pthread_mutex_unlock(&server->confirm_mutex); return 0; } else { //And the receiver if (locate_confirm_message_receiver_index(confirm,target)==-1) { pthread_mutex_unlock(&server->confirm_mutex); return 0; } } //Remove the receiver confirm_message_remove_receiver(confirm,target); if (confirm->receivercount==0) { //If there are no more receivers done=1; //Remove this message server->confirm=grapple_confirm_unlink(server->confirm,confirm); grapple_confirm_dispose(confirm); } pthread_mutex_unlock(&server->confirm_mutex); if (done) { if (server->sendwait==messageid) server->sendwait=0; //Let the server user know the message is confirmed, //if all have confirmed s2SUQ_confirm_received(server,messageid); } return 0; } /*The following three functions handle what happens if someone disconnects from the server, while still having confirm messages outstanding. In effect the confirm and the disconnect messages cross paths. We cant check every confirm message every single time someone disconnects, that would be VERY expensive for a situation that almost never ever happens. Instead we work by looping through each send confirm to see if they are more than 2 seconds into their cycle. It checks to see if they have completely timed out (10 seconds) or just need to be checked (every 2 seconds). Each check looks at all users still listed as unconfirmed, and checks to see if they have disconnected. If they HAVE, then it reports them as confirmed. A disconnected user is NOT a fail. Anything over 10 seconds is considered a fail and reported as such. This LOOKS like an expensive set of operations but in reality it isnt. Each user will only have their confirms checked once every 2 seconds at most, the confirms are in time order already so as soon as we hit one that isnt old (the vast majority) then we leave that user. All in all, this is quite cheap */ //Check to see if anyone on this confirm message has disconnected recently, //And remove them from this list if they have. static void process_server_confirm_disconnections(internal_server_data *server, grapple_confirm *target) { int loopa; grapple_connection *scan; int found; //Loop for each user we are still waiting for for (loopa=0;loopareceivercount;loopa++) { found=0; pthread_mutex_lock(&server->connection_mutex); //Now see if we can find a user to match it scan=server->userlist; while (scan) { if (scan->serverid==target->receivers[loopa]) { //We found the user, break out of the loop found=1; scan=NULL; } else scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); if (!found) { //This user has disconnected if (target->receivercount==1) { //This is the last one, handle differently server_unregister_confirm(server,target->messageid, target->receivers[loopa]); //Now this target will be GONE - return return; } else { //remove this user, more to go server_unregister_confirm(server,target->messageid, target->receivers[loopa]); loopa--; } } } return; } //Check to see if anyone on this confirm message has disconnected recently, //And remove them from this list if they have. static void process_user_confirm_disconnections(internal_server_data *server, grapple_connection *user, grapple_confirm *target) { int loopa; grapple_connection *scan; int found; //Loop for each user we are still waiting for for (loopa=0;loopareceivercount;loopa++) { found=0; pthread_mutex_lock(&server->connection_mutex); //Now see if we can find a user to match it scan=server->userlist; while (scan) { if (scan->serverid==target->receivers[loopa]) { //We found the user, break out of the loop found=1; scan=NULL; } else scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); if (!found) { //This user has disconnected if (target->receivercount==1) { //This is the last one, handle differently unregister_confirm(server,user,target->messageid, target->receivers[loopa]); //Now this target will be GONE - return return; } else { //Remove this entry unregister_confirm(server,user,target->messageid, target->receivers[loopa]); //decriment loopa, so we will check the same index next time loopa--; } } } return; } //This is the controlling function for slow confirms void process_slow_confirms(internal_server_data *server) { grapple_confirm *scan,*target; grapple_connection *userscan; time_t this_second; this_second=time(NULL); //ONLY run this once a second if (this_second==server->last_confirm_check) return; server->last_confirm_check=this_second; //first check the server pthread_mutex_lock(&server->confirm_mutex); //Loop through each confirm on the server - remember they are in time //order so we can stop as soon as we are less than 2 seconds scan=server->confirm; while (scan) { if (scan->timeout-this_second<(GRAPPLE_CONFIRM_TIMEOUT-1)) { if (scan->timeoutconfirm=grapple_confirm_unlink(server->confirm,scan); s2SUQ_confirm_timeout(server,scan); grapple_confirm_dispose(scan); //This will always be the first one being deleted, so reset scan //to be the start of the list again scan=server->confirm; } else { //This hasnt timed out, but has been over 2 seconds. Check for //disconnections if ((scan->timeout-this_second)%2==0) { //we go to next then prev cos we dont know if the target will //be deleted or not, this keeps us safely on the next one //next loop target=scan; scan=scan->next; if (scan==target) scan=NULL; //Now run the disconnect check process_server_confirm_disconnections(server,target); if (scan) scan=scan->prev; } if (scan) scan=scan->next; if (scan==server->confirm) scan=NULL; } } else //This one wasnt over 2 seconds, so do nothing here scan=NULL; } pthread_mutex_unlock(&server->confirm_mutex); //Now we've handled the server, now we handle each user too - exactly the //same for EACH user pthread_mutex_lock(&server->connection_mutex); userscan=server->userlist; //Loop through each user while (userscan) { pthread_mutex_lock(&userscan->confirm_mutex); scan=userscan->confirm; while (scan) { if (scan->timeout-this_second<(GRAPPLE_CONFIRM_TIMEOUT-1)) { if (scan->timeoutconfirm=grapple_confirm_unlink(userscan->confirm, scan); s2c_confirm_timeout(server,userscan,scan); grapple_confirm_dispose(scan); //This will always be the first one being deleted... scan=userscan->confirm; } else { //This hasnt timed out, but has been over 2 seconds. Check for //disconnections if ((scan->timeout-this_second)%2==0) { //we go to next then prev cos we dont know if the //target will be deleted or not, this keeps us safely //on the next one next loop target=scan; scan=scan->next; if (scan==target) scan=NULL; //Check for disconnections now process_user_confirm_disconnections(server, userscan,target); if (scan) scan=scan->prev; } if (scan) scan=scan->next; if (scan==userscan->confirm) scan=NULL; } } else scan=NULL; } pthread_mutex_unlock(&userscan->confirm_mutex); userscan=userscan->next; if (userscan==server->userlist) userscan=NULL; } pthread_mutex_unlock(&server->connection_mutex); } pong2-0.1.3/src/grapple/grapple_protocols.h0000644000175000001440000000206510473646146015623 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_PROTOCOLS_H #define GRAPPLE_PROTOCOLS_H typedef enum { GRAPPLE_PROTOCOL_TCP = 1, GRAPPLE_PROTOCOL_UDP = 2, } grapple_protocol; #endif pong2-0.1.3/src/grapple/grapple_comms.h0000644000175000001440000000420210473646146014710 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_COMMS_H #define GRAPPLE_COMMS_H #include "grapple_enums.h" #include "grapple_structs.h" extern int s2c_send(internal_server_data *, grapple_connection *,grapple_messagetype_internal, const void *,size_t); extern int s2c_send_int(internal_server_data *, grapple_connection *,grapple_messagetype_internal, int); extern int s2c_send_double(internal_server_data *, grapple_connection *,grapple_messagetype_internal, double); extern int s2SUQ_send(internal_server_data *,int, grapple_messagetype_internal,const void *,size_t); extern int s2SUQ_send_int(internal_server_data *,int, grapple_messagetype_internal,int); extern int s2SUQ_send_double(internal_server_data *,int, grapple_messagetype_internal,double); extern int c2s_send(internal_client_data *,grapple_messagetype_internal, const void *,size_t); extern int c2s_send_int(internal_client_data *, grapple_messagetype_internal,int); extern int c2CUQ_send(internal_client_data *,grapple_messagetype_internal, const void *,size_t); extern int c2CUQ_send_int(internal_client_data *, grapple_messagetype_internal,int); extern int c2CUQ_send_double(internal_client_data *, grapple_messagetype_internal,double); #endif pong2-0.1.3/src/grapple/grapple_client_thread.c0000644000175000001440000012626610473646146016411 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include #include #include #include #include #include #include "grapple_client_thread.h" #include "grapple_client_internal.h" #include "grapple_queue.h" #include "grapple_connection.h" #include "grapple_comms_api.h" #include "grapple_group.h" #include "grapple_defines.h" #include "grapple_failover.h" #include "prototypes.h" #include "socket.h" #include "tools.h" #include "grapple_callback_internal.h" #include "grapple_callback_dispatcher.h" //The server has sent us a message that a user has connected static void process_message_user_connected(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; int newserverid; //Put the 4 bytes into the intchar, ready to convert to int memcpy(val.c,data,4); newserverid=ntohl(val.i); //Add a new user to the queue connection_client_add(client,newserverid, messagetype==GRAPPLE_MESSAGE_USER_CONNECTED?0:1); if (messagetype==GRAPPLE_MESSAGE_USER_YOU_CONNECTED) { //This is the clients own connection client->serverid=newserverid; //The client is now connected, set the socket mode to sequential //if required if (client->sequential) socket_mode_set(client->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); else socket_mode_unset(client->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); } //Add a connected message to the clients inbound message queue c2CUQ_send_int(client,messagetype,ntohl(val.i)); return; } //The server has told us of a user disconnecting static void process_message_user_disconnected(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; int serverid; //Find the user ID memcpy(val.c,data,4); serverid=ntohl(val.i); //remove user from the queue connection_client_remove_by_id(client,serverid); //If we are running failover, remove this one from the failover circuit if (client->failover) client->failoverhosts=failover_unlink_by_id(client->failoverhosts, serverid); //Add a connected message to the clients inbound message queue c2CUQ_send_int(client,messagetype,serverid); return; } //The server has rejected our connection attempt static void process_message_handshake_failed(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { //Add a failed handshake message to the clients inbound message queue c2CUQ_send_int(client,messagetype,0); return; } //The connection was OK, but the server is closed static void process_message_server_closed(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { //Add afailed handshake message to the clients inbound message queue c2CUQ_send_int(client,messagetype,0); return; } //The connection was ok, but the server is full static void process_message_server_full(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { //Add afailed handshake message to the clients inbound message queue c2CUQ_send_int(client,messagetype,0); return; } //The wrong password was sent to the server static void process_message_password_failed(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { //Add afailed handshake message to the clients inbound message queue c2CUQ_send_int(client,messagetype,0); return; } //We have been informed of a users name static void process_message_user_name(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; int serverid; void *outdata; //Find the users ID, and then swap it to host byte order memcpy(val.c,data,4); serverid=ntohl(val.i); val.i=serverid; //Copy the name into the outdata outdata=malloc(datalen+1); memcpy(outdata,data,datalen); memcpy(outdata,val.c,4); ((char *)outdata)[datalen]=0; //Change the users name connection_client_rename(client,serverid,(char *)(outdata+4)); //Add a renamed message to the clients inbound message queue c2CUQ_send(client,messagetype,outdata,datalen); free(outdata); return; } //The server has told us that the session name has either been set or RE-set static void process_message_session_name(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { //If it has been set already, delete it if (client->session) free(client->session); //Save the session name client->session=(char *)malloc(datalen+1); memcpy(client->session,data,datalen); client->session[datalen]=0; //Add a message to the clients inbound message queue c2CUQ_send(client,messagetype,data,datalen); return; } //We have received a message from the server static void process_message_user_message(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { //Split the message into its parts intchar val; int flags,messageid; //Data stream //4 bytes : flags //4 bytes : message ID // : DATA memcpy(val.c,data,4); flags=val.i; memcpy(val.c,data+4,4); messageid=ntohl(val.i); //Add a message to the clients inbound message queue c2CUQ_send(client,messagetype,data+8,datalen-8); //If we are supposed to confirm receipt, do so if (flags & GRAPPLE_CONFIRM) { c2s_confirm_received(client,0,messageid); } return; } static void process_message_relay_to(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; int from,flags,messageid; char *outdata; //Add a message to the clients inbound message queue //Data is: // 4 bytes sender ID // 4 bytes flags // 4 bytes message ID memcpy(val.c,data,4); from=ntohl(val.i); memcpy(val.c,data+4,4); flags=val.i; memcpy(val.c,data+8,4); messageid=ntohl(val.i); outdata=(char *)malloc(datalen); val.i=from; memcpy(outdata,val.c,4); memcpy(outdata+4,data+12,datalen-12); //Send the message to the user c2CUQ_send(client,messagetype,outdata,datalen-8); //-8 cos we're -12 +4 //If we are supposed to confirm it, do that if (flags & GRAPPLE_CONFIRM) c2s_confirm_received(client,from,messageid); return; } //We have received a ping, process that static void process_message_ping(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; //When we receive a ping, ALL we do is send the same number back - we dont //even need to ntohl it as its going back as it came if (datalen!=4) return; memcpy(val.c,data,4); c2s_pingreply(client,val.i); return; } //We have received a reply to one of our pings static void process_message_ping_reply(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; doublechar dval; char outdata[12]; grapple_connection *user; //When we receive a ping reply, the ping number is already correct if (datalen!=4) return; memcpy(val.c,data,4); if (val.i!=client->pingnumber) { //This ping is returning after the next one is sent,ignore it return; } //Now we see how long the ping took gettimeofday(&client->pingend,NULL); client->pingtime=((client->pingend.tv_sec-client->pingstart.tv_sec)*1000000); client->pingtime+=(client->pingend.tv_usec-client->pingstart.tv_usec); //Now get the connection data and set it there too pthread_mutex_lock(&client->connection_mutex); user=connection_from_serverid(client->userlist,client->serverid); if (user) { user->pingtime=client->pingtime; } pthread_mutex_unlock(&client->connection_mutex); //Now send a message to the client val.i=client->serverid; dval.d=client->pingtime; memcpy(outdata,val.c,4); memcpy(outdata+4,dval.c,8); c2CUQ_send(client,GRAPPLE_MESSAGE_PING_DATA,outdata,12); return; } //We have been passed ping data about another user from the server static void process_message_ping_data(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; doublechar dval; double pingtime; int serverid; char floatstr[50]; char outdata[12]; grapple_connection *user; //We now extract the information on who the ping time is about and //what the time is memcpy(val.c,data,4); serverid=ntohl(val.i); //The data is sent as a string, so we dont have to worry about endianness //for floats memcpy(floatstr,data+4,datalen-4); floatstr[datalen-4]=0; pingtime=atof(floatstr); //Now get the connection data and set it there too pthread_mutex_lock(&client->connection_mutex); user=connection_from_serverid(client->userlist,serverid); if (user) { user->pingtime=pingtime; } pthread_mutex_unlock(&client->connection_mutex); //Now send a message to the client val.i=serverid; dval.d=pingtime; memcpy(outdata,val.c,4); memcpy(outdata+4,dval.c,8); c2CUQ_send(client,GRAPPLE_MESSAGE_PING_DATA,outdata,12); return; } //We have been told by the server to turn off failover static void process_message_failover_off(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { grapple_failover_host *target; //Set the flag client->failover=0; //Remove any failover lists we have pthread_mutex_lock(&client->failover_mutex); while (client->failoverhosts) { target=client->failoverhosts; client->failoverhosts=failover_unlink(client->failoverhosts, client->failoverhosts); failover_dispose(target); } pthread_mutex_unlock(&client->failover_mutex); return; } static void process_message_failover_on(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { client->failover=1; /*It is on, but that doesnt mean that its on and we can do it. We need to test this first. This just lets us know that failover is an option if the server dies*/ //we have been requested to turn on failover. This means we need to see if //we CAN failover //The process goes like this: We open a port, the port that we would use //for failover, and we then tell the server to test us to see if they can //connect to us. If they can, we can be the server //So, start by opening a port on the socket we connect to (if we can) switch (client->protocol) { case GRAPPLE_PROTOCOL_TCP: client->failoversock= socket_create_inet_tcp_listener_on_ip(NULL,client->port); break; case GRAPPLE_PROTOCOL_UDP: client->failoversock= socket_create_inet_udp2way_listener_on_ip(NULL,client->port); break; } if (!client->failoversock) { //We cant even bind to the socket, so forget it, we're never going to //be the host c2s_failover_cant(client); return; } //Tell the server to see if it can connect c2s_failover_tryme(client); return; } //We have been told that a user can be the failover. This may or may not be us, //that is pretty immaterial static void process_message_failover_can(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; int failoverid; int length; char *host; //Disect the data //4 bytes : failover ID (user ID of the failover server) //4 bytes : data length // ADDRESS memcpy(val.c,data,4); failoverid=ntohl(val.i); memcpy(val.c,data+4,4); length=ntohl(val.i); host=(char *)malloc(length+1); memcpy(host,data+8,length); host[length]=0; //We now know who and where. //If the host is *us* then we first must disconnect the waiting socket if (failoverid==client->serverid) { if (client->failoversock) { socket_destroy(client->failoversock); client->failoversock=NULL; } } //Now add this one to the list (it can be adding ourown info to the list client->failoverhosts=failover_link_by_id(client->failoverhosts, failoverid,host); free(host); return; } //We have been told that someone can no longer be a failover static void process_message_failover_cant(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; int failoverid; //Find out the ID of who memcpy(val.c,data,4); failoverid=ntohl(val.i); if (failoverid==0) { //This is telling us we cant failover, close the remote socket if (client->failoversock) { socket_destroy(client->failoversock); client->failoversock=NULL; } return; } //We're taking a user off of the failover circuit client->failoverhosts=failover_unlink_by_id(client->failoverhosts, failoverid); return; } //We have been given the next group ID from the server static void process_message_next_groupid(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { int groupid; intchar val; memcpy(val.c,data,4); groupid=ntohl(val.i); //set this value into the connection data client->next_group=groupid; //Thats all we need to do here } //We have been told to create a group. Either the server or another player //has created this group. static void process_message_group_create(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { int groupid; intchar val; char *outdata; outdata=(char *)malloc(datalen+1); //Data is: //4 bytes: Group ID // : Group Name memcpy(val.c,data,4); groupid=ntohl(val.i); val.i=groupid; memcpy(outdata,val.c,4); memcpy(outdata+4,data+4,datalen-4); outdata[datalen]=0; //create a new group in the server create_client_group(client,groupid,outdata+4); //Send the notification to the player c2CUQ_send(client,GRAPPLE_MESSAGE_GROUP_CREATE,outdata,datalen); free(outdata); } //The server or another client has added a member to a group static void process_message_group_add(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { int groupid; int contentid; intchar val; char outdata[8]; //4 bytes : Group ID //4 bytes : ID of who has just been added memcpy(val.c,data,4); groupid=ntohl(val.i); memcpy(val.c,data+4,4); contentid=ntohl(val.i); //add a new member in the clients group if (!client_group_add(client,groupid,contentid)) return; //Construct the data to send to the clients queue val.i=groupid; memcpy(outdata,val.c,4); val.i=contentid; memcpy(outdata+4,val.c,4); //Send the message c2CUQ_send(client,GRAPPLE_MESSAGE_GROUP_ADD,outdata,8); } //The server or another client has removed someone from a message group static void process_message_group_remove(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { int groupid; int contentid; intchar val; char outdata[8]; //4 bytes : Group ID //4 bytes : ID of who has just been removed memcpy(val.c,data,4); groupid=ntohl(val.i); memcpy(val.c,data+4,4); contentid=ntohl(val.i); //remove the member from the clients group if (!client_group_remove(client,groupid,contentid)) return; //Construct data for the players message queue val.i=groupid; memcpy(outdata,val.c,4); val.i=contentid; memcpy(outdata+4,val.c,4); //Send the message c2CUQ_send(client,GRAPPLE_MESSAGE_GROUP_REMOVE,outdata,8); } //The server or another client has deleted a message group static void process_message_group_delete(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { int groupid; intchar val; char *outdata; internal_grapple_group *group; int length; //The ID is the only data memcpy(val.c,data,4); groupid=ntohl(val.i); pthread_mutex_lock(&client->group_mutex); group=group_locate(client->groups,groupid); length=strlen(group->name); outdata=(char *)malloc(length+4); val.i=groupid; memcpy(outdata,val.c,4); memcpy(outdata+4,group->name,length); pthread_mutex_unlock(&client->group_mutex); //Delete the group delete_client_group(client,groupid); //Let the player know c2CUQ_send(client,GRAPPLE_MESSAGE_GROUP_DELETE,outdata,length+4); free(outdata); } //This is confirmation that a message has been received by all of its //intended recipients static void process_message_confirm_received(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { int messageid; intchar val; //Get the message ID memcpy(val.c,data,4); messageid=ntohl(val.i); if (messageid==client->sendwait) client->sendwait=0; //Let the player know c2CUQ_send_int(client,GRAPPLE_MESSAGE_CONFIRM_RECEIVED,messageid); } //This is confirmation that a message has timed out when trying to send it //to one or more recipients static void process_message_confirm_timeout(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; char *outdata; int loopa; outdata=(char *)malloc(datalen); //It is a load of ints, just ntohl them and send them on their way, //we dont care what they are at this stage. (They are actually //4 bytes : message ID //4 bytes : number of failures // : DATA //First one is the message id, we need to make sure we arent waiting on //a sync send for it memcpy(val.c,data,4); val.i=ntohl(val.i); memcpy(outdata,val.c,4); if (val.i==client->sendwait) client->sendwait=0; for (loopa=1;loopa < datalen/4;loopa++) { memcpy(val.c,data+(loopa*4),4); val.i=ntohl(val.i); memcpy(outdata+(loopa*4),val.c,4); } //Send this now correctly endianded message to the client c2CUQ_send(client,GRAPPLE_MESSAGE_CONFIRM_TIMEOUT,outdata,datalen); free(outdata); return; } //The server has disconnected, we are in failover mode, so now we try and find //a new server. This may be ourself. static int client_run_failover(internal_client_data *client) { grapple_failover_host *newhost; grapple_server server=0; socketbuf *newsock=NULL; int retry; grapple_connection *connscan; internal_grapple_group *groupscan,*newgroup; grapple_group_container *container,*newcontainer; int maxval; internal_server_data *serverdata; //Find the ID of the lowest possible server newhost=failover_locate_lowest_id(client->failoverhosts); //There were no servers available if (!newhost) { //Send a disconnect message instead c2CUQ_send(client,GRAPPLE_MESSAGE_SERVER_DISCONNECTED,"",0); //Destroy ourself client->threaddestroy=1; client->disconnected=1; return 0; } //The client will now be connecting to somewhere else, drop the address free(client->address); //And set the new one client->address=(char *)malloc(strlen(newhost->address)+1); strcpy(client->address,newhost->address); //Test if we are to be the new server if (newhost->id == client->serverid) { //We are the new host, run a server server=grapple_server_init(client->productname,client->productversion); grapple_server_ip_set(server,client->address); grapple_server_port_set(server,client->port); grapple_server_protocol_set(server,client->protocol); grapple_server_session_set(server,client->session); serverdata=internal_server_get(server); //Find the highest number of serverid in use, and incriment it by one //to the new server id, so we dont get conflicts with the new //servers set of IDs pthread_mutex_lock(&client->connection_mutex); connscan=client->userlist; maxval=0; while (connscan) { if (connscan->serverid>maxval) maxval=connscan->serverid; connscan=connscan->next; if (connscan==client->userlist) connscan=NULL; } pthread_mutex_unlock(&client->connection_mutex); //We do the same for groups too, but for groups we also have other work //to do. We need to take the list of groups from the client and //transfer them to the ner server pthread_mutex_lock(&client->group_mutex); groupscan=client->groups; while (groupscan) { //Check the max ID (thats what we are initially doing here) if (groupscan->id>maxval) maxval=groupscan->id; //Add this group to the servers groups now create_server_group(serverdata,groupscan->id,groupscan->name); newgroup=group_locate(serverdata->groups,groupscan->id); //Now add all the members to this group that are in the clients group container=groupscan->contents; while (container) { newcontainer=group_container_aquire(container->id); pthread_mutex_lock(&serverdata->group_mutex); //Add this new group member to the group newgroup->contents=group_container_link(newgroup->contents, newcontainer); pthread_mutex_unlock(&serverdata->group_mutex); container=container->next; if (container==groupscan->contents) container=NULL; } groupscan=groupscan->next; if (groupscan==client->groups) groupscan=NULL; } pthread_mutex_unlock(&client->group_mutex); //Incriment the server connection ID to be correct serverdata->user_serverid=maxval+2; //ONLY NOW start the server grapple_server_start(server); //Set sequential if required grapple_server_sequential_set(server,client->sequential); //Tell the client that they are now the server c2CUQ_send_int(client,GRAPPLE_MESSAGE_YOU_ARE_HOST,(int)server); } //Now we connect the client to the new host - we do this if we are the new //host or not //For TCP we loop for up to 40 seconds trying to connect, as the new host //may not have the new connection up yet //For UDP we juet let it keep trying, it will time out on itsown at a //lower level in the end. switch (client->protocol) { case GRAPPLE_PROTOCOL_TCP: retry=0; while (retry<400) { newsock=socket_create_inet_tcp_wait(client->address,client->port,1); if (newsock && socket_connected(newsock)) { retry=400; } else { retry++; microsleep(10000); } } break; case GRAPPLE_PROTOCOL_UDP: newsock=socket_create_inet_udp2way_wait(client->address,client->port,1); client->connecting=1; } //If we have a dead socket now, we cant failover if (!newsock || socket_dead(newsock)) { //destroy our new socket if (newsock) socket_destroy(newsock); //Destroy our new server if we cant connect to it if (server) { grapple_server_stop(server); grapple_server_destroy(server); } //Let the client know the game is over c2CUQ_send(client,GRAPPLE_MESSAGE_SERVER_DISCONNECTED,"",0); //Kill ourself client->threaddestroy=1; client->disconnected=1; return 0; } //Immediately send to the server the message that we are a reconnecting //player, and what our ID is c2s_send_reconnection(client); //Then run through the standard handshake c2s_handshake(client); //We've connected the socket, now use low level socket routines to transfer //any outstanding socket buffers to the new socket output stream socket_mode_set(newsock,socket_mode_get(client->sock)); socket_relocate_data(client->sock,newsock); //Destroy the old socket client->socklist=socket_unlink(client->socklist,client->sock); socket_destroy(client->sock); //Make the new socket the standard socket client->sock=newsock; client->socklist=socket_link(client->socklist,client->sock); //Now finally remove the chosen failover host from the failover list client->failoverhosts=failover_unlink_by_id(client->failoverhosts, newhost->id); return 0; } //The server has disconnected, this means we must either failover or //die static void process_message_server_disconnected(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { if (client->failover && client->failoverhosts) { //FAILOVER! client_run_failover(client); } else { //Now we disconnect the thread, its done c2CUQ_send(client,GRAPPLE_MESSAGE_SERVER_DISCONNECTED,data,datalen); client->threaddestroy=1; client->disconnected=1; } return; } //We have received a message from the server, dispatch it to one of the handler //functions static void process_message(internal_client_data *client, grapple_messagetype_internal messagetype, void *data,int datalen) { switch (messagetype) { case GRAPPLE_MESSAGE_USER_CONNECTED: case GRAPPLE_MESSAGE_USER_YOU_CONNECTED: process_message_user_connected(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_USER_NAME: process_message_user_name(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_USER_MESSAGE: process_message_user_message(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_USER_DISCONNECTED: process_message_user_disconnected(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_HANDSHAKE_FAILED: process_message_handshake_failed(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_SESSION_NAME: process_message_session_name(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_RELAY_TO: process_message_relay_to(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_SERVER_CLOSED: process_message_server_closed(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_SERVER_FULL: process_message_server_full(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_PASSWORD_FAILED: process_message_password_failed(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_PING: process_message_ping(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_PING_REPLY: process_message_ping_reply(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_PING_DATA: process_message_ping_data(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_SERVER_DISCONNECTED: process_message_server_disconnected(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_FAILOVER_ON: process_message_failover_on(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_FAILOVER_OFF: process_message_failover_off(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_FAILOVER_CAN: process_message_failover_can(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_FAILOVER_CANT: process_message_failover_cant(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_NEXT_GROUPID: process_message_next_groupid(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_GROUP_CREATE: process_message_group_create(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_GROUP_ADD: process_message_group_add(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_GROUP_REMOVE: process_message_group_remove(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_GROUP_DELETE: process_message_group_delete(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_CONFIRM_RECEIVED: process_message_confirm_received(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_CONFIRM_TIMEOUT: process_message_confirm_timeout(client,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_GRAPPLE_VERSION: case GRAPPLE_MESSAGE_PRODUCT_NAME: case GRAPPLE_MESSAGE_PRODUCT_VERSION: case GRAPPLE_MESSAGE_RELAY_ALL: case GRAPPLE_MESSAGE_RELAY_ALL_BUT_SELF: case GRAPPLE_MESSAGE_PASSWORD: case GRAPPLE_MESSAGE_FAILOVER_TRYME: case GRAPPLE_MESSAGE_REQUEST_NEXT_GROUPID: case GRAPPLE_MESSAGE_YOU_ARE_HOST: //This one only used internally case GRAPPLE_MESSAGE_RECONNECTION: //Never received by the client break; } } //Here we process the data that has been sent to the clients TCP port static int process_user_indata_tcp(internal_client_data *client) { const void *data,*ptr; void *pulldata,*pullptr; int length,messagelength; intchar indata; grapple_messagetype_internal messagetype; int count=0; //We will return as soon as there is no more data, so we can loop forever while (1) { //Initially only VIEW the data, dont take it length=socket_indata_length(client->sock); //There must be at least 8 bytes for the data, that is the minimum //amount of data a packet can contain if (length<8) return count; data=socket_indata_view(client->sock); ptr=data; //Data is of the form: //4 bytes: Message type //4 bytes: Message length // DATA memcpy(indata.c,ptr,4); ptr+=4; messagetype=ntohl(indata.i); memcpy(indata.c,ptr,4); ptr+=4; messagelength=ntohl(indata.i); //Check there is enough in the buffer for the whole message if (length < messagelength+8) return count; //We have enough for the whole message, grab it pulldata=socket_indata_pull(client->sock,messagelength+8); //Move to the start of the data pullptr=pulldata+8; //Process the message process_message(client,messagetype,pullptr,messagelength); //Free the data we took free(pulldata); count++; } return count; } //Here we process the data that has been sent to the clients UDP port static int process_user_indata_udp(internal_client_data *client) { socket_udp_data *pulldata; int messagelength; intchar indata; grapple_messagetype_internal messagetype; int count=0; char *ptr; //Pull the next UDP packet from the socket pulldata=socket_udp_indata_pull(client->sock); //Continue while there is data to read while (pulldata) { //Data is of the form: //4 bytes: Message type //4 bytes: Message length // DATA ptr=pulldata->data; memcpy(indata.c,ptr,4); messagetype=ntohl(indata.i); ptr+=4; memcpy(indata.c,ptr,4); messagelength=ntohl(indata.i); ptr+=4; //Process the message process_message(client,messagetype,ptr,messagelength); //Free the data struct we were passed socket_udp_data_free(pulldata); count++; //Try and get another pulldata=socket_udp_indata_pull(client->sock); } return count; } //This function sends the outbound data queues to the socket static int process_message_out_queue_tcp(internal_client_data *client) { grapple_queue *data; int count=0; //Write ALL the data at once while (client->message_out_queue) { pthread_mutex_lock(&client->message_out_mutex); data=client->message_out_queue; if (!data) { pthread_mutex_unlock(&client->message_out_mutex); return count; } client->message_out_queue=queue_unlink(client->message_out_queue, data); pthread_mutex_unlock(&client->message_out_mutex); //We now have the message data to send socket_write(client->sock, data->data,data->length); free(data->data); free(data); count++; } return count; } //Process the users outbound UDP data static int process_message_out_queue_udp(internal_client_data *client) { grapple_queue *data; int count=0; //Continue while there is data to send while (client->message_out_queue) { pthread_mutex_lock(&client->message_out_mutex); data=client->message_out_queue; if (!data) { pthread_mutex_unlock(&client->message_out_mutex); return count; } client->message_out_queue=queue_unlink(client->message_out_queue, data); pthread_mutex_unlock(&client->message_out_mutex); //We now have the message data to send. It may be reliable or unreliable if (data->reliablemode) socket_write_reliable(client->sock, data->data,data->length); else socket_write(client->sock, data->data,data->length); free(data->data); free(data); count++; } return count; } //This is the main data processing function for TCP/IP links static void grapple_client_thread_tcp(internal_client_data *client) { int count=0; int sockcount; //If there are any messages to send out if (client->message_out_queue) //Send them count=process_message_out_queue_tcp(client); //Actually process the socket - this function actually sends and receives //the data from the network sockcount=socket_process_sockets(client->socklist,client->timeout); //If the socket has died if (socket_dead(client->sock)) { //The server is dead so try and failover if possible if (client->failover && client->failoverhosts) { //FAILOVER! client_run_failover(client); } else { //The server link is dead, and no failover is offered if (!client->disconnected) { //Set the client to kill itself c2CUQ_send_int(client,GRAPPLE_MESSAGE_SERVER_DISCONNECTED,0); client->threaddestroy=1; client->disconnected=1; } } } else { //The socket is still alive in this branch if (sockcount) { //Process incoming data into the users inbound queue count+=process_user_indata_tcp(client); } count+=sockcount; //If after all the processing, we have nothing to do, we set the next //loop to have a longer timeout on the socket processing, meaning that //if something DOES come in and interrupt, then we can return //immediately, otherwise we will queue for up to 1/20th of a second //doing nothing if (!count) client->timeout=100000; else client->timeout=0; } } //This is the main data processing function for 2 way UDP/IP links static void grapple_client_thread_udp(internal_client_data *client) { int count=0; int sockcount; //If there are any messages to send out if (client->message_out_queue) //Send them count=process_message_out_queue_udp(client); //Actually process the socket - this function actually sends and receives //the data from the network sockcount=socket_process_sockets(client->socklist,client->timeout); //If the socket has died if (socket_dead(client->sock)) { //The server is dead so try and failover if possible if (client->failover && client->failoverhosts) { //FAILOVER! client_run_failover(client); } else { //The server link is dead, and no failover is offered if (!client->disconnected) { //Set the client to kill itself c2CUQ_send_int(client,GRAPPLE_MESSAGE_SERVER_DISCONNECTED,0); client->threaddestroy=1; client->disconnected=1; } //If this socket is still trying to connect, it is dead, too late if (client->connecting) { // c2CUQ_send_int(client,GRAPPLE_MESSAGE_SERVER_DISCONNECTED,0); // client->connecting=0; // client->threaddestroy=1; // client->disconnected=1; } } } else { //The socket is alive in this branch if (client->connecting) { if (socket_connected(client->sock)) { //We have finished connecting, now we can do stuff client->connecting=0; //The connection was OK - send a handshake c2s_handshake(client); //If we have a requested name, send the name to the server pthread_mutex_lock(&client->internal_mutex); if (client->name_provisional) c2s_set_name(client,client->name_provisional); pthread_mutex_unlock(&client->internal_mutex); } } if (sockcount) { //Process incoming data into the users inbound queue count+=process_user_indata_udp(client); } count+=sockcount; //If after all the processing, we have nothing to do, we set the next //loop to have a longer timeout on the socket processing, meaning that //if something DOES come in and interrupt, then we can return //immediately, otherwise we will queue for up to 1/20th of a second //doing nothing if (!count) client->timeout=100000; else client->timeout=0; } } //This is the function that is called when the server thread starts. It loops //while the thread is alive, and cleans up some when it dies static void *grapple_client_thread_main(void *voiddata) { internal_client_data *data; int finished=0; grapple_queue *target; grapple_connection *user; grapple_callback_dispatcher *tmpdispatcher; grapple_failover_host *failover; internal_grapple_group *group; struct sigaction sa; sa.sa_handler = SIG_IGN; sa.sa_flags = 0; sigaction(SIGPIPE, &sa, 0); //The client we have started data=(internal_client_data *)voiddata; //Immediately, before anything else, create the dispatcher process //The dispatcher is a new thread that has messages passed to it for event //handling. This allows events to be called asynchronously, and not slow //down this handling thread which is pretty important to keep running //smoothly. For more information see grapple_dispatcher.c data->dispatcher=grapple_callback_dispatcher_create(); //Link the main incoming socket into the list of sockets to process. data->socklist=socket_link(data->socklist,data->sock); //Link the wakeup socket into the list of sockets to process. data->socklist=socket_link(data->socklist,data->wakesock); //Continue while we are not finished while (!finished) { //Process the thread data via either the TCP or UDP handler switch (data->protocol) { case GRAPPLE_PROTOCOL_TCP: grapple_client_thread_tcp(data); break; case GRAPPLE_PROTOCOL_UDP: grapple_client_thread_udp(data); break; } if (data->threaddestroy) { //We have been told to end the thread finished=1; pthread_mutex_lock(&data->message_out_mutex); //Try and quickly send all remaining messages, as we have to //try and send the disconnect message... switch (data->protocol) { case GRAPPLE_PROTOCOL_TCP: while (data->message_out_queue && !socket_dead(data->sock)) { process_message_out_queue_tcp(data); if (socket_outdata_length(data->sock)>0 && !socket_dead(data->sock)) { //Try and push the data down the socket. We do this here //as well as a little below so that we can try and give //the kernel as much time as possible to send the data socket_process(data->sock,0); } } break; case GRAPPLE_PROTOCOL_UDP: while (data->message_out_queue && !socket_dead(data->sock)) { process_message_out_queue_udp(data); if (socket_outdata_length(data->sock)>0 && !socket_dead(data->sock)) { //Try and push the data down the socket. We do this here //as well as a little below so that we can try and give //the kernel as much time as possible to send the data socket_process(data->sock,0); } } break; } pthread_mutex_unlock(&data->message_out_mutex); //While the socket is still alive, try and shove the remaining //data down the socket while (socket_outdata_length(data->sock)>0 && !socket_dead(data->sock)) { socket_process(data->sock,0); } //Get rid of the socket now data->socklist=socket_unlink(data->socklist,data->sock); socket_destroy(data->sock); data->sock=NULL; //And the wake socket if it existed pthread_mutex_lock(&data->internal_mutex); if (data->wakesock) { data->socklist=socket_unlink(data->socklist,data->wakesock); socket_destroy(data->wakesock); data->wakesock=NULL; } pthread_mutex_unlock(&data->internal_mutex); //And the failover socket if it existed - its a bit late now if (data->failoversock) { socket_destroy(data->failoversock); data->failoversock=NULL; } //Remove anything left in the outbound queue pthread_mutex_lock(&data->message_out_mutex); while (data->message_out_queue) { target=data->message_out_queue; data->message_out_queue=queue_unlink(data->message_out_queue, data->message_out_queue); queue_struct_dispose(target); } pthread_mutex_unlock(&data->message_out_mutex); //Clear the userlist while (data->userlist) { user=data->userlist; pthread_mutex_lock(&data->connection_mutex); data->userlist=connection_unlink(data->userlist,data->userlist); pthread_mutex_unlock(&data->connection_mutex); connection_struct_dispose(user); } //Delete all callbacks pthread_mutex_lock(&data->callback_mutex); while (data->callbackanchor) { data->callbackanchor=grapple_callback_remove(data->callbackanchor, data->callbackanchor->type); } pthread_mutex_unlock(&data->callback_mutex); //Now kill the callback dispatcher thread tmpdispatcher=data->dispatcher; data->dispatcher=NULL; tmpdispatcher->finished=1; //Remove the failover hosts pthread_mutex_lock(&data->failover_mutex); while (data->failoverhosts) { failover=data->failoverhosts; data->failoverhosts=failover_unlink(data->failoverhosts, data->failoverhosts); failover_dispose(failover); } pthread_mutex_unlock(&data->failover_mutex); //Remove all the message groups pthread_mutex_lock(&data->group_mutex); while (data->groups) { group=data->groups; data->groups=group_unlink(data->groups, data->groups); group_dispose(group); } pthread_mutex_unlock(&data->group_mutex); } } //We're done, the thread ends when this function ends data->threaddestroy=0; data->thread=0; return NULL; } //Function called by the grapple_client_start function to actually start the //thread int grapple_client_thread_start(internal_client_data *data) { int createval; data->threaddestroy=0; createval=-1; //Create the thread while(createval!=0) { createval=pthread_create(&data->thread,NULL, grapple_client_thread_main,(void *)data); if (createval!=0) { if (errno!=EAGAIN) { //Problem creating the thread that isnt a case of 'it will work //later, dont create it return -1; } } } pthread_detach(data->thread); return 1; } pong2-0.1.3/src/grapple/grapple_queue.h0000644000175000001440000000253710473646146014727 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_QUEUE_H #define GRAPPLE_QUEUE_H #include "grapple_structs.h" extern grapple_queue *queue_link(grapple_queue *,grapple_queue *); extern grapple_queue *queue_struct_aquire(void); extern grapple_queue *queue_unlink(grapple_queue *,grapple_queue *); extern void queue_struct_dispose(grapple_queue *); extern int grapple_queue_count(grapple_queue *); extern int grapple_queue_spare_init(void); extern int grapple_queue_spare_cleanup(void); #endif pong2-0.1.3/src/grapple/grapple_client.h0000644000175000001440000001001610473646146015050 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_CLIENT_H #define GRAPPLE_CLIENT_H #include "grapple_callback.h" #include "grapple_error.h" #include "grapple_protocols.h" #include "grapple_message.h" #include "grapple_types.h" #ifdef __cplusplus extern "C" { #endif extern grapple_client grapple_client_init(const char *,const char *); extern int grapple_client_address_set(grapple_client,const char *); extern int grapple_client_port_set(grapple_client,int); extern int grapple_client_protocol_set(grapple_client,grapple_protocol); extern int grapple_client_password_set(grapple_client,const char *); extern int grapple_client_start(grapple_client,int); extern int grapple_client_stop(grapple_client); extern int grapple_client_destroy(grapple_client); extern int grapple_client_connected(grapple_client); extern int grapple_client_name_set(grapple_client,const char *); extern int grapple_client_messagecount_get(grapple_client); extern int grapple_client_messages_waiting(grapple_client); extern char *grapple_client_session_get(grapple_client); extern int grapple_client_sequential_set(grapple_client,int); extern int grapple_client_sequential_get(grapple_client); extern grapple_message *grapple_client_message_pull(grapple_client); extern grapple_confirmid grapple_client_send(grapple_client, grapple_user, int,void *,int); extern grapple_user *grapple_client_userlist_get(grapple_client); extern int grapple_client_callback_set(grapple_client, grapple_messagetype, grapple_callback, void *); extern int grapple_client_callback_setall(grapple_client, grapple_callback, void *); extern int grapple_client_callback_unset(grapple_client, grapple_messagetype); extern grapple_client grapple_client_default_get(void); extern char *grapple_client_name_get(grapple_client,grapple_user); extern int grapple_client_enumusers(grapple_client, grapple_user_enum_callback, void *); extern int grapple_client_enumgroup(grapple_client, grapple_user, grapple_user_enum_callback, void *); extern int grapple_client_enumgrouplist(grapple_client, grapple_user_enum_callback, void *); extern int grapple_client_ping(grapple_client); extern double grapple_client_ping_get(grapple_client,grapple_user); extern grapple_user grapple_client_serverid_get(grapple_client); extern grapple_user grapple_client_group_create(grapple_client,const char *); extern int grapple_client_group_add(grapple_client,grapple_user, grapple_user); extern int grapple_client_group_remove(grapple_client,grapple_user, grapple_user); extern int grapple_client_group_delete(grapple_client,grapple_user); extern grapple_user grapple_client_group_from_name(grapple_client, const char *); extern grapple_user *grapple_client_groupusers_get(grapple_client, grapple_user); extern grapple_user *grapple_client_grouplist_get(grapple_client); extern char *grapple_client_groupname_get(grapple_client,grapple_user); extern grapple_error grapple_client_error_get(grapple_client); #ifdef __cplusplus } #endif #endif pong2-0.1.3/src/grapple/grapple_message_internal.h0000644000175000001440000000256410473646146017123 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_MESSAGE_INTERNAL_H #define GRAPPLE_MESSAGE_INTERNAL_H #include "grapple_structs.h" #include "grapple_message.h" extern grapple_message *server_convert_message_for_user(grapple_queue *); extern grapple_message *client_convert_message_for_user(grapple_queue *); extern grapple_messagetype grapple_message_convert_to_usermessage_enum(grapple_messagetype_internal); extern int grapple_message_spare_init(void); extern int grapple_message_spare_cleanup(void); #endif pong2-0.1.3/src/grapple/grapple_error_internal.h0000644000175000001440000000225510473646146016625 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_ERROR_INTERNAL_H #define GRAPPLE_ERROR_INTERNAL_H #include "grapple_error.h" #include "grapple_structs.h" extern void grapple_client_error_set(internal_client_data *,grapple_error); extern void grapple_server_error_set(internal_server_data *,grapple_error); #endif pong2-0.1.3/src/grapple/grapple_connection.h0000644000175000001440000000367210473646146015743 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_CONNECTION_H #define GRAPPLE_CONNECTION_H #include "grapple_client_internal.h" #include "grapple_server_internal.h" #include "grapple_structs.h" #include "socket.h" extern int connection_client_add(internal_client_data *,int,int); extern int connection_server_add(internal_server_data *,socketbuf *); extern int connection_client_rename(internal_client_data *,int,char *); extern grapple_connection *connection_from_serverid(grapple_connection *,int); extern void connection_struct_dispose(grapple_connection *); extern grapple_connection *connection_unlink(grapple_connection *, grapple_connection *); extern int connection_client_remove_by_id(internal_client_data *,int); extern int *connection_client_intarray_get(internal_client_data *); extern int *connection_server_intarray_get(internal_server_data *); extern int connection_client_count(internal_client_data *); extern int connection_server_count(internal_server_data *); extern int grapple_connection_spare_init(void); extern int grapple_connection_spare_cleanup(void); #endif pong2-0.1.3/src/grapple/grapple_comms_api.c0000644000175000001440000006355510473646146015554 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include #include #include "grapple_comms_api.h" #include "grapple_comms.h" #include "grapple_client_internal.h" #include "grapple_defines.h" #include "grapple_internal.h" #include "grapple_confirm.h" /* Most of the functions in this file are simply taking data from one form and moving it onto a message queue. As such Im not going to comment each small detail, just overviers*/ //Conventions in this file for function names /* c2s is a function sending data from the client to the server s2c is sending from the server to the client s2SUQ is sending data from the server to the servers user queue c2CUQ is sending data from the client to the clients user queue */ //Send the hardcoded version of this library to the server static int c2s_handshake_send_grapple_version(internal_client_data *client) { int reliable; int returnval; reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send(client,GRAPPLE_MESSAGE_GRAPPLE_VERSION, GRAPPLE_VERSION,strlen(GRAPPLE_VERSION)); client->reliablemode=reliable; return returnval; } //Send the name of the game we are playing static int c2s_handshake_send_product_name(internal_client_data *client) { int reliable; int returnval; reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send(client,GRAPPLE_MESSAGE_PRODUCT_NAME, client->productname, strlen(client->productname)); client->reliablemode=reliable; return returnval; } //Send the version of the game we are playing static int c2s_handshake_send_product_version(internal_client_data *client) { int reliable; int returnval; reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send(client,GRAPPLE_MESSAGE_PRODUCT_VERSION, client->productversion, strlen(client->productversion)); client->reliablemode=reliable; return returnval; } //Send the password - if there is one, otherwise an empty string static int c2s_handshake_send_password(internal_client_data *client) { int reliable; int returnval; const char *password; int len; if (client->password && *client->password) { password=client->password; len=strlen(client->password); } else { password=""; len=0; } reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send(client,GRAPPLE_MESSAGE_PASSWORD, password,len); client->reliablemode=reliable; return returnval; } //Run the whole handshake, calling the subfunctions int c2s_handshake(internal_client_data *client) { if (!c2s_handshake_send_grapple_version(client)) return 0; if (!c2s_handshake_send_product_name(client)) return 0; if (!c2s_handshake_send_product_version(client)) return 0; if (!c2s_handshake_send_password(client)) return 0; return 1; } //Client ping the server int c2s_ping(internal_client_data *client,int number) { int reliable; int returnval; reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send_int(client,GRAPPLE_MESSAGE_PING,number); client->reliablemode=reliable; return returnval; } //Client has been pinged by the server, replying int c2s_pingreply(internal_client_data *client,int number) { int reliable; int returnval; reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send_int(client,GRAPPLE_MESSAGE_PING_REPLY,number); client->reliablemode=reliable; return returnval; } //Server letting the client know their handshake failed int s2c_handshake_failed(internal_server_data *server, grapple_connection *user) { int reliable; int returnval; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send_int(server,user,GRAPPLE_MESSAGE_HANDSHAKE_FAILED,0); user->reliablemode=reliable; return returnval; } //Server letting the client know their password was wrong int s2c_password_failed(internal_server_data *server,grapple_connection *user) { int reliable; int returnval; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send_int(server,user,GRAPPLE_MESSAGE_PASSWORD_FAILED,0); user->reliablemode=reliable; return returnval; } //Server letting the client know that the server is closed to new connections int s2c_server_closed(internal_server_data *server,grapple_connection *user) { int reliable; int returnval; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send_int(server,user,GRAPPLE_MESSAGE_SERVER_CLOSED,0); user->reliablemode=reliable; return returnval; } //Server letting the client know the server is full, cant connect int s2c_server_full(internal_server_data *server,grapple_connection *user) { int reliable; int returnval; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send_int(server,user,GRAPPLE_MESSAGE_SERVER_FULL,0); user->reliablemode=reliable; return returnval; } //Server sending the name of the session to a client int s2c_session_name(internal_server_data *server, grapple_connection *user,const char *session) { int reliable; int returnval; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send(server,user,GRAPPLE_MESSAGE_SESSION_NAME, session,strlen(session)); user->reliablemode=reliable; return returnval; } //Server letting a client know a user has connected int s2c_user_connected(internal_server_data *server, grapple_connection *target,grapple_connection *user) { int reliable; int returnval; if (!user->handshook) return 0; reliable=target->reliablemode; target->reliablemode=1; if (target==user) { returnval=s2c_send_int(server,target,GRAPPLE_MESSAGE_USER_YOU_CONNECTED, user->serverid); } else returnval=s2c_send_int(server,target,GRAPPLE_MESSAGE_USER_CONNECTED, user->serverid); target->reliablemode=reliable; return returnval; } //Client sending their name to the server int c2s_set_name(internal_client_data *client,const char *name) { int reliable; int returnval; reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send(client,GRAPPLE_MESSAGE_USER_NAME, name, strlen(name)); client->reliablemode=reliable; return returnval; } //Server letting a client know of someone elses name int s2c_user_setname(internal_server_data *server, grapple_connection *target,grapple_connection *user) { //Assemble new data that contains the ID and then the name void *data; intchar serverid; int returnval; int reliable; data=(void *)malloc(strlen(user->name)+4); serverid.i=htonl(user->serverid); memcpy(data,serverid.c,4); memcpy(data+4,user->name,strlen(user->name)); reliable=target->reliablemode; target->reliablemode=1; returnval=s2c_send(server,target,GRAPPLE_MESSAGE_USER_NAME, data, strlen(user->name)+4); target->reliablemode=reliable; free(data); return returnval; } //Server telling the calling program that a user has set their name int s2SUQ_user_setname(internal_server_data *server,grapple_connection *user) { //Assemble new data that contains the ID and then the name return s2SUQ_send(server, user->serverid, GRAPPLE_MESSAGE_USER_NAME, user->name, strlen(user->name)); } //Server telling the calling program that a message has been confirmed int s2SUQ_confirm_received(internal_server_data *server,int messageid) { //Assemble new data that contains the ID of the completed message return s2SUQ_send_int(server, 0, GRAPPLE_MESSAGE_CONFIRM_RECEIVED, messageid); } //Server telling the calling program that a user has disconnected int s2SUQ_user_disconnect(internal_server_data *server, grapple_connection *user) { //Assemble new data that contains the ID and then the name return s2SUQ_send_int(server, user->serverid, GRAPPLE_MESSAGE_USER_DISCONNECTED, user->serverid); } //Server telling the calling program that some users didnt receive a message int s2SUQ_confirm_timeout(internal_server_data *server,grapple_confirm *conf) { char *outdata; intchar val; int size,loopa; int returnval; //This is the most complex message we have //We need to send the message ID, the number of failuers and then the list //of failures size=conf->receivercount+2; size*=4; outdata=(char *)malloc(size); val.i=conf->messageid; memcpy(outdata,val.c,4); val.i=conf->receivercount; memcpy(outdata+4,val.c,4); for (loopa=0;loopareceivercount;loopa++) { val.i=conf->receivers[loopa]; memcpy(outdata+(loopa*4)+8,val.c,4); } returnval=s2SUQ_send(server, 0, GRAPPLE_MESSAGE_CONFIRM_TIMEOUT, outdata, size); free(outdata); return returnval; } //Server sending a user message to a client int s2c_message(internal_server_data *server, grapple_connection *user,int flags,int messageid, void *data,int datalen) { int reliable,returnval; char *outdata; intchar val; if (!user->handshook) { return 0; } reliable=user->reliablemode; if (flags & GRAPPLE_RELIABLE) user->reliablemode=1; outdata=(char *)malloc(datalen+8); val.i=flags; memcpy(outdata,val.c,4); val.i=htonl(messageid); memcpy(outdata+4,val.c,4); memcpy(outdata+8,data,datalen); returnval=s2c_send(server,user,GRAPPLE_MESSAGE_USER_MESSAGE, outdata,datalen+8); free(outdata); user->reliablemode=reliable; if (flags & GRAPPLE_CONFIRM) server_register_confirm(server,messageid,user->serverid); return returnval; } //Client sending a user message to the server int c2s_message(internal_client_data *client,int flags,grapple_confirmid id, void *data,int datalen) { char *outdata; intchar val; int returnval,reliable; reliable=client->reliablemode; if (flags & GRAPPLE_RELIABLE) client->reliablemode=1; outdata=(char *)malloc(datalen+8); val.i=flags; memcpy(outdata,val.c,4); val.i=htonl(id); memcpy(outdata+4,val.c,4); memcpy(outdata+8,data,datalen); returnval=c2s_send(client,GRAPPLE_MESSAGE_USER_MESSAGE,outdata,datalen+8); free(outdata); client->reliablemode=reliable; return returnval; } //Client asking the server to relay a message to another client int c2s_relaymessage(internal_client_data *client,int target, int flags,grapple_confirmid id, void *data,int datalen) { char *outdata; intchar val; int returnval,reliable; reliable=client->reliablemode; if (flags & GRAPPLE_RELIABLE) client->reliablemode=1; outdata=(char *)malloc(datalen+12); val.i=htonl(target); memcpy(outdata,val.c,4); val.i=flags; memcpy(outdata+4,val.c,4); val.i=htonl(id); memcpy(outdata+8,val.c,4); memcpy(outdata+12,data,datalen); returnval=c2s_send(client,GRAPPLE_MESSAGE_RELAY_TO,outdata,datalen+12); free(outdata); client->reliablemode=reliable; return returnval; } //Client asking the server to relay a message to everyone int c2s_relayallmessage(internal_client_data *client, int flags,grapple_confirmid id, void *data,int datalen) { char *outdata; intchar val; int returnval,reliable; reliable=client->reliablemode; if (flags & GRAPPLE_RELIABLE) client->reliablemode=1; outdata=(char *)malloc(datalen+8); val.i=flags; memcpy(outdata,val.c,4); val.i=htonl(id); memcpy(outdata+4,val.c,4); memcpy(outdata+8,data,datalen); returnval=c2s_send(client,GRAPPLE_MESSAGE_RELAY_ALL,outdata,datalen+8); free(outdata); client->reliablemode=reliable; return returnval; } //Client asking the server to relay a message to everyone but themselves int c2s_relayallbutselfmessage(internal_client_data *client, int flags,grapple_confirmid id, void *data,int datalen) { char *outdata; intchar val; int returnval,reliable; reliable=client->reliablemode; if (flags & GRAPPLE_RELIABLE) client->reliablemode=1; outdata=(char *)malloc(datalen+8); val.i=flags; memcpy(outdata,val.c,4); val.i=htonl(id); memcpy(outdata+4,val.c,4); memcpy(outdata+8,data,datalen); returnval=c2s_send(client,GRAPPLE_MESSAGE_RELAY_ALL_BUT_SELF, outdata,datalen+8); free(outdata); client->reliablemode=reliable; return returnval; } //Client letting the server know they are disconnecting int c2s_disconnect(internal_client_data *client) { int reliable,returnval; reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send(client,GRAPPLE_MESSAGE_USER_DISCONNECTED,"",0); client->reliablemode=reliable; return returnval; } //Client is requesting a group ID from the server int c2s_request_group(internal_client_data *client) { int reliable,returnval; reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send(client,GRAPPLE_MESSAGE_REQUEST_NEXT_GROUPID,"",0); client->reliablemode=reliable; return returnval; } //Client is creating a group, and informing the server int c2s_group_create(internal_client_data *client,int id,const char *name) { int returnval; int reliable,length; intchar val; char *outdata; length=strlen(name); outdata=(char *)malloc(length+4); val.i=htonl(id); memcpy(outdata,val.c,4); memcpy(outdata+4,name,length); reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send(client,GRAPPLE_MESSAGE_GROUP_CREATE,outdata,length+4); client->reliablemode=reliable; free(outdata); return returnval; } //Client informing the server of the user they just added to the group int c2s_group_add(internal_client_data *client,int group,int add) { char outdata[8]; intchar val; int reliable,returnval; reliable=client->reliablemode; client->reliablemode=1; val.i=htonl(group); memcpy(outdata,val.c,4); val.i=htonl(add); memcpy(outdata+4,val.c,4); returnval=c2s_send(client,GRAPPLE_MESSAGE_GROUP_ADD,outdata,8); client->reliablemode=reliable; return returnval; } //Client informing the server of the user they removed FROM the group int c2s_group_remove(internal_client_data *client,int group,int removeid) { char outdata[8]; intchar val; int reliable,returnval; reliable=client->reliablemode; client->reliablemode=1; val.i=htonl(group); memcpy(outdata,val.c,4); val.i=htonl(removeid); memcpy(outdata+4,val.c,4); returnval=c2s_send(client,GRAPPLE_MESSAGE_GROUP_REMOVE,outdata,8); client->reliablemode=reliable; return returnval; } //Client letting the server know they deleted a group int c2s_group_delete(internal_client_data *client,int id) { int reliable,returnval; reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send_int(client,GRAPPLE_MESSAGE_GROUP_DELETE,id); client->reliablemode=reliable; return returnval; } //Client tellign the server they cant failover int c2s_failover_cant(internal_client_data *client) { int reliable,returnval; reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send(client,GRAPPLE_MESSAGE_FAILOVER_CANT,"",0); client->reliablemode=reliable; return returnval; } //client letting the server know they THINK they can failover and asking the //server to test it int c2s_failover_tryme(internal_client_data *client) { int reliable,returnval; reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send(client,GRAPPLE_MESSAGE_FAILOVER_TRYME,"",0); client->reliablemode=reliable; return returnval; } //Client telling the new server they are a reconnecting user int c2s_send_reconnection(internal_client_data *client) { int reliable,returnval; char *outdata; intchar val; int length; length=strlen(client->name); outdata=(char *)malloc(length+8); val.i=htonl(client->serverid); memcpy(outdata,val.c,4); val.i=htonl(length); memcpy(outdata+4,val.c,4); memcpy(outdata+8,client->name,length); reliable=client->reliablemode; client->reliablemode=1; returnval=c2s_send(client,GRAPPLE_MESSAGE_RECONNECTION,outdata,length+8); client->reliablemode=reliable; return returnval; } //Client telling the server they have received the message that the server //requested they confirm int c2s_confirm_received(internal_client_data *client,int from,int messageid) { int returnval; int reliable; intchar val; char outdata[8]; reliable=client->reliablemode; client->reliablemode=1; val.i=htonl(from); memcpy(outdata,val.c,4); val.i=htonl(messageid); memcpy(outdata+4,val.c,4); returnval=c2s_send(client,GRAPPLE_MESSAGE_CONFIRM_RECEIVED,outdata,8); client->reliablemode=reliable; return returnval; } //Server relaying a user message to a client int s2c_relaymessage(internal_server_data *server, grapple_connection *user,grapple_connection *origin, int flags,int messageid, void *data,int datalen) { char *outdata; intchar val; int returnval,reliable; if (!user->handshook) return 0; outdata=(char *)malloc(datalen+12); val.i=htonl(origin->serverid); memcpy(outdata,val.c,4); val.i=flags; memcpy(outdata+4,val.c,4); val.i=htonl(messageid); memcpy(outdata+8,val.c,4); memcpy(outdata+12,data,datalen); reliable=user->reliablemode; if (flags & GRAPPLE_RELIABLE) user->reliablemode=1; returnval=s2c_send(server,user,GRAPPLE_MESSAGE_RELAY_TO,outdata,datalen+12); user->reliablemode=reliable; free(outdata); if (flags & GRAPPLE_CONFIRM) register_confirm(origin,messageid,user->serverid); return returnval; } //Server informing a client that someone else has disconnected int s2c_inform_disconnect(internal_server_data *server, grapple_connection *user,grapple_connection *target) { int reliable; int returnval; if (!user->handshook && user!=target) return 0; reliable=target->reliablemode; target->reliablemode=1; returnval=s2c_send_int(server,user,GRAPPLE_MESSAGE_USER_DISCONNECTED, target->serverid); target->reliablemode=reliable; return returnval; } //Server pinging a client int s2c_ping(internal_server_data *server,grapple_connection *user,int number) { int reliable; int returnval; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send_int(server,user,GRAPPLE_MESSAGE_PING,number); user->reliablemode=reliable; return returnval; } //Server replying to a ping sent by a client int s2c_pingreply(internal_server_data *server, grapple_connection *user,int number) { int reliable; int returnval; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send_int(server,user,GRAPPLE_MESSAGE_PING_REPLY,number); user->reliablemode=reliable; return returnval; } //Server is disconnecting int s2c_disconnect(internal_server_data *server,grapple_connection *user) { int reliable; int returnval; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send(server,user,GRAPPLE_MESSAGE_SERVER_DISCONNECTED,"",0); user->reliablemode=reliable; return returnval; } //Server sending ping data to a client about someone elses ping times int s2c_ping_data(internal_server_data *server, grapple_connection *target,grapple_connection *about) { int returnval; intchar val; char data[50]; int reliable; if (!target->handshook) return 0; val.i=htonl(about->serverid); memcpy(data,val.c,4); sprintf(data+4,"%f",about->pingtime); reliable=target->reliablemode; target->reliablemode=1; returnval=s2c_send(server,target,GRAPPLE_MESSAGE_PING_DATA,data, strlen(data+4)+4); target->reliablemode=reliable; return returnval; } //Server requests the client turn off failover int s2c_failover_off(internal_server_data *server,grapple_connection *user) { int returnval; int reliable; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send(server,user,GRAPPLE_MESSAGE_FAILOVER_OFF,"",0); user->reliablemode=reliable; return returnval; } //Server requests the client turn ON failover int s2c_failover_on(internal_server_data *server,grapple_connection *user) { int returnval; int reliable; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send(server,user,GRAPPLE_MESSAGE_FAILOVER_ON,"",0); user->reliablemode=reliable; return returnval; } //Server notifying the client they cant failover int s2c_failover_cant(internal_server_data *server, grapple_connection *user,int id) { int returnval; int reliable; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send_int(server,user,GRAPPLE_MESSAGE_FAILOVER_CANT,id); user->reliablemode=reliable; return returnval; } //Server notifying a client that an address can be used to failover to int s2c_failover_can(internal_server_data *server, grapple_connection *user,int id,const char *host) { int returnval; int reliable,length; intchar val; char *outdata; if (!user->handshook) return 0; length=strlen(host); outdata=(char *)malloc(length+8); val.i=htonl(id); memcpy(outdata,val.c,4); val.i=htonl(length); memcpy(outdata+4,val.c,4); memcpy(outdata+8,host,length); reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send(server,user,GRAPPLE_MESSAGE_FAILOVER_CAN, outdata,length+8); user->reliablemode=reliable; return returnval; } //Server sending a new group ID to a client int s2c_send_nextgroupid(internal_server_data *server, grapple_connection *user,int groupid) { int returnval; int reliable; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send_int(server,user,GRAPPLE_MESSAGE_NEXT_GROUPID,groupid); user->reliablemode=reliable; return returnval; } //Server has created a group, notify a client int s2c_group_create(internal_server_data *server, grapple_connection *user,int groupid,const char *name) { int returnval; int reliable,length; intchar val; char *outdata; if (!user->handshook) return 0; length=strlen(name); outdata=(char *)malloc(length+4); val.i=htonl(groupid); memcpy(outdata,val.c,4); memcpy(outdata+4,name,length); reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send(server,user,GRAPPLE_MESSAGE_GROUP_CREATE, outdata,length+4); user->reliablemode=reliable; free(outdata); return returnval; } //Server has added a user to a group, notify a client int s2c_group_add(internal_server_data *server, grapple_connection *user,int group,int add) { int returnval; int reliable; char outdata[8]; intchar val; if (!user->handshook) return 0; val.i=htonl(group); memcpy(outdata,val.c,4); val.i=htonl(add); memcpy(outdata+4,val.c,4); reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send(server,user,GRAPPLE_MESSAGE_GROUP_ADD,outdata,8); user->reliablemode=reliable; return returnval; } //Server has removed someone from a group, notify a client int s2c_group_remove(internal_server_data *server, grapple_connection *user,int group,int removeid) { int returnval; int reliable; char outdata[8]; intchar val; if (!user->handshook) return 0; val.i=htonl(group); memcpy(outdata,val.c,4); val.i=htonl(removeid); memcpy(outdata+4,val.c,4); reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send(server,user,GRAPPLE_MESSAGE_GROUP_REMOVE,outdata,8); user->reliablemode=reliable; return returnval; } //Server has deleted a group, notify a client int s2c_group_delete(internal_server_data *server, grapple_connection *user,int groupid) { int returnval; int reliable; if (!user->handshook) return 0; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send_int(server,user,GRAPPLE_MESSAGE_GROUP_DELETE,groupid); user->reliablemode=reliable; return returnval; } //Server is confirming to the client that a message has reached all of //its intended recipients int s2c_confirm_received(internal_server_data *server, grapple_connection *user,int messageid) { int returnval; int reliable; reliable=user->reliablemode; user->reliablemode=1; returnval=s2c_send_int(server,user,GRAPPLE_MESSAGE_CONFIRM_RECEIVED, messageid); user->reliablemode=reliable; return returnval; } //Server is notifying a client that a message didnt reach everyone it was //supposed to int s2c_confirm_timeout(internal_server_data *server, grapple_connection *user,grapple_confirm *conf) { char *outdata; intchar val; int size,loopa; int returnval; int reliable; reliable=user->reliablemode; user->reliablemode=1; //This is the most complex message we have //We need to send the message ID, the number of failuers and then the list //of failures size=conf->receivercount+2; size*=4; outdata=(char *)malloc(size); val.i=htonl(conf->messageid); memcpy(outdata,val.c,4); //This is the number of failed confirmations val.i=htonl(conf->receivercount); memcpy(outdata+4,val.c,4); //Loop through each remaining unreceived confirmation and add that ID //of that user to the list for (loopa=0;loopareceivercount;loopa++) { val.i=htonl(conf->receivers[loopa]); memcpy(outdata+(loopa*4)+8,val.c,4); } returnval=s2c_send(server,user,GRAPPLE_MESSAGE_CONFIRM_TIMEOUT,outdata,size); free(outdata); user->reliablemode=reliable; return returnval; } pong2-0.1.3/src/grapple/grapple_types.h0000644000175000001440000000207310473646146014742 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_TYPES_H #define GRAPPLE_TYPES_H typedef int grapple_client; typedef int grapple_server; typedef int grapple_user; typedef int grapple_confirmid; #endif pong2-0.1.3/src/grapple/tools.c0000644000175000001440000000275510473646146013226 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include #include #include #include #include #include #include #include "tools.h" //This is a replacement for usleep which is not in any way ANSI, it does //the same job. void microsleep(int usec) { fd_set fds; struct timeval tv; tv.tv_sec=0; tv.tv_usec=usec; FD_ZERO(&fds); //Select on no file descriptors, which means it will just wait, until that //time is up. Thus sleeping for a microsecond exact time. select(FD_SETSIZE,&fds,0,0,&tv); return; } pong2-0.1.3/src/grapple/grapple_lobbyconnection.c0000644000175000001440000000574410473646146016770 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include "grapple_lobby_internal.h" #include "grapple_lobbyconnection.h" //Create a lobbyconnection grapple_lobbyconnection *grapple_lobbyconnection_create() { grapple_lobbyconnection *returnval; returnval= (grapple_lobbyconnection *)calloc(1,sizeof(grapple_lobbyconnection)); return returnval; } //Delete a lobbyconnection and all associated memory int grapple_lobbyconnection_dispose(grapple_lobbyconnection *target) { if (target->name) free(target->name); free(target); return 0; } //Link a lobbyconnection into a linked list grapple_lobbyconnection *grapple_lobbyconnection_link(grapple_lobbyconnection *connection, grapple_lobbyconnection *item) { if (!connection) { item->next=item; item->prev=item; return item; } item->next=connection; item->prev=connection->prev; item->next->prev=item; item->prev->next=item; return connection; } //Remove a lobbyconnection from a linked list grapple_lobbyconnection *grapple_lobbyconnection_unlink(grapple_lobbyconnection *connection, grapple_lobbyconnection *item) { if (connection->next==connection) { return NULL; } item->next->prev=item->prev; item->prev->next=item->next; if (item==connection) connection=item->next; return connection; } //Locate the connection details of a user by their name grapple_lobbyconnection *grapple_lobbyconnection_locate_by_name(grapple_lobbyconnection *list, const char *name) { grapple_lobbyconnection *scan; scan=list; while (scan) { if (scan->name && !strcmp(scan->name,name)) //match return scan; scan=scan->next; if (scan==list) scan=NULL; } return NULL; } //Locate someones connection details by their ID grapple_lobbyconnection *grapple_lobbyconnection_locate_by_id(grapple_lobbyconnection *list, grapple_user id) { grapple_lobbyconnection *scan; scan=list; while (scan) { if (scan->id==id) //Match return scan; scan=scan->next; if (scan==list) scan=NULL; } return NULL; } pong2-0.1.3/src/grapple/grapple_failover.h0000644000175000001440000000310610473646146015403 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_FAILOVER_H #define GRAPPLE_FAILOVER_H #include "grapple_structs.h" extern grapple_failover_host *failover_aquire(void); extern void failover_dispose(grapple_failover_host *); extern grapple_failover_host *failover_unlink(grapple_failover_host *, grapple_failover_host *); extern grapple_failover_host *failover_link(grapple_failover_host *, grapple_failover_host *); extern grapple_failover_host *failover_link_by_id(grapple_failover_host *, int,const char *); extern grapple_failover_host *failover_unlink_by_id(grapple_failover_host *, int); extern grapple_failover_host *failover_locate_lowest_id(grapple_failover_host *); #endif pong2-0.1.3/src/grapple/grapple_error.c0000644000175000001440000000542410473646146014725 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include "grapple_error.h" #include "grapple_error_internal.h" #include "grapple_structs.h" //A local global variable that stores the last grapple error //Set the error void grapple_client_error_set(internal_client_data *client,grapple_error error) { client->last_error=error; } void grapple_server_error_set(internal_server_data *server,grapple_error error) { server->last_error=error; } //Set a text representation of the error const char *grapple_error_text(grapple_error error) { switch (error) { case GRAPPLE_NO_ERROR: return "No error"; break; case GRAPPLE_ERROR_NOT_INITIALISED: return "Attempt to use function before initialisation"; break; case GRAPPLE_ERROR_SERVER_CONNECTED: return "Server is already connected"; break; case GRAPPLE_ERROR_SERVER_NOT_CONNECTED: return "Server is not connected"; break; case GRAPPLE_ERROR_CLIENT_CONNECTED: return "Client is already connected"; break; case GRAPPLE_ERROR_CLIENT_NOT_CONNECTED: return "Client is not connected"; break; case GRAPPLE_ERROR_ADDRESS_NOT_SET: return "Connection address not set"; break; case GRAPPLE_ERROR_PORT_NOT_SET: return "Port number not set"; break; case GRAPPLE_ERROR_NAME_NOT_SET: return "Name not set"; break; case GRAPPLE_ERROR_NAME_NOT_UNIQUE: return "Name not unique"; break; case GRAPPLE_ERROR_SESSION_NOT_SET: return "Session name not set"; break; case GRAPPLE_ERROR_PROTOCOL_NOT_SET: return "Protocol not set"; break; case GRAPPLE_ERROR_CANNOT_CONNECT: return "Cannot connect to server"; break; case GRAPPLE_ERROR_NO_SUCH_USER: return "No such user"; break; case GRAPPLE_ERROR_SERVER_CANNOT_BIND_SOCKET: return "Server cannot bind socket"; break; } return "Unknown error"; } pong2-0.1.3/src/grapple/grapple_internal.h0000644000175000001440000000175610473646146015421 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_INTERNAL_H #define GRAPPLE_INTERNAL_H #define GRAPPLE_VERSION "1.0" #endif pong2-0.1.3/src/grapple/grapple_comms.c0000644000175000001440000002011510473646146014704 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include #include #include #include "grapple_comms.h" #include "grapple_queue.h" #include "grapple_callback_internal.h" //Put the headers onto the data static void *data_assemble(grapple_messagetype_internal message, const void *data,size_t datalen) { intchar num; void *returnval; //We know the header is 8 bytes, so allocate an extra 8 //4 bytes : message protocol //4 bytes : length of data // : DATA returnval=(void *)malloc(datalen+8); num.i=htonl((int)message); memcpy(returnval,(void *)num.c,4); num.i=htonl(datalen); memcpy(returnval+4,(void *)num.c,4); memcpy(returnval+8,data,datalen); return returnval; } //Get the length that the data will be with the headers static size_t data_get_length(grapple_messagetype_internal message, const void *data,size_t datalen) { //Yes its just +8 but this could change if the protocol changes so //lets do it this way return datalen+8; } //Send a message from the client to the server. This is done by giving the //server a queue object containing the data, the server then adds these to the //socket int c2s_send(internal_client_data *client, grapple_messagetype_internal message, const void *data,size_t datalen) { grapple_queue *newitem; //Get the queue item newitem=queue_struct_aquire(); //Put the data into the queue item newitem->data=data_assemble(message, data,datalen); newitem->length=data_get_length(message,data,datalen);; //Set reliable mode if required if (client->protocol==GRAPPLE_PROTOCOL_UDP) newitem->reliablemode=client->reliablemode; pthread_mutex_lock(&client->message_out_mutex); //add this to the queue client->message_out_queue= queue_link(client->message_out_queue,newitem); pthread_mutex_unlock(&client->message_out_mutex); pthread_mutex_lock(&client->internal_mutex); if (client->wakesock) socket_interrupt(client->wakesock); pthread_mutex_unlock(&client->internal_mutex); return 1; } //This cheats a little and uses the string sender with the int as the 4 byte //data int c2s_send_int(internal_client_data *client, grapple_messagetype_internal message, int val) { intchar data; data.i=htonl(val); return c2s_send(client,message,data.c,4); } //Send a message to the clients user queue from the client. This is an //internal message from one thread to another int c2CUQ_send(internal_client_data *client, grapple_messagetype_internal message, const void *data,size_t datalen) { grapple_queue *newitem; //Allocate the memory for the message newitem=queue_struct_aquire(); //Set the values into the message newitem->messagetype=message; newitem->data=(void *)malloc(datalen); memcpy(newitem->data,data,datalen); newitem->length=datalen; //Now see if we have an appropriate callback if (grapple_client_callback_generate(client,newitem)) { //We ran a callback, we're done, no need to add it to a queue queue_struct_dispose(newitem); return 1; } pthread_mutex_lock(&client->message_in_mutex); //Add to the queue client->message_in_queue= queue_link(client->message_in_queue,newitem); pthread_mutex_unlock(&client->message_in_mutex); return 1; } //Sending a double over the internal system is fine, no endianness to //worry about. Just send the bytes int c2CUQ_send_double(internal_client_data *client, grapple_messagetype_internal message, double val) { doublechar data; data.d=val; return c2CUQ_send(client,message,data.c,8); } //Sending an int over the internal system is fine, no endianness to //worry about. Just send the bytes int c2CUQ_send_int(internal_client_data *client, grapple_messagetype_internal message, int val) { intchar data; data.i=val; return c2CUQ_send(client,message,data.c,4); } //Send a message from the server to the client int s2c_send(internal_server_data *server, grapple_connection *target, grapple_messagetype_internal message, const void *data,size_t datalen) { grapple_queue *newitem; //Refuse to send to anyone on the way out if (target->delete) { return 0; } newitem=queue_struct_aquire(); //Set the data into the struct newitem->data=data_assemble(message, data,datalen); newitem->length=data_get_length(message,data,datalen);; //Send reliable if required if (target->protocol==GRAPPLE_PROTOCOL_UDP) newitem->reliablemode=target->reliablemode; pthread_mutex_lock(&target->message_out_mutex); //Add this to the queue to send. We DONT send here as we arent guarenteed //to be in the correct thread target->message_out_queue= queue_link(target->message_out_queue,newitem); pthread_mutex_unlock(&target->message_out_mutex); pthread_mutex_lock(&server->internal_mutex); if (server->wakesock) socket_interrupt(server->wakesock); pthread_mutex_unlock(&server->internal_mutex); return 1; } //Send an integer value - just call the above function int s2c_send_int(internal_server_data *server, grapple_connection *target, grapple_messagetype_internal message, int val) { intchar data; data.i=htonl(val); return s2c_send(server,target,message,data.c,4); } //Send a double value. Now this needs to be turned into a string to //ensure the other end understands it, and can atof it Im sure this could //be done more efficiently if I read up on the endian effects of double //storage. For now, this works int s2c_send_double(internal_server_data *server, grapple_connection *target, grapple_messagetype_internal message, double val) { char data[40]; sprintf(data,"%f",val); return s2c_send(server,target,message,data,strlen(data)); } //Send a message to the servers internal message queue int s2SUQ_send(internal_server_data *server, int from, grapple_messagetype_internal message, const void *data,size_t datalen) { grapple_queue *newitem; newitem=queue_struct_aquire(); //Fill in the data newitem->messagetype=message; newitem->data=(void *)malloc(datalen); memcpy(newitem->data,data,datalen); newitem->length=datalen; newitem->from=from; //Check for an appropriate callback if (grapple_server_callback_generate(server,newitem)) { //We did a callback, we're done. queue_struct_dispose(newitem); return 1; } pthread_mutex_lock(&server->message_in_mutex); //No callback, add to the message queue server->message_in_queue= queue_link(server->message_in_queue,newitem); pthread_mutex_unlock(&server->message_in_mutex); return 1; } //Send an int to the servers queue int s2SUQ_send_int(internal_server_data *server, int from, grapple_messagetype_internal message, int val) { intchar data; data.i=val; //Just use the above function, no need to worry about endianness return s2SUQ_send(server,from,message,data.c,4); } //Send a double to the servers queue int s2SUQ_send_double(internal_server_data *server, int from, grapple_messagetype_internal message, double val) { doublechar data; data.d=val; //Just use the above function, no need to worry about endianness return s2SUQ_send(server,from,message,data.c,8); } pong2-0.1.3/src/grapple/grapple_lobbyclient_thread.c0000644000175000001440000001133610473646146017430 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include #include #include "grapple_lobby_internal.h" #include "grapple_lobbyclient_thread.h" #include "grapple_lobby.h" #include "grapple_server.h" #include "grapple_client.h" #include "tools.h" //This file contains the thread that a lobby client starts up when it starts //a new game. This thread feeds data about the game to the lobby server void *grapple_lobbyclient_serverthread_main(void *data) { internal_lobbyclient_data *client; int finished=0; int count,oldcount=0; int maxcount,oldmaxcount=0; int closed,oldclosed=GRAPPLE_SERVER_OPEN; char outdata[12]; intchar val; client=(internal_lobbyclient_data *)data; //Loop as long as needed while (finished==0) { //Find conditions where the looping should stop if (!client->gameid || client->threaddestroy || !client->client) finished=1; //If we havent finished if (!finished) { //Find the number of users connected to the game count=grapple_server_currentusers_get(client->runninggame); //If the number has changed if (count!=oldcount) { oldcount=count; //Send a message to the server with the new connection count val.i=htonl(GRAPPLE_LOBBYMESSAGE_GAME_USERCOUNT); memcpy(outdata,val.c,4); val.i=htonl(client->gameid); memcpy(outdata+4,val.c,4); val.i=htonl(count); memcpy(outdata+8,val.c,4); grapple_client_send(client->client,GRAPPLE_SERVER,0,outdata,12); } //Now find the maximum number of users that can connect maxcount=grapple_server_maxusers_get(client->runninggame); //If the number has changed if (maxcount!=oldmaxcount) { oldmaxcount=maxcount; //Send a message to the server with the new connection count val.i=htonl(GRAPPLE_LOBBYMESSAGE_GAME_MAXUSERCOUNT); memcpy(outdata,val.c,4); val.i=htonl(client->gameid); memcpy(outdata+4,val.c,4); val.i=htonl(maxcount); memcpy(outdata+8,val.c,4); grapple_client_send(client->client,GRAPPLE_SERVER,0,outdata,12); } //Now find if the game is open or closed closed=grapple_server_closed_get(client->runninggame); //If the number has changed if (closed!=oldclosed) { oldclosed=closed; //Send a message to the server with the new closed state val.i=htonl(GRAPPLE_LOBBYMESSAGE_GAME_CLOSED); memcpy(outdata,val.c,4); val.i=htonl(client->gameid); memcpy(outdata+4,val.c,4); val.i=htonl(closed); memcpy(outdata+8,val.c,4); grapple_client_send(client->client,GRAPPLE_SERVER,0,outdata,12); } //Id the game has finished if (!grapple_server_running(client->runninggame)) { finished=1; client->thread=0; grapple_lobbyclient_game_unregister(client->lobbyclientnum); } } if (!finished) microsleep(300000); } //We are finishing the thread client->thread=0; if (client->threaddestroy) client->threaddestroy=0; //On return the thread terminates return 0; } void *grapple_lobbyclient_clientthread_main(void *data) { internal_lobbyclient_data *client; int finished=0; client=(internal_lobbyclient_data *)data; //Loop as long as needed while (finished==0) { //Find conditions where the looping should stop if (!client->ingame || client->threaddestroy || !client->client) finished=1; if (!finished) { if (!grapple_client_connected(client->joinedgame)) { finished=1; client->thread=0; grapple_lobbyclient_game_leave(client->lobbyclientnum, client->joinedgame); } if (!finished) microsleep(300000); } } //We are finishing the thread client->thread=0; if (client->threaddestroy) client->threaddestroy=0; //On return the thread terminates return 0; } pong2-0.1.3/src/grapple/grapple_failover.c0000644000175000001440000000717110473646146015404 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include "grapple_structs.h" #include "grapple_failover.h" //This file really only contains a few utilities for the failover //functionality. The actual failover happens in grapple_client_thread.c //Make a failover container grapple_failover_host *failover_aquire(void) { return (grapple_failover_host *)calloc(1,sizeof(grapple_failover_host)); } //Get rid of a failover container including all its associated memory void failover_dispose(grapple_failover_host *target) { if (target->address) free(target->address); free(target); return; } //Remove the failover container from a list grapple_failover_host *failover_unlink(grapple_failover_host *list, grapple_failover_host *item) { if (list->next==list) { return NULL; } item->next->prev=item->prev; item->prev->next=item->next; if (item==list) list=item->next; return list; } //Link the failover into a list of failovers grapple_failover_host *failover_link(grapple_failover_host *list, grapple_failover_host *item) { if (!list) { item->next=item; item->prev=item; return item; } item->next=list; item->prev=list->prev; item->next->prev=item; item->prev->next=item; return list; } //Locate a failover ID in a list static grapple_failover_host *failover_locate(grapple_failover_host *list, int id) { grapple_failover_host *scan; scan=list; while (scan) { if (scan->id) //Got it return scan; scan=scan->next; if (scan==list) scan=NULL; } return NULL; } //Unlink a failover based on its ID grapple_failover_host *failover_unlink_by_id(grapple_failover_host *list, int id) { grapple_failover_host *target; target=failover_locate(list,id); if (target) { list=failover_unlink(list,target); failover_dispose(target); } return list; } //Create a failover and link it into the list grapple_failover_host *failover_link_by_id(grapple_failover_host *list, int id,const char *hostname) { grapple_failover_host *newhost; //In case its already linked, remove it. This SHOULD never happen, but //best to be safe failover_unlink_by_id(list,id); newhost=failover_aquire(); newhost->id=id; newhost->address=(char *)malloc(strlen(hostname)+1); strcpy(newhost->address,hostname); list=failover_link(list,newhost); return list; } //Find the lowest numbered failover. grapple_failover_host *failover_locate_lowest_id(grapple_failover_host *list) { grapple_failover_host *scan,*lowest; scan=list; lowest=list; while (scan) { if (scan->id< lowest->id) lowest=scan; scan=scan->next; if (scan==list) scan=NULL; } return lowest; } pong2-0.1.3/src/grapple/grapple_lobbyclient.c0000644000175000001440000015060010473646146016077 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #define _XOPEN_SOURCE 500 #include #include #include #include #include #include #include "grapple_lobby.h" #include "grapple_lobby_internal.h" #include "grapple_defines.h" #include "grapple_error.h" #include "grapple_client.h" #include "grapple_server.h" #include "tools.h" #include "grapple_lobbyconnection.h" #include "grapple_lobbymessage.h" #include "grapple_lobbygame.h" #include "grapple_lobbycallback.h" #include "grapple_lobbyclient_thread.h" /************************************************************************** ** The functions in this file are generally those that are accessible ** ** to the end user. Obvious exceptions are those that are static which ** ** are just internal utilities. ** ** Care should be taken to not change the parameters of outward facing ** ** functions unless absolutely required ** **************************************************************************/ //This is a static variable which keeps track of the list of all lobbyclients //run by this program. The lobbyclients are kept in a linked list. This //variable is global to this file only. static internal_lobbyclient_data *grapple_lobbyclient_head=NULL; //Link a lobbyclient to the list static int internal_lobbyclient_link(internal_lobbyclient_data *data) { if (!grapple_lobbyclient_head) { grapple_lobbyclient_head=data; data->next=data; data->prev=data; return 1; } data->next=grapple_lobbyclient_head; data->prev=grapple_lobbyclient_head->prev; data->next->prev=data; data->prev->next=data; grapple_lobbyclient_head=data; return 1; } //Remove a lobbyclient from the linked list static int internal_lobbyclient_unlink(internal_lobbyclient_data *data) { if (data->next==data) { grapple_lobbyclient_head=NULL; return 1; } data->next->prev=data->prev; data->prev->next=data->next; if (data==grapple_lobbyclient_head) grapple_lobbyclient_head=data->next; data->next=NULL; data->prev=NULL; return 1; } //Find the lobbyclient from the ID number passed by the user static internal_lobbyclient_data *internal_lobbyclient_get(grapple_lobbyclient num) { internal_lobbyclient_data *scan; //By default if passed 0, then the oldest lobbyclient is returned if (!num) return grapple_lobbyclient_head; //This is a cache as most often you will want the same one as last time //Loop through the lobbyclients scan=grapple_lobbyclient_head; while (scan) { if (scan->lobbyclientnum==num) { return scan; } scan=scan->next; if (scan==grapple_lobbyclient_head) return NULL; } //No match return NULL; } static void grapple_lobbyclient_error_set(internal_lobbyclient_data *client, grapple_error error) { client->last_error=error; } //Create a new lobbyclient static internal_lobbyclient_data *lobbyclient_create(void) { static int nextval=256; internal_lobbyclient_data *data; pthread_mutexattr_t attr; //Create the structure data=(internal_lobbyclient_data *)calloc(1,sizeof(internal_lobbyclient_data)); //Assign it a default ID data->lobbyclientnum=nextval++; //Set up the mutexes pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&data->userlist_mutex,&attr); pthread_mutex_init(&data->message_mutex,&attr); pthread_mutex_init(&data->games_mutex,&attr); //Link it into the array of lobbies internal_lobbyclient_link(data); return data; } //User function for initialising the lobbyclient grapple_lobbyclient grapple_lobbyclient_init(const char *name,const char *version) { internal_lobbyclient_data *data; //Create the internal data data=lobbyclient_create(); data->client=grapple_client_init(name,version); //Return the client ID - the end user only gets an integer, called a //'grapple_lobbyclient' return data->lobbyclientnum; } //Set the port number to connect to int grapple_lobbyclient_port_set(grapple_lobbyclient lobbyclient,int port) { internal_lobbyclient_data *data; //Get the lobbyclient data data=internal_lobbyclient_get(lobbyclient); if (!data || !data->client) { return GRAPPLE_FAILED; } //Set this in grapple return grapple_client_port_set(data->client,port); } //Set the IP address to bind to. This is an optional, if not set, then all //local addresses are bound to int grapple_lobbyclient_address_set(grapple_lobbyclient lobbyclient, const char *address) { internal_lobbyclient_data *data; //Get the lobbyclient data data=internal_lobbyclient_get(lobbyclient); if (!data || !data->client) { return GRAPPLE_FAILED; } return grapple_client_address_set(data->client,address); } //Set the name of the user. int grapple_lobbyclient_name_set(grapple_lobbyclient lobbyclient, const char *name) { internal_lobbyclient_data *data; //Get the lobbyclient data data=internal_lobbyclient_get(lobbyclient); if (!data || !data->client) { return GRAPPLE_FAILED; } //Connectstatus is a lobby value used to show how connected we are if (data->connectstatus!=GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_DISCONNECTED) { grapple_lobbyclient_error_set(data,GRAPPLE_ERROR_CLIENT_CONNECTED); return GRAPPLE_FAILED; } if (data->name) free(data->name); data->name=(char *)malloc(strlen(name)+1); strcpy(data->name,name); return grapple_client_name_set(data->client,name); } //Get the top message from the list of messages for the clients attention grapple_lobbymessage *grapple_lobbyclient_message_pull(grapple_lobbyclient lobbyclient) { internal_lobbyclient_data *client; grapple_lobbymessage *message; //Get the lobbyclient data client=internal_lobbyclient_get(lobbyclient); if (!client || !client->client) { return NULL; } if (!client->messages) return NULL; //Get the message at the top of the queue pthread_mutex_lock(&client->message_mutex); message=client->messages; //Unlink it from the message list client->messages=grapple_lobbymessage_unlink(client->messages,message); pthread_mutex_unlock(&client->message_mutex); message->next=NULL; message->prev=NULL; return message; } //A message is going out to the end user, prepare it static int grapple_lobbyclient_process_message(internal_lobbyclient_data *client, grapple_lobbymessage *message) { //If we are in a game, only send a disconnectmessage if (client->ingame && message->type!=GRAPPLE_LOBBYMSG_DISCONNECTED) return 0; //handle callbacks, we are in a thread so we can just do it if (grapple_lobbyclient_callback_process(client,message)) { return 0; } //If not a callback, add it to the users message queue pthread_mutex_lock(&client->message_mutex); client->messages=grapple_lobbymessage_link(client->messages,message); pthread_mutex_unlock(&client->message_mutex); return 0; } //Have received a lobbymsg_connected message. This indicates that the name //we have passed is acceptable to the lobby static int grapple_lobbyclient_process_lobbymsg_connected(internal_lobbyclient_data *client, grapple_message *message) { intchar val; grapple_user id; grapple_lobbyconnection *user; char *name; void *data; int length; length=message->USER_MSG.length-4; data=message->USER_MSG.data+4; if (length < 4) return 0; memcpy(val.c,data,4); id=ntohl(val.i); //Get the name so we know what we have been accepted as name=grapple_client_name_get(client->client,id); //Fidn the user and set them as connected pthread_mutex_lock(&client->userlist_mutex); user=grapple_lobbyconnection_locate_by_id(client->userlist,id); if (!user) { //This user must have disconnected or something pthread_mutex_unlock(&client->userlist_mutex); return 0; } user->connected=1; //Allocate the name into the user structure if (user->name) free(user->name); user->name=(char *)malloc(strlen(name)+1); strcpy(user->name,name); pthread_mutex_unlock(&client->userlist_mutex); //Now see if it is US that has just connected if (id == client->serverid) { //Set the connectstatus to 'connected' client->connectstatus=GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_CONNECTED; } return 0; } //Received a chat message from another user static int grapple_lobbyclient_process_lobbymsg_chat(internal_lobbyclient_data *client, grapple_message *message) { void *data; int length; grapple_lobbymessage *outmessage; length=message->USER_MSG.length-4; data=message->USER_MSG.data+4; if (length < 4) return 0; //Decode the message into a lobbymessage outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_CHAT; outmessage->CHAT.id=message->USER_MSG.id; outmessage->CHAT.length=length; outmessage->CHAT.message=(char *)malloc(length+1); memcpy(outmessage->CHAT.message,data,length); outmessage->CHAT.message[length]=0; //Send it to the outbound message processor grapple_lobbyclient_process_message(client,outmessage); return 0; } //A game has been registered static int grapple_lobbyclient_process_lobbymsg_registergame(internal_lobbyclient_data *client, grapple_message *message) { void *data; int length,varlength; grapple_lobbymessage *outmessage=NULL; int offset; intchar val; grapple_lobbygame_internal *game; length=message->USER_MSG.length-4; data=message->USER_MSG.data+4; if (length < 4) return 0; //A new game is now being registered. We need to deconstruct the complex //data packet game=grapple_lobbygame_internal_create(); //4 bytes : game ID //4 bytes : Session name length // ; Session name //4 bytes : Address length // : address //4 bytes : portnumber //4 bytes : protocol //4 bytes : Maximum number of users //4 bytes : Password required (could be 1 byte but lets stick with ints) //4 bytes : Room number memcpy(val.c,data,4); game->id=ntohl(val.i); memcpy(val.c,data+4,4); varlength=ntohl(val.i); game->session=(char *)malloc(varlength+1); memcpy(game->session,data+8,varlength); game->session[varlength]=0; offset=varlength+8; memcpy(val.c,data+offset,4); varlength=ntohl(val.i); offset+=4; game->address=(char *)malloc(varlength+1); memcpy(game->address,data+offset,varlength); game->address[varlength]=0; offset+=varlength; memcpy(val.c,data+offset,4); game->port=ntohl(val.i); offset+=4; memcpy(val.c,data+offset,4); game->protocol=ntohl(val.i); offset+=4; memcpy(val.c,data+offset,4); game->maxusers=ntohl(val.i); offset+=4; memcpy(val.c,data+offset,4); game->needpassword=ntohl(val.i); offset+=4; memcpy(val.c,data+offset,4); game->room=ntohl(val.i); if (game->room==client->currentroom) { //Set up a message to tell the player outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_NEWGAME; outmessage->GAME.id=game->id; outmessage->GAME.name=(char *)malloc(strlen(game->session)+1); strcpy(outmessage->GAME.name,game->session); outmessage->GAME.maxusers=game->maxusers; outmessage->GAME.needpassword=game->needpassword; } //Now link the game into the list pthread_mutex_lock(&client->games_mutex); client->games=grapple_lobbygame_internal_link(client->games,game); pthread_mutex_unlock(&client->games_mutex); if (outmessage) //Send the players message to the outbound message processor grapple_lobbyclient_process_message(client,outmessage); return 0; } //A game has been deleted static int grapple_lobbyclient_process_lobbymsg_deletegame(internal_lobbyclient_data *client, grapple_message *message) { intchar val; grapple_lobbygameid gameid; grapple_lobbygame_internal *game; grapple_lobbymessage *outmessage=NULL; memcpy(val.c,message->USER_MSG.data+4,4); gameid=ntohl(val.i); pthread_mutex_lock(&client->games_mutex); game=grapple_lobbygame_internal_locate_by_id(client->games,gameid); //Locate the game if (game) { //Unlink it from the game list client->games=grapple_lobbygame_internal_unlink(client->games,game); pthread_mutex_unlock(&client->games_mutex); if (game->room == client->currentroom) { //Set up a message to tell the player outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_DELETEGAME; outmessage->GAME.id=game->id; grapple_lobbyclient_process_message(client,outmessage); } //Delete it, its dead grapple_lobbygame_internal_dispose(game); } else pthread_mutex_unlock(&client->games_mutex); return 0; } //The server has sent us an ID for the game we have just started static int grapple_lobbyclient_process_lobbymsg_yourgameid(internal_lobbyclient_data *client, grapple_message *message) { void *data; int length; intchar val; length=message->USER_MSG.length-4; data=message->USER_MSG.data+4; if (length < 4) return 0; //Set the internal game ID memcpy(val.c,data,4); client->gameid=ntohl(val.i); return 0; } //The number of users connected to a game has changed static int grapple_lobbyclient_process_lobbymsg_game_usercount(internal_lobbyclient_data *client, grapple_message *message) { intchar val; grapple_lobbygameid gameid; grapple_lobbygame_internal *game; int count; grapple_lobbymessage *outmessage; memcpy(val.c,message->USER_MSG.data+4,4); gameid=ntohl(val.i); memcpy(val.c,message->USER_MSG.data+8,4); count=ntohl(val.i); //Find the game pthread_mutex_lock(&client->games_mutex); game=grapple_lobbygame_internal_locate_by_id(client->games,gameid); if (game) { //Set its new user value game->currentusers=count; pthread_mutex_unlock(&client->games_mutex); //Send the data to the user outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_GAME_USERS; outmessage->GAME.id=gameid; outmessage->GAME.currentusers=count; grapple_lobbyclient_process_message(client,outmessage); } else pthread_mutex_unlock(&client->games_mutex); return 0; } //The maximum number of users that can connect to a game has changed static int grapple_lobbyclient_process_lobbymsg_game_maxusercount(internal_lobbyclient_data *client, grapple_message *message) { intchar val; grapple_lobbygameid gameid; grapple_lobbygame_internal *game; int count; grapple_lobbymessage *outmessage; memcpy(val.c,message->USER_MSG.data+4,4); gameid=ntohl(val.i); memcpy(val.c,message->USER_MSG.data+8,4); count=ntohl(val.i); pthread_mutex_lock(&client->games_mutex); //Find the game game=grapple_lobbygame_internal_locate_by_id(client->games,gameid); if (game) { ////Set the new value game->maxusers=count; pthread_mutex_unlock(&client->games_mutex); //Tell the user outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_GAME_MAXUSERS; outmessage->GAME.id=gameid; outmessage->GAME.maxusers=count; grapple_lobbyclient_process_message(client,outmessage); } else pthread_mutex_unlock(&client->games_mutex); return 0; } //The games open/closed status has changed static int grapple_lobbyclient_process_lobbymsg_game_closed(internal_lobbyclient_data *client, grapple_message *message) { intchar val; grapple_lobbygameid gameid; grapple_lobbygame_internal *game; int state; grapple_lobbymessage *outmessage; memcpy(val.c,message->USER_MSG.data+4,4); gameid=ntohl(val.i); memcpy(val.c,message->USER_MSG.data+8,4); state=ntohl(val.i); pthread_mutex_lock(&client->games_mutex); //Find the game game=grapple_lobbygame_internal_locate_by_id(client->games,gameid); if (game) { ////Set the new value game->closed=state; pthread_mutex_unlock(&client->games_mutex); //Tell the user outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_GAME_MAXUSERS; outmessage->GAME.id=gameid; outmessage->GAME.closed=state; grapple_lobbyclient_process_message(client,outmessage); } else pthread_mutex_unlock(&client->games_mutex); return 0; } //A user message has come through. User messages are what are contains the //lobby specific messages, for the protocol that the lobby uses ontop of //grapple static int grapple_lobbyclient_process_user_msg(internal_lobbyclient_data *client, grapple_message *message) { grapple_lobbymessagetype_internal type; intchar val; //User message - break it into its components if (message->USER_MSG.length < 4) return 0; //Find the type of message memcpy(val.c,message->USER_MSG.data,4); type=ntohl(val.i); //Hand off the message to a sub-handler switch (type) { case GRAPPLE_LOBBYMESSAGE_DUPLICATENAME: client->connectstatus=GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_REJECTED; break; case GRAPPLE_LOBBYMESSAGE_YOURGAMEID: grapple_lobbyclient_process_lobbymsg_yourgameid(client,message); break; case GRAPPLE_LOBBYMESSAGE_CONNECTED: grapple_lobbyclient_process_lobbymsg_connected(client,message); break; case GRAPPLE_LOBBYMESSAGE_CHAT: grapple_lobbyclient_process_lobbymsg_chat(client,message); break; case GRAPPLE_LOBBYMESSAGE_REGISTERGAME: grapple_lobbyclient_process_lobbymsg_registergame(client,message); break; case GRAPPLE_LOBBYMESSAGE_DELETEGAME: grapple_lobbyclient_process_lobbymsg_deletegame(client,message); break; case GRAPPLE_LOBBYMESSAGE_GAME_USERCOUNT: grapple_lobbyclient_process_lobbymsg_game_usercount(client,message); break; case GRAPPLE_LOBBYMESSAGE_GAME_MAXUSERCOUNT: grapple_lobbyclient_process_lobbymsg_game_maxusercount(client,message); break; case GRAPPLE_LOBBYMESSAGE_GAME_CLOSED: grapple_lobbyclient_process_lobbymsg_game_closed(client,message); break; } return 0; } //A new user has connected - This user MAY not be connected properly, do //dont set their connected flag static int grapple_lobbyclient_process_new_user(internal_lobbyclient_data *client, grapple_message *message) { grapple_lobbyconnection *newuser; //Create the users local data newuser=grapple_lobbyconnection_create(); newuser->id=message->NEW_USER.id; pthread_mutex_lock(&client->userlist_mutex); //Link it in client->userlist=grapple_lobbyconnection_link(client->userlist,newuser); pthread_mutex_unlock(&client->userlist_mutex); if (message->NEW_USER.me) //If it is us, set our server id client->serverid=message->NEW_USER.id; return 0; } //A group has been created. In the lobby a group is associated with a room static int grapple_lobbyclient_process_group_create(internal_lobbyclient_data *client, grapple_message *message) { grapple_lobbymessage *outmessage; //If the user isnt in the first room, they dont hear about room creation //as rooms are only created off of the main room if (client->currentroom != client->firstroom) return 0; if (client->currentroom!=0) { //Inform the user outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_ROOMCREATE; outmessage->ROOM.roomid=message->GROUP.groupid; outmessage->ROOM.name=message->GROUP.name; message->GROUP.name=NULL; grapple_lobbyclient_process_message(client,outmessage); } return 0; } //Someone has joined a group. In effect, they have 'joined the room' static int grapple_lobbyclient_process_group_add(internal_lobbyclient_data *client, grapple_message *message) { grapple_lobbymessage *outmessage; //If it is us if (message->GROUP.memberid == client->serverid) { //If it is our first join if (client->currentroom==0) { //Note this as the main room client->firstroom=message->GROUP.groupid; } //Now set our current room to here client->currentroom=message->GROUP.groupid; } if (message->GROUP.groupid!=client->currentroom) //The message isnt in the room we are in, we dont care return 0; outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_ROOMENTER; outmessage->ROOM.userid=message->GROUP.memberid; //Send the message to the user grapple_lobbyclient_process_message(client,outmessage); return 0; } //Someone has left a room static int grapple_lobbyclient_process_group_remove(internal_lobbyclient_data *client, grapple_message *message) { grapple_lobbymessage *outmessage; //If it isnt our room, we dont care if (message->GROUP.groupid!=client->currentroom) return 0; //Send a message to the user outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_ROOMLEAVE; outmessage->ROOM.userid=message->GROUP.memberid; grapple_lobbyclient_process_message(client,outmessage); return 0; } //A room has been deleted static int grapple_lobbyclient_process_group_delete(internal_lobbyclient_data *client, grapple_message *message) { grapple_lobbymessage *outmessage; //Only get room delete messages from the first room if (client->currentroom != client->firstroom) return 0; outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_ROOMDELETE; outmessage->ROOM.roomid=message->GROUP.groupid; outmessage->ROOM.name=message->GROUP.name; message->GROUP.name=NULL; grapple_lobbyclient_process_message(client,outmessage); return 0; } //Connection was refused - probably becuse we have a non-unique name static int grapple_lobbyclient_process_connection_refused(internal_lobbyclient_data *client, grapple_message *message) { //Set the status - we are in a callback thread here, so in the main //thread, the status is being waited on. client->connectstatus=GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_DISCONNECTED; return 0; } //A user has disconected static int grapple_lobbyclient_process_user_disconnected(internal_lobbyclient_data *client, grapple_message *message) { grapple_lobbyconnection *user; grapple_lobbymessage *outmessage; pthread_mutex_lock(&client->userlist_mutex); //Remove them from the userlist user=grapple_lobbyconnection_locate_by_id(client->userlist, message->USER_DISCONNECTED.id); if (user) client->userlist=grapple_lobbyconnection_unlink(client->userlist,user); pthread_mutex_unlock(&client->userlist_mutex); //Is it us? if (message->USER_DISCONNECTED.id==client->serverid) { //Let the user know we're disconnected outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_DISCONNECTED; grapple_lobbyclient_process_message(client,outmessage); } else { //If the user is in the same room as us if (user && user->currentroom == client->currentroom) { outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_ROOMLEAVE; outmessage->ROOM.userid=message->USER_DISCONNECTED.id; outmessage->ROOM.name=user->name; user->name=NULL; //send the user the information grapple_lobbyclient_process_message(client,outmessage); } } //Get rid of the disconnected user if (user) grapple_lobbyconnection_dispose(user); return 0; } //The server has disconnected, this is the whole lobby going static int grapple_lobbyclient_process_server_disconnected(internal_lobbyclient_data *client, grapple_message *message) { grapple_lobbymessage *outmessage; //Send the user a message and let them handle cleanup outmessage=grapple_lobbymessage_aquire(); outmessage->type=GRAPPLE_LOBBYMSG_DISCONNECTED; grapple_lobbyclient_process_message(client,outmessage); return 0; } //All messages from grapple and sent here as callbacks to be distributed to //subfinctions static int grapple_lobbyclient_generic_callback(grapple_message *message, void *context) { internal_lobbyclient_data *client; client=(internal_lobbyclient_data *)context; //Send the message to a handler switch (message->type) { case GRAPPLE_MSG_NEW_USER: case GRAPPLE_MSG_NEW_USER_ME: grapple_lobbyclient_process_new_user(client,message); break; case GRAPPLE_MSG_USER_MSG: grapple_lobbyclient_process_user_msg(client,message); break; case GRAPPLE_MSG_GROUP_CREATE: grapple_lobbyclient_process_group_create(client,message); break; case GRAPPLE_MSG_GROUP_ADD: grapple_lobbyclient_process_group_add(client,message); break; case GRAPPLE_MSG_GROUP_REMOVE: grapple_lobbyclient_process_group_remove(client,message); break; case GRAPPLE_MSG_GROUP_DELETE: grapple_lobbyclient_process_group_delete(client,message); break; case GRAPPLE_MSG_CONNECTION_REFUSED: grapple_lobbyclient_process_connection_refused(client,message); break; case GRAPPLE_MSG_USER_DISCONNECTED: grapple_lobbyclient_process_user_disconnected(client,message); break; case GRAPPLE_MSG_SERVER_DISCONNECTED: grapple_lobbyclient_process_server_disconnected(client,message); break; case GRAPPLE_MSG_SESSION_NAME: case GRAPPLE_MSG_CONFIRM_RECEIVED: case GRAPPLE_MSG_CONFIRM_TIMEOUT: case GRAPPLE_MSG_YOU_ARE_HOST: case GRAPPLE_MSG_USER_NAME: case GRAPPLE_MSG_PING: //Dont care about these break; } grapple_message_dispose(message); return 0; } //Start the lobbyclient int grapple_lobbyclient_start(grapple_lobbyclient lobbyclient) { internal_lobbyclient_data *data; int returnval; data=internal_lobbyclient_get(lobbyclient); //Check the lobbyclients minimum defaults are set if (!data || !data->client) { return GRAPPLE_FAILED; } ////The name isnt set, cant connect to the lobby without a name if (!data->name) { grapple_lobbyclient_error_set(data,GRAPPLE_ERROR_NAME_NOT_SET); return GRAPPLE_FAILED; } //Set the grapple details for connecting to the lobby using grapple grapple_client_protocol_set(data->client,GRAPPLE_PROTOCOL_TCP); grapple_client_callback_setall(data->client, grapple_lobbyclient_generic_callback, (void *)data); //now set their connection status to pending data->connectstatus=GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_PENDING; //Start the client returnval=grapple_client_start(data->client,0); if (returnval!=GRAPPLE_OK) { grapple_lobbyclient_error_set(data, grapple_client_error_get(data->client)); return returnval; } grapple_client_sequential_set(data->client,GRAPPLE_SEQUENTIAL); //Connection status: //This will be changed in a callback that is run in the grapple //callback thread, so we just wait for it to change while (data->connectstatus == GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_PENDING) microsleep(10000); if (data->connectstatus==GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_CONNECTED) { while (data->firstroom==0) microsleep(10000); return GRAPPLE_OK; } //The name wasnt good, abort the connection free(data->name); data->name=NULL; if (data->connectstatus==GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_REJECTED) { grapple_lobbyclient_error_set(data,GRAPPLE_ERROR_NAME_NOT_UNIQUE); data->connectstatus=GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_DISCONNECTED; } else if (data->connectstatus==GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_DISCONNECTED) { grapple_lobbyclient_error_set(data,GRAPPLE_ERROR_CANNOT_CONNECT); } //Stop the client, ready to restart when a new name has been picked grapple_client_stop(data->client); return GRAPPLE_FAILED; } //Destroy the lobbyclient int grapple_lobbyclient_destroy(grapple_lobbyclient lobbyclient) { internal_lobbyclient_data *data; grapple_lobbygame_internal *gametarget; grapple_lobbyconnection *connection; grapple_lobbymessage *message; data=internal_lobbyclient_get(lobbyclient); if (!data) { return GRAPPLE_FAILED; } //If we have a thread, close it first if (data->thread) { data->threaddestroy=1; while (data->threaddestroy) microsleep(10000); } //finish the grapple client if (data->client) grapple_client_destroy(data->client); //Remove this client from the list of lobby clients internal_lobbyclient_unlink(data); //Unlink all the games pthread_mutex_lock(&data->games_mutex); while (data->games) { gametarget=data->games; data->games=grapple_lobbygame_internal_unlink(data->games,data->games); grapple_lobbygame_internal_dispose(gametarget); } pthread_mutex_unlock(&data->games_mutex); //Unlink all the users pthread_mutex_lock(&data->userlist_mutex); while (data->userlist) { connection=data->userlist; data->userlist=grapple_lobbyconnection_unlink(data->userlist, data->userlist); grapple_lobbyconnection_dispose(connection); } pthread_mutex_unlock(&data->userlist_mutex); //Unlink all the remaining incoming messages pthread_mutex_lock(&data->message_mutex); while (data->messages) { message=data->messages; data->messages=grapple_lobbymessage_unlink(data->messages, data->messages); grapple_lobbymessage_dispose(message); } pthread_mutex_unlock(&data->message_mutex); //Unlink all the remaining callbacks pthread_mutex_lock(&data->callback_mutex); while (data->callbacks) { data->callbacks=grapple_lobbycallback_remove(data->callbacks, data->callbacks->type); } pthread_mutex_unlock(&data->callback_mutex); pthread_mutex_destroy(&data->callback_mutex); pthread_mutex_destroy(&data->userlist_mutex); pthread_mutex_destroy(&data->message_mutex); pthread_mutex_destroy(&data->games_mutex); if (data->name) free(data->name); free(data); return GRAPPLE_OK; } //Create a room in the lobby. All rooms require someone to be in them, //so creating a room will also move the user into it. int grapple_lobbyclient_room_create(grapple_lobbyclient clientnum, const char *name) { internal_lobbyclient_data *client; grapple_user group; grapple_lobbyconnection *user; client=internal_lobbyclient_get(clientnum); if (!client) { return GRAPPLE_FAILED; } //Find if the group is already made group=grapple_client_group_from_name(client->client,name); if (!group) //Create a group if it isnt there group=grapple_client_group_create(client->client,name); //If they have a room already if (client->currentroom) //Move them out of it grapple_client_group_remove(client->client,client->currentroom, client->serverid); client->currentroom=group; //Move the player into the group (new room) grapple_client_group_add(client->client,group,client->serverid); //Set the current room of the user pthread_mutex_lock(&client->userlist_mutex); user=grapple_lobbyconnection_locate_by_id(client->userlist, client->serverid); if (user) user->currentroom=client->currentroom; pthread_mutex_unlock(&client->userlist_mutex); return GRAPPLE_OK; } //Enter an existing room int grapple_lobbyclient_room_enter(grapple_lobbyclient clientnum, grapple_lobbyroomid group) { internal_lobbyclient_data *client; grapple_lobbyconnection *user; client=internal_lobbyclient_get(clientnum); if (!client) { return GRAPPLE_FAILED; } //Move out of the current room if (client->currentroom) grapple_client_group_remove(client->client,client->currentroom, client->serverid); client->currentroom=group; //Move the player into the new group (room) grapple_client_group_add(client->client,group,client->serverid); pthread_mutex_lock(&client->userlist_mutex); user=grapple_lobbyconnection_locate_by_id(client->userlist, client->serverid); if (user) user->currentroom=client->currentroom; pthread_mutex_unlock(&client->userlist_mutex); return GRAPPLE_OK; } //Leave a room (return to the main lobby) int grapple_lobbyclient_room_leave(grapple_lobbyclient clientnum) { internal_lobbyclient_data *client; grapple_lobbyconnection *user; client=internal_lobbyclient_get(clientnum); if (!client || !client->client) { return GRAPPLE_FAILED; } //If they are already in the main room, just OK it if (client->firstroom==client->currentroom) return GRAPPLE_OK; //Leave the current group, join the main one grapple_client_group_remove(client->client,client->currentroom, client->serverid); grapple_client_group_add(client->client,client->firstroom, client->serverid); client->currentroom=client->firstroom; //Update the user pthread_mutex_lock(&client->userlist_mutex); user=grapple_lobbyconnection_locate_by_id(client->userlist, client->serverid); if (user) user->currentroom=client->currentroom; pthread_mutex_unlock(&client->userlist_mutex); return 0; } //send a chat message - a message to everyone in the 'room' int grapple_lobbyclient_chat(grapple_lobbyclient clientnum, const char *message) { internal_lobbyclient_data *client; char *outdata; intchar val; int length; client=internal_lobbyclient_get(clientnum); if (!client) { return GRAPPLE_FAILED; } //Make up the packet //4 bytes : protocol //4 bytes : message length // : message length=strlen(message); outdata=(char *)malloc(length+4); val.i=htonl(GRAPPLE_LOBBYMESSAGE_CHAT); memcpy(outdata,val.c,4); memcpy(outdata+4,message,length); //Send the message to the current 'room' (group) grapple_client_send(client->client,client->currentroom,0,outdata,length+4); return 0; } //Starting a new game via the lobby. //Here the user passes in a grapple_server that is already running, and the //lobby extracts the information it requires grapple_lobbygameid grapple_lobbyclient_game_register(grapple_lobbyclient clientnum, grapple_server server) { internal_lobbyclient_data *client; const char *session; const char *address; int port; int maxusers; int needpassword; grapple_protocol protocol; intchar val; char *outdata; int length,offset,sessionlength,addresslength,createval; client=internal_lobbyclient_get(clientnum); if (!client) { return 0; } if (client->gameid || client->ingame) { grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_CLIENT_CONNECTED); return 0; } //We have been passed a running server - lets find out if it has all the //requirements for a lobby game set. if (!grapple_server_running(server)) { grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_SERVER_NOT_CONNECTED); return 0; } port=grapple_server_port_get(server); if (!port) { grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_PORT_NOT_SET); return 0; } protocol=grapple_server_protocol_get(server); if (!protocol) { grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_PROTOCOL_NOT_SET); return 0; } session=grapple_server_session_get(server); if (!session) { grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_SESSION_NOT_SET); return 0; } //This is optional so no fail address=grapple_server_ip_get(server); maxusers=grapple_server_maxusers_get(server); needpassword=grapple_server_password_required(server); //We have all the information we need, now we assemble it into one huge //outgoing packet //set the length to be: length=20; //Ints for lobbyprotocol, port, protocol, maxusers, needpassword sessionlength=strlen(session); length+=(sessionlength+4); //The length of the session plus a length int if (address && *address) { addresslength=strlen(address); length+=(addresslength+4); //The length of the address plus a length int } else { addresslength=0; length+=4; } outdata=(char *)malloc(length); //Now copy the data into the buffer //4 bytes : Lobby protocol //4 bytes : Session name length // ; Session name //4 bytes : Address length // : address (may be 0 bytes) //4 bytes : portnumber //4 bytes : protocol //4 bytes : Maximum number of users //4 bytes : Password required (could be 1 byte but lets stick with ints) val.i=htonl(GRAPPLE_LOBBYMESSAGE_REGISTERGAME); memcpy(outdata,val.c,4); val.i=htonl(sessionlength); memcpy(outdata+4,val.c,4); memcpy(outdata+8,session,sessionlength); offset=sessionlength+8; val.i=htonl(addresslength); memcpy(outdata+offset,val.c,4); offset+=4; if (addresslength) { memcpy(outdata+offset,address,addresslength); offset=addresslength; } val.i=htonl(port); memcpy(outdata+offset,val.c,4); offset+=4; val.i=htonl(protocol); memcpy(outdata+offset,val.c,4); offset+=4; val.i=htonl(maxusers); memcpy(outdata+offset,val.c,4); offset+=4; val.i=htonl(needpassword); memcpy(outdata+offset,val.c,4); client->gameid=0; //We have the data! //Send it to the server grapple_client_send(client->client,GRAPPLE_SERVER,0,outdata,length); free(outdata); //Now wait for this game to appear on the list //This is changed via the grapple callback thread so will change //while we wait for it while (client->gameid==0) microsleep(10000); //Set to -1 means the game creation failed if (client->gameid==-1) { client->gameid=0; return 0; } //start up the subthread that monitors the game and keeps sending messages //to the lobby server about number of users etc client->runninggame=server; client->threaddestroy=0; //Move the client into the game itself client->ingame=1; //If they have a room already if (client->currentroom) //Move them out of it grapple_client_group_remove(client->client,client->currentroom, client->serverid); createval=-1; //Create the thread while(createval!=0) { createval=pthread_create(&client->thread,NULL, grapple_lobbyclient_serverthread_main, (void *)client); if (createval!=0) { if (errno!=EAGAIN) { //Problem creating the thread that isnt a case of 'it will work //later, dont create it return 0; } } } pthread_detach(client->thread); //Send the client the ID of the game return client->gameid; } //Stop running a game on the lobby int grapple_lobbyclient_game_unregister(grapple_lobbyclient clientnum) { char outdata[8]; internal_lobbyclient_data *client; intchar val; client=internal_lobbyclient_get(clientnum); if (!client) { return GRAPPLE_FAILED; } //If the client isnt running a game, just nod and return if (!client->gameid) { return GRAPPLE_OK; } //If they have a room already if (client->currentroom) { //Move them back into it if (!grapple_client_group_add(client->client,client->currentroom, client->serverid)) { //We couldnt move them into their old room, move them into the //main room grapple_client_group_add(client->client,client->firstroom, client->serverid); client->currentroom=client->firstroom; } } else { grapple_client_group_add(client->client,client->firstroom, client->serverid); client->currentroom=client->firstroom; } //Send a message to the server to delete this game val.i=htonl(GRAPPLE_LOBBYMESSAGE_DELETEGAME); memcpy(outdata,val.c,4); val.i=htonl(client->gameid); memcpy(outdata+4,val.c,4); grapple_client_send(client->client,GRAPPLE_SERVER,0,outdata,8); //Reset all game variables client->gameid=0; client->ingame=0; client->runninggame=0; //Shutdown the game thread if (client->thread) { client->threaddestroy=1; //Wait for the thread to finish while (client->threaddestroy) microsleep(10000); } return GRAPPLE_OK; } //Join a game - we are passed a client which just needs to know where to go int grapple_lobbyclient_game_join(grapple_lobbyclient clientnum, grapple_lobbygameid gameid, grapple_client newclient) { internal_lobbyclient_data *client; grapple_lobbygame_internal *game; int returnval; int createval; client=internal_lobbyclient_get(clientnum); if (!client) { return GRAPPLE_FAILED; } //Only join one at a time if (client->ingame) { grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_CLIENT_CONNECTED); return GRAPPLE_FAILED; } pthread_mutex_lock(&client->games_mutex); //Find the game game=grapple_lobbygame_internal_locate_by_id(client->games,gameid); if (!game) { pthread_mutex_unlock(&client->games_mutex); grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_CANNOT_CONNECT); return GRAPPLE_FAILED; } //Set the details on the client we have been passed grapple_client_address_set(newclient,game->address); grapple_client_port_set(newclient,game->port); grapple_client_protocol_set(newclient,game->protocol); pthread_mutex_unlock(&client->games_mutex); grapple_client_name_set(newclient,client->name); //Actually connect the client and return the return value returnval=grapple_client_start(newclient,GRAPPLE_WAIT); if (returnval!=GRAPPLE_OK) return returnval; client->joinedgame=newclient; //start up the subthread that monitors the game sends message to the lobby //if the client disconnects client->threaddestroy=0; //Move the client into the game itself client->ingame=1; //If they have a room already if (client->currentroom) //Move them out of it grapple_client_group_remove(client->client,client->currentroom, client->serverid); createval=-1; //Create the thread while(createval!=0) { createval=pthread_create(&client->thread,NULL, grapple_lobbyclient_clientthread_main, (void *)client); if (createval!=0) { if (errno!=EAGAIN) { //Problem creating the thread that isnt a case of 'it will work //later, dont create it return GRAPPLE_FAILED; } } } pthread_detach(client->thread); return GRAPPLE_OK; } //Client has told us they have left the game int grapple_lobbyclient_game_leave(grapple_lobbyclient clientnum, grapple_client oldclient) { internal_lobbyclient_data *client; client=internal_lobbyclient_get(clientnum); if (!client) { return GRAPPLE_FAILED; } //They werent in one anyway! if (!client->ingame) { return GRAPPLE_OK; } client->joinedgame=0; //Just reset the ingame flag client->ingame=0; //If they have a room already if (client->currentroom) { //Move them back into it if (!grapple_client_group_add(client->client,client->currentroom, client->serverid)) { //We couldnt move them into their old room, move them into the //main room grapple_client_group_add(client->client,client->firstroom, client->serverid); client->currentroom=client->firstroom; } } else { grapple_client_group_add(client->client,client->firstroom, client->serverid); client->currentroom=client->firstroom; } //Shutdown the game thread if (client->thread) { client->threaddestroy=1; //Wait for the thread to finish while (client->threaddestroy) microsleep(10000); } return grapple_client_stop(oldclient); } //Get the list of all rooms grapple_lobbyroomid *grapple_lobbyclient_roomlist_get(grapple_lobbyclient clientnum) { internal_lobbyclient_data *client; int loopa,offset; grapple_lobbyroomid *returnval; client=internal_lobbyclient_get(clientnum); if (!client) { return NULL; } if (!client->client) { grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_CLIENT_NOT_CONNECTED); return NULL; } if (!client->firstroom) return NULL; //Use the lowlevel grapple function for the list of groups returnval=grapple_client_grouplist_get(client->client); if (returnval) { loopa=0; offset=0; while (returnval[loopa]) { if (offset) returnval[loopa]=returnval[loopa+1]; else { if (returnval[loopa]==client->firstroom) { returnval[loopa]=returnval[loopa+1]; offset=1; } } loopa++; } } return returnval; } //Find the name of a room char *grapple_lobbyclient_roomname_get(grapple_lobbyclient clientnum, grapple_lobbyroomid roomid) { internal_lobbyclient_data *client; client=internal_lobbyclient_get(clientnum); if (!client) { return NULL; } if (!client->client) { grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_CLIENT_NOT_CONNECTED); return NULL; } //Use the lowlevel grapple function for the name of a group return grapple_client_groupname_get(client->client,roomid); } grapple_lobbyroomid grapple_lobbyclient_roomid_get(grapple_lobbyclient clientnum, const char *name) { internal_lobbyclient_data *client; client=internal_lobbyclient_get(clientnum); if (!client) { return 0; } if (!client->client) { grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_CLIENT_NOT_CONNECTED); return 0; } //Use the lowlevel grapple function for the name of a group return grapple_client_group_from_name(client->client,name); } //Users in a room grapple_user *grapple_lobbyclient_roomusers_get(grapple_lobbyclient clientnum, grapple_lobbyroomid roomid) { internal_lobbyclient_data *client; client=internal_lobbyclient_get(clientnum); if (!client) { return NULL; } if (!client->client) { grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_CLIENT_NOT_CONNECTED); return NULL; } //Use the lowlevel grapple function to find users in a group return grapple_client_groupusers_get(client->client,roomid); } //Find a list of games in this room grapple_lobbygameid *grapple_lobbyclient_gamelist_get(grapple_lobbyclient clientnum, grapple_user roomid) { internal_lobbyclient_data *client; int count; grapple_lobbygameid *gamelist; grapple_lobbygame_internal *scan; client=internal_lobbyclient_get(clientnum); if (!client) return NULL; if (!client->client) { grapple_lobbyclient_error_set(client,GRAPPLE_ERROR_CLIENT_NOT_CONNECTED); return NULL; } //First count the number of games pthread_mutex_lock(&client->games_mutex); scan=client->games; count=0; while (scan) { if (scan->room == roomid) //Only the ones in this room count++; scan=scan->next; if (scan==client->games) scan=NULL; } if (!count) { pthread_mutex_unlock(&client->games_mutex); //There werent any return NULL; } //Allocate the memory based on the count gamelist= (grapple_lobbygameid *)malloc((count+1)*sizeof(grapple_lobbygameid)); scan=client->games; count=0; while (scan) { if (scan->room == roomid) //Set the value into the array gamelist[count++]=scan->id; scan=scan->next; if (scan==client->games) scan=NULL; } pthread_mutex_unlock(&client->games_mutex); //NULL the end of the array gamelist[count]=0; return gamelist; } //Find the details of a game, put them into a game structure grapple_lobbygame *grapple_lobbyclient_game_get(grapple_lobbyclient clientnum, grapple_lobbygameid gameid) { internal_lobbyclient_data *client; grapple_lobbygame *returnval=NULL; grapple_lobbygame_internal *game; client=internal_lobbyclient_get(clientnum); if (!client) { return NULL; } pthread_mutex_lock(&client->games_mutex); //Find the game game=grapple_lobbygame_internal_locate_by_id(client->games,gameid); if (game) { //Set up the retrun structure returnval=(grapple_lobbygame *)calloc(1,sizeof(grapple_lobbygame)); returnval->gameid=game->id; returnval->currentusers=game->currentusers; returnval->maxusers=game->maxusers; returnval->needpassword=game->needpassword; returnval->room=game->room; returnval->closed=game->closed; returnval->name=malloc(strlen(game->session)+1); strcpy(returnval->name,game->session); } pthread_mutex_unlock(&client->games_mutex); return returnval; } //Get rid of a set of game details passed to the user, freeing all memory int grapple_lobbyclient_game_dispose(grapple_lobbygame *target) { if (target->name) free(target->name); free(target); return GRAPPLE_OK; } //Set a callback. Callbacks are so that instead of needing to poll for //messages, a callback can be set so that the messages are handled immediately int grapple_lobbyclient_callback_set(grapple_lobbyclient clientnum, grapple_lobbymessagetype message, grapple_lobbycallback callback, void *context) { internal_lobbyclient_data *client; client=internal_lobbyclient_get(clientnum); if (!client) { return GRAPPLE_FAILED; } pthread_mutex_lock(&client->callback_mutex); //Add the callback to the list of callbacks client->callbacks=grapple_lobbycallback_add(client->callbacks, message,callback,context); pthread_mutex_unlock(&client->callback_mutex); return GRAPPLE_OK; } //Set ALL callbacks to the function requested int grapple_lobbyclient_callback_setall(grapple_lobbyclient client, grapple_lobbycallback callback, void *context) { //Set one using the function above if (grapple_lobbyclient_callback_set(client,GRAPPLE_LOBBYMSG_ROOMLEAVE, callback,context)==GRAPPLE_FAILED) return GRAPPLE_FAILED; //if one is ok, they all should be grapple_lobbyclient_callback_set(client,GRAPPLE_LOBBYMSG_ROOMENTER, callback,context); grapple_lobbyclient_callback_set(client,GRAPPLE_LOBBYMSG_ROOMCREATE, callback,context); grapple_lobbyclient_callback_set(client,GRAPPLE_LOBBYMSG_ROOMDELETE, callback,context); grapple_lobbyclient_callback_set(client,GRAPPLE_LOBBYMSG_CHAT, callback,context); grapple_lobbyclient_callback_set(client,GRAPPLE_LOBBYMSG_DISCONNECTED, callback,context); grapple_lobbyclient_callback_set(client,GRAPPLE_LOBBYMSG_NEWGAME, callback,context); grapple_lobbyclient_callback_set(client,GRAPPLE_LOBBYMSG_DELETEGAME, callback,context); grapple_lobbyclient_callback_set(client,GRAPPLE_LOBBYMSG_GAME_MAXUSERS, callback,context); grapple_lobbyclient_callback_set(client,GRAPPLE_LOBBYMSG_GAME_USERS, callback,context); grapple_lobbyclient_callback_set(client,GRAPPLE_LOBBYMSG_GAME_CLOSED, callback,context); return GRAPPLE_OK; } //Remove a callback int grapple_lobbyclient_callback_unset(grapple_lobbyclient clientnum, grapple_lobbymessagetype message) { internal_lobbyclient_data *client; client=internal_lobbyclient_get(clientnum); if (!client) { return GRAPPLE_FAILED; } pthread_mutex_lock(&client->callback_mutex); //Remove the callback client->callbacks=grapple_lobbycallback_remove(client->callbacks, message); pthread_mutex_unlock(&client->callback_mutex); return GRAPPLE_OK; } grapple_lobbyroomid grapple_lobbyclient_currentroomid_get(grapple_lobbyclient clientnum) { internal_lobbyclient_data *client; client=internal_lobbyclient_get(clientnum); if (!client) { return GRAPPLE_FAILED; } //If they are in a game, they are in no room if (client->joinedgame || client->runninggame) return 0; //Otherwise they must be in a room - if it is 0 then they are just connecting //wait for the room while (client->currentroom==0 && client->connectstatus==GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_CONNECTED) microsleep(10000); return client->currentroom; } //Get the last error grapple_error grapple_lobbyclient_error_get(grapple_lobbyclient clientnum) { internal_lobbyclient_data *client; grapple_error returnval; client=internal_lobbyclient_get(clientnum); if (!client) { return GRAPPLE_ERROR_NOT_INITIALISED; } returnval=client->last_error; //Now wipe the last error client->last_error=GRAPPLE_NO_ERROR; return returnval; } pong2-0.1.3/src/grapple/Makefile.in0000644000175000001440000003746611103705533013761 00000000000000# Makefile.in generated by automake 1.9.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src/grapple DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/acx_pthread.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru libgrapple_a_AR = $(AR) $(ARFLAGS) libgrapple_a_LIBADD = am_libgrapple_a_OBJECTS = dynstring.$(OBJEXT) \ grapple_callback.$(OBJEXT) \ grapple_callback_dispatcher.$(OBJEXT) grapple_client.$(OBJEXT) \ grapple_client_thread.$(OBJEXT) grapple_comms.$(OBJEXT) \ grapple_comms_api.$(OBJEXT) grapple_confirm.$(OBJEXT) \ grapple_connection.$(OBJEXT) grapple_error.$(OBJEXT) \ grapple_failover.$(OBJEXT) grapple_group.$(OBJEXT) \ grapple_lobby.$(OBJEXT) grapple_lobbycallback.$(OBJEXT) \ grapple_lobbyclient.$(OBJEXT) \ grapple_lobbyclient_thread.$(OBJEXT) \ grapple_lobbyconnection.$(OBJEXT) grapple_lobbygame.$(OBJEXT) \ grapple_lobbymessage.$(OBJEXT) grapple_message.$(OBJEXT) \ grapple_queue.$(OBJEXT) grapple_server.$(OBJEXT) \ grapple_server_thread.$(OBJEXT) socket.$(OBJEXT) \ tools.$(OBJEXT) libgrapple_a_OBJECTS = $(am_libgrapple_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(libgrapple_a_SOURCES) DIST_SOURCES = $(libgrapple_a_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ SDL_CFLAGS = @SDL_CFLAGS@ SDL_CONFIG = @SDL_CONFIG@ SDL_LIBS = @SDL_LIBS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ acx_pthread_config = @acx_pthread_config@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ noinst_LIBRARIES = \ libgrapple.a libgrapple_a_SOURCES = \ dynstring.c dynstring.h \ grapple_callback.c \ grapple_callback_dispatcher.c \ grapple_client.c \ grapple_client_thread.c \ grapple_comms.c \ grapple_comms_api.c \ grapple_confirm.c \ grapple_connection.c \ grapple_error.c \ grapple_failover.c \ grapple_group.c \ grapple_lobby.c \ grapple_lobbycallback.c \ grapple_lobbyclient.c \ grapple_lobbyclient_thread.c \ grapple_lobbyconnection.c \ grapple_lobbygame.c \ grapple_lobbymessage.c \ grapple_message.c \ grapple_queue.c \ grapple_server.c \ grapple_server_thread.c \ socket.c socket.h \ tools.c tools.h prototypes.h \ grapple.h grapple_confirm.h grapple_lobby.h grapple_protocols.h \ grapple_callback.h grapple_connection.h grapple_lobby_internal.h grapple_queue.h \ grapple_callback_dispatcher.h grapple_defines.h grapple_lobbycallback.h grapple_server.h \ grapple_callback_internal.h grapple_enums.h grapple_lobbyclient_thread.h grapple_server_internal.h \ grapple_client.h grapple_error.h grapple_lobbyconnection.h grapple_server_thread.h \ grapple_client_internal.h grapple_error_internal.h grapple_lobbygame.h grapple_structs.h \ grapple_client_thread.h grapple_failover.h grapple_lobbymessage.h grapple_types.h \ grapple_comms.h grapple_group.h grapple_message.h \ grapple_comms_api.h grapple_internal.h grapple_message_internal.h all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/grapple/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/grapple/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libgrapple.a: $(libgrapple_a_OBJECTS) $(libgrapple_a_DEPENDENCIES) -rm -f libgrapple.a $(libgrapple_a_AR) libgrapple.a $(libgrapple_a_OBJECTS) $(libgrapple_a_LIBADD) $(RANLIB) libgrapple.a mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dynstring.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_callback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_callback_dispatcher.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_client.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_client_thread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_comms.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_comms_api.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_confirm.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_connection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_error.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_failover.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_group.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_lobby.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_lobbycallback.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_lobbyclient.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_lobbyclient_thread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_lobbyconnection.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_lobbygame.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_lobbymessage.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_message.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_queue.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_server.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/grapple_server_thread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socket.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tools.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` uninstall-info-am: ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkdir_p) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pong2-0.1.3/src/grapple/grapple_enums.h0000644000175000001440000000534110473646146014726 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_ENUMS_H #define GRAPPLE_ENUMS_H typedef enum { GRAPPLE_MESSAGE_GRAPPLE_VERSION = 1, GRAPPLE_MESSAGE_PRODUCT_NAME = 2, GRAPPLE_MESSAGE_PRODUCT_VERSION = 3, GRAPPLE_MESSAGE_USER_CONNECTED = 4, GRAPPLE_MESSAGE_USER_YOU_CONNECTED = 5, GRAPPLE_MESSAGE_USER_NAME = 6, GRAPPLE_MESSAGE_USER_MESSAGE = 7, GRAPPLE_MESSAGE_USER_DISCONNECTED = 8, GRAPPLE_MESSAGE_SERVER_DISCONNECTED = 9, GRAPPLE_MESSAGE_HANDSHAKE_FAILED = 10, GRAPPLE_MESSAGE_SESSION_NAME = 11, GRAPPLE_MESSAGE_RELAY_TO = 12, GRAPPLE_MESSAGE_RELAY_ALL = 13, GRAPPLE_MESSAGE_RELAY_ALL_BUT_SELF = 14, GRAPPLE_MESSAGE_SERVER_FULL = 15, GRAPPLE_MESSAGE_SERVER_CLOSED = 16, GRAPPLE_MESSAGE_PASSWORD = 17, GRAPPLE_MESSAGE_PASSWORD_FAILED = 18, GRAPPLE_MESSAGE_PING = 19, GRAPPLE_MESSAGE_PING_REPLY = 20, GRAPPLE_MESSAGE_PING_DATA = 21, GRAPPLE_MESSAGE_FAILOVER_OFF = 22, GRAPPLE_MESSAGE_FAILOVER_ON = 23, GRAPPLE_MESSAGE_FAILOVER_CANT = 24, GRAPPLE_MESSAGE_FAILOVER_TRYME = 25, GRAPPLE_MESSAGE_FAILOVER_CAN = 26, GRAPPLE_MESSAGE_NEXT_GROUPID = 27, GRAPPLE_MESSAGE_REQUEST_NEXT_GROUPID = 28, GRAPPLE_MESSAGE_GROUP_CREATE = 29, GRAPPLE_MESSAGE_GROUP_ADD = 30, GRAPPLE_MESSAGE_GROUP_REMOVE = 31, GRAPPLE_MESSAGE_GROUP_DELETE = 32, GRAPPLE_MESSAGE_YOU_ARE_HOST = 33, GRAPPLE_MESSAGE_RECONNECTION = 34, GRAPPLE_MESSAGE_CONFIRM_RECEIVED = 35, GRAPPLE_MESSAGE_CONFIRM_TIMEOUT = 36, } grapple_messagetype_internal; #endif pong2-0.1.3/src/grapple/grapple_structs.h0000644000175000001440000001324110473646146015304 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_STRUCTS_H #define GRAPPLE_STRUCTS_H #include #include #include "grapple_callback.h" #include "grapple_client.h" #include "grapple_server.h" #include "grapple_protocols.h" #include "grapple_enums.h" #include "socket.h" typedef union { int i; char c[4]; } intchar; typedef union { double d; char c[8]; } doublechar; typedef struct _grapple_queue { grapple_messagetype_internal messagetype; void *data; size_t length; unsigned int id; int reliablemode; int from; //Matches grapple_connection->serverid struct _grapple_queue *next; struct _grapple_queue *prev; } grapple_queue; typedef struct _grapple_callback_list { grapple_callback callback; void *context; grapple_messagetype type; struct _grapple_callback_list *next; struct _grapple_callback_list *prev; } grapple_callback_list; typedef struct _grapple_confirm { int messageid; int *receivers; int receivercount; int maxreceiver; time_t timeout; struct _grapple_confirm *next; struct _grapple_confirm *prev; } grapple_confirm; typedef struct _grapple_connection { socketbuf *sock; socketbuf *failoversock; int sequential; char *name; int serverid; int me; int delete; int handshook; int handshakeflags; int reconnecting; struct timeval pingstart; int pingnumber; double pingtime; struct timeval pingend; grapple_protocol protocol; int reliablemode; grapple_confirm *confirm; pthread_mutex_t confirm_mutex; pthread_mutex_t message_out_mutex; pthread_mutex_t message_in_mutex; grapple_queue *message_in_queue; grapple_queue *message_out_queue; struct _grapple_connection *next; struct _grapple_connection *prev; } grapple_connection; typedef struct { pthread_t thread; struct _grapple_callbackevent *event_queue; pthread_mutex_t event_queue_mutex; int finished; } grapple_callback_dispatcher; typedef struct _grapple_failover_host { int id; char *address; struct _grapple_failover_host *next; struct _grapple_failover_host *prev; } grapple_failover_host; typedef struct _grapple_group_container { int id; struct _grapple_group_container *next; struct _grapple_group_container *prev; } grapple_group_container; typedef struct _internal_grapple_group { int id; char *name; grapple_group_container *contents; struct _internal_grapple_group *next; struct _internal_grapple_group *prev; } internal_grapple_group; typedef struct _internal_server_data { grapple_server servernum; int port; grapple_protocol protocol; socketbuf *sock; int sequential; int reliablemode; int closed; int usercount; int maxusers; char *ip; char *productname; char *productversion; char *session; char *password; pthread_t thread; int threaddestroy; int failover; int timeout; int user_serverid; socketbuf *wakesock; grapple_error last_error; time_t last_confirm_check; grapple_confirmid sendwait; double autoping; grapple_confirm *confirm; pthread_mutex_t internal_mutex; pthread_mutex_t confirm_mutex; grapple_failover_host *failoverhosts; internal_grapple_group *groups; pthread_mutex_t callback_mutex; grapple_callback_list *callbackanchor; pthread_mutex_t message_in_mutex; grapple_queue *message_in_queue; pthread_mutex_t connection_mutex; pthread_mutex_t group_mutex; pthread_mutex_t failover_mutex; socket_processlist *socklist; grapple_connection *userlist; grapple_callback_dispatcher *dispatcher; struct _internal_server_data *next; struct _internal_server_data *prev; } internal_server_data; typedef struct _internal_client_data { grapple_client clientnum; char *address; int port; grapple_protocol protocol; char *name_provisional; char *name; int serverid; char *session; char *password; socketbuf *sock; socketbuf *failoversock; int sequential; int reliablemode; int next_group; char *productname; char *productversion; pthread_t thread; int connecting; int disconnected; int threaddestroy; int failover; int timeout; socketbuf *wakesock; grapple_error last_error; struct timeval pingstart; int pingnumber; double pingtime; socket_processlist *socklist; grapple_confirmid sendwait; struct timeval pingend; grapple_failover_host *failoverhosts; internal_grapple_group *groups; pthread_mutex_t internal_mutex; pthread_mutex_t callback_mutex; grapple_callback_list *callbackanchor; pthread_mutex_t message_in_mutex; grapple_queue *message_in_queue; pthread_mutex_t message_out_mutex; grapple_queue *message_out_queue; pthread_mutex_t connection_mutex; pthread_mutex_t group_mutex; pthread_mutex_t failover_mutex; grapple_connection *userlist; grapple_callback_dispatcher *dispatcher; struct _internal_client_data *next; struct _internal_client_data *prev; } internal_client_data; #endif pong2-0.1.3/src/grapple/grapple_group.h0000644000175000001440000000401110473646146014724 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_GROUP_H #define GRAPPLE_GROUP_H #include "grapple_structs.h" extern grapple_group_container *group_container_aquire(int); extern grapple_group_container *group_container_link(grapple_group_container *, grapple_group_container *); extern int create_client_group(internal_client_data *,int,const char *); extern int create_server_group(internal_server_data *,int,const char *); extern int client_group_add(internal_client_data *,int,int); extern int server_group_add(internal_server_data *,int,int); extern int client_group_remove(internal_client_data *,int,int); extern int server_group_remove(internal_server_data *,int,int); extern int delete_client_group(internal_client_data *,int); extern int delete_server_group(internal_server_data *,int); extern int *server_group_unroll(internal_server_data *,int); extern int *client_group_unroll(internal_client_data *,int); extern internal_grapple_group *group_locate(internal_grapple_group *,int); extern internal_grapple_group *group_unlink(internal_grapple_group *, internal_grapple_group *); extern int group_dispose(internal_grapple_group *); #endif pong2-0.1.3/src/grapple/grapple_comms_api.h0000644000175000001440000001121010473646146015536 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_COMMS_API_H #define GRAPPLE_COMMS_API_H #include "grapple_structs.h" #include "grapple_comms.h" extern int c2s_handshake(internal_client_data *); extern int c2s_set_name(internal_client_data *,const char *); extern int c2s_message(internal_client_data *,int,int, void *,int); extern int c2s_relaymessage(internal_client_data *,int, int,grapple_confirmid, void *,int); extern int c2s_relayallmessage(internal_client_data *,int,grapple_confirmid, void *,int); extern int c2s_relayallbutselfmessage(internal_client_data *, int,grapple_confirmid, void *,int); extern int c2s_ping(internal_client_data *,int); extern int c2s_pingreply(internal_client_data *,int); extern int c2s_disconnect(internal_client_data *); extern int c2s_request_group(internal_client_data *); extern int c2s_group_create(internal_client_data *,int,const char *); extern int c2s_group_add(internal_client_data *,int,int); extern int c2s_group_remove(internal_client_data *,int,int); extern int c2s_group_delete(internal_client_data *,int); extern int c2s_failover_cant(internal_client_data *); extern int c2s_failover_tryme(internal_client_data *); extern int c2s_send_reconnection(internal_client_data *); extern int c2s_confirm_received(internal_client_data *,int,int); extern int s2c_handshake_failed(internal_server_data *,grapple_connection *); extern int s2c_password_failed(internal_server_data *,grapple_connection *); extern int s2c_server_closed(internal_server_data *,grapple_connection *); extern int s2c_server_full(internal_server_data *,grapple_connection *); extern int s2c_session_name(internal_server_data *, grapple_connection *,const char *session); extern int s2c_user_connected(internal_server_data *, grapple_connection *,grapple_connection *); extern int s2c_user_setname(internal_server_data *, grapple_connection *,grapple_connection *); extern int s2c_message(internal_server_data *, grapple_connection *,int,int,void *,int); extern int s2c_inform_disconnect(internal_server_data *, grapple_connection *,grapple_connection *); extern int s2c_relaymessage(internal_server_data *, grapple_connection *,grapple_connection *, int,int,void *,int); extern int s2c_ping(internal_server_data *,grapple_connection *,int); extern int s2c_pingreply(internal_server_data *,grapple_connection *,int); extern int s2c_disconnect(internal_server_data *,grapple_connection *); extern int s2c_ping_data(internal_server_data *, grapple_connection *,grapple_connection *); extern int s2c_failover_off(internal_server_data *,grapple_connection *); extern int s2c_failover_on(internal_server_data *,grapple_connection *); extern int s2c_failover_cant(internal_server_data *,grapple_connection *,int); extern int s2c_failover_can(internal_server_data *, grapple_connection *,int,const char *); extern int s2c_send_nextgroupid(internal_server_data *, grapple_connection *,int); extern int s2c_group_create(internal_server_data *, grapple_connection *,int,const char *); extern int s2c_group_add(internal_server_data *,grapple_connection *,int,int); extern int s2c_group_remove(internal_server_data *, grapple_connection *,int,int); extern int s2c_group_delete(internal_server_data *,grapple_connection *,int); extern int s2c_confirm_received(internal_server_data *, grapple_connection *,int); extern int s2c_confirm_timeout(internal_server_data *, grapple_connection *,grapple_confirm *); extern int s2SUQ_user_setname(internal_server_data *,grapple_connection *); extern int s2SUQ_user_disconnect(internal_server_data *,grapple_connection *); extern int s2SUQ_confirm_received(internal_server_data *,int); extern int s2SUQ_confirm_timeout(internal_server_data *,grapple_confirm *); #endif pong2-0.1.3/src/grapple/prototypes.h0000644000175000001440000000233510473646146014315 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef PROTOTYPES_H #define PROTOTYPES_H #include "grapple_structs.h" //These are functions we just cant prototype where they should go, as //we dont want to expose the API to the user. extern internal_server_data *internal_server_get(grapple_server); //extern internal_client_data *internal_client_get(grapple_client); #endif pong2-0.1.3/src/grapple/grapple_callback_dispatcher.h0000644000175000001440000000212210473646146017533 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_CALLBACK_DISPATCHER_H #define GRAPPLE_CALLBACK_DISPATCHER_H #include "grapple_structs.h" extern grapple_callback_dispatcher *grapple_callback_dispatcher_create(void); #endif pong2-0.1.3/src/grapple/grapple_queue.c0000644000175000001440000000441610473646146014720 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #define _XOPEN_SOURCE 500 #include #include #include "grapple_queue.h" #include "grapple_callback_internal.h" //Allocate a new queue object. grapple_queue *queue_struct_aquire(void) { return (grapple_queue *)calloc(1,sizeof(grapple_queue)); } //Dispose of a queue object, including all of its associated memory void queue_struct_dispose(grapple_queue *queue) { if (queue->data) free(queue->data); free (queue); return; } //Link a queue object into a list of queue objects grapple_queue *queue_link(grapple_queue *queue,grapple_queue *item) { if (!queue) { item->next=item; item->prev=item; return item; } item->next=queue; item->prev=queue->prev; item->next->prev=item; item->prev->next=item; return queue; } //Unlink a queue object from a list of queue objects grapple_queue *queue_unlink(grapple_queue *queue,grapple_queue *item) { if (queue->next==queue) { if (queue!=item) return queue; return NULL; } item->prev->next=item->next; item->next->prev=item->prev; if (item==queue) queue=item->next; return queue; } //Count the number of items in a queue list int grapple_queue_count(grapple_queue *queue) { grapple_queue *scan; int count=0; scan=queue; while (scan) { count++; scan=scan->next; if (scan==queue) scan=0; } return count; } pong2-0.1.3/src/grapple/grapple_server_thread.c0000644000175000001440000014642310473646146016436 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include #include #include #include #include #include #include "grapple_server_thread.h" #include "grapple_server_internal.h" #include "grapple_connection.h" #include "grapple_comms_api.h" #include "grapple_internal.h" #include "grapple_queue.h" #include "grapple_group.h" #include "grapple_defines.h" #include "grapple_failover.h" #include "grapple_confirm.h" #include "tools.h" #include "grapple_callback_internal.h" #include "grapple_callback_dispatcher.h" //This function is called when all handshake parameters have been met, which //means that the game has correctly identified itself static void postprocess_handshake_good(internal_server_data *server, grapple_connection *user) { grapple_connection *scan; grapple_failover_host *failoverscan; internal_grapple_group *groupscan; grapple_group_container *container; //Dont do this twice if (user->handshook) return; if (!user->reconnecting) { //If the user is connecting for the first time if (server->closed) { //If the server is closed, tell the user they cant connect s2c_server_closed(server,user); user->delete=1; return; } if (server->maxusers>0 && server->usercount==server->maxusers) { //If the server is full, tell them user they cant connect s2c_server_full(server,user); user->delete=1; return; } } //Record that the user has done their handshake, so it doesnt happen again user->handshook=1; //This is the user, set the users sequential to the requested //value now we dont have to worry about sequence if (user->sequential) socket_mode_set(user->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); else socket_mode_unset(user->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); //Increase the count of connected users server->usercount++; if (!user->reconnecting) { //If this is a new connection //Send the message to the server that the user has connected s2SUQ_send_int(server,user->serverid, GRAPPLE_MESSAGE_USER_CONNECTED,user->serverid); //Send the session name to the client s2c_session_name(server,user,server->session); pthread_mutex_lock(&server->connection_mutex); //Loop through all users scan=server->userlist; while (scan) { //Tell all users that this user has connected s2c_user_connected(server,scan,user); if (scan!=user) { //Now tell this user about all other users that are connected s2c_user_connected(server,user,scan); if (scan->name) //And their names s2c_user_setname(server,user,scan); } scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); } //Send the new user a new group ID to use s2c_send_nextgroupid(server,user,server->user_serverid++); if (!user->reconnecting) { //Now if we are running failover if (server->failover) { //First tell this new one to try and be a failover host s2c_failover_on(server,user); //Now we tell the user a list of everyone who CAN be a failover host pthread_mutex_lock(&server->failover_mutex); failoverscan=server->failoverhosts; while (failoverscan) { s2c_failover_can(server,user,failoverscan->id, failoverscan->address); failoverscan=failoverscan->next; if (failoverscan==server->failoverhosts) failoverscan=NULL; } pthread_mutex_unlock(&server->failover_mutex); } //Now tell the new user about all the groups pthread_mutex_lock(&server->group_mutex); groupscan=server->groups; while (groupscan) { //Add this groupto the users list of groups now s2c_group_create(server,user,groupscan->id,groupscan->name); //Now add all the members to this group that are in the servers group container=groupscan->contents; while (container) { s2c_group_add(server,user,groupscan->id,container->id); container=container->next; if (container==groupscan->contents) container=NULL; } groupscan=groupscan->next; if (groupscan==server->groups) groupscan=NULL; } pthread_mutex_unlock(&server->group_mutex); } //The user is done! user->reconnecting=0; } //The client has sent us their grapple version as part of the handshake static void process_message_grapple_version(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { //Compare the version passed by the client to the hardcoded version we have if (strlen(GRAPPLE_VERSION)!=datalen || memcmp(data,GRAPPLE_VERSION,datalen)) { //Now we have a grapple version mismatch s2c_handshake_failed(server,user); user->delete=1; } else { //Set the flag to note its done user->handshakeflags|=HANDSHAKE_FLAG_GRAPPLE_VERSION; } //If all handshake stages have been completed if (user->handshakeflags== (HANDSHAKE_FLAG_GRAPPLE_VERSION| HANDSHAKE_FLAG_PRODUCT_NAME| HANDSHAKE_FLAG_PASSWORD| HANDSHAKE_FLAG_PRODUCT_VERSION)) { //Go here to complete the connection postprocess_handshake_good(server,user); } return; } //The client has sent us the name of the game they are playing static void process_message_product_name(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { //Check the server and client are playing the same game if (strlen(server->productname)!=datalen || memcmp(data,server->productname,datalen)) { //Now we have a product name mismatch s2c_handshake_failed(server,user); user->delete=1; } else { //The game matches, add this flag user->handshakeflags|=HANDSHAKE_FLAG_PRODUCT_NAME; } //If the handshake is complete if (user->handshakeflags== (HANDSHAKE_FLAG_GRAPPLE_VERSION| HANDSHAKE_FLAG_PRODUCT_NAME| HANDSHAKE_FLAG_PASSWORD| HANDSHAKE_FLAG_PRODUCT_VERSION)) { //Finish the connection postprocess_handshake_good(server,user); } //Its ok, so just return return; } //The client has sent us the version of the game they are playing static void process_message_product_version(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { //Check the version on the server and client are the same if (strlen(server->productversion)!=datalen || memcmp(data,server->productversion,datalen)) { //Now we have a grapple version mismatch s2c_handshake_failed(server,user); user->delete=1; } else { //Add the handshake flag user->handshakeflags|=HANDSHAKE_FLAG_PRODUCT_VERSION; } //If all handshake flags are set if (user->handshakeflags== (HANDSHAKE_FLAG_GRAPPLE_VERSION| HANDSHAKE_FLAG_PRODUCT_NAME| HANDSHAKE_FLAG_PASSWORD| HANDSHAKE_FLAG_PRODUCT_VERSION)) { //Complete connection postprocess_handshake_good(server,user); } } //The client has sent us a password to connect static void process_message_password(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { //If the password even exists if (server->password && *server->password) { //Test if it is the same if (strlen(server->password)!=datalen || memcmp(data,server->password,datalen)) { //Now we have a grapple password mismatch s2c_password_failed(server,user); user->delete=1; } else { //It is the same, note the flag user->handshakeflags|=HANDSHAKE_FLAG_PASSWORD; } } else { //There is no password, note the flag user->handshakeflags|=HANDSHAKE_FLAG_PASSWORD; } //Test to see if all handshake flags are done if (user->handshakeflags== (HANDSHAKE_FLAG_GRAPPLE_VERSION| HANDSHAKE_FLAG_PRODUCT_NAME| HANDSHAKE_FLAG_PASSWORD| HANDSHAKE_FLAG_PRODUCT_VERSION)) { //Complete the connection process postprocess_handshake_good(server,user); } } //The client has sent us their name static void process_message_user_name(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { grapple_connection *scan; //If this user already has a name, clear it if (user->name) free(user->name); //set the name user->name=(char *)malloc(datalen+1); strncpy(user->name,(char *)data,datalen); user->name[datalen]=0; if (!user->handshook) return; //Now scan the userlist, show all users the new name pthread_mutex_lock(&server->connection_mutex); s2SUQ_user_setname(server,user); scan=server->userlist; while (scan) { //send the name to this user s2c_user_setname(server,scan,user); scan=scan->next; if (scan==server->userlist) scan=NULL; } pthread_mutex_unlock(&server->connection_mutex); } //Received a message from the user to the server static void process_message_user_message(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; int flags,messageid; //If the user has not completed handshake, dont let them send. if (!user->handshook) return; //Decode the message to the parts we need/want //4 bytes : flags //4 bytes : message ID // : message memcpy(val.c,data,4); flags=val.i; memcpy(val.c,data+4,4); messageid=ntohl(val.i); //Add a message to the clients inbound message queue s2SUQ_send(server,user->serverid,messagetype,data+8,datalen-8); //Now, if required, send an acknowledgement back to the user if (flags & GRAPPLE_CONFIRM) s2c_confirm_received(server,user,messageid); return; } //The user has told us they are disconnecting static void process_message_user_disconnected(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { //Simply set the delete flag, dont delete them when we are in the middle of //processing them, that would break things user->delete=1; return; } //The client has requested a message to be sent directly to another //user. This comes via the server as we arent point to point. static void process_message_relay_to(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; int target,flags,id; grapple_connection *scan; int *group_data,loopa,count=0; //If the user has not completed handshake, dont let them send. if (!user->handshook) return; //Data layout is: // 4 bytes ID of who to send the message to // 4 bytes flags // 4 bytes message id // DATA memcpy(val.c,data,4); target=ntohl(val.i); memcpy(val.c,data+4,4); flags=val.i; memcpy(val.c,data+8,4); id=ntohl(val.i); pthread_mutex_lock(&server->group_mutex); if (group_locate(server->groups,target)) { //The message is being sent to a group. //Unroll the group and obtain all the group members in an //int array group_data=server_group_unroll(server,target); pthread_mutex_unlock(&server->group_mutex); //Loop through each user in the int array loopa=0; while (group_data[loopa]) { pthread_mutex_lock(&server->connection_mutex); //Find that user scan=server->userlist; while (scan) { if (scan->serverid==group_data[loopa]) { //If this is the user, send them the message s2c_relaymessage(server,scan,user,flags,id, data+12,datalen-12); //Count the send count++; scan=NULL; } else scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); loopa++; } //Finshed with the list of users. free(group_data); } else { pthread_mutex_unlock(&server->group_mutex); pthread_mutex_lock(&server->connection_mutex); //It is a message to a single user, find them and send scan=server->userlist; while (scan) { if (scan->serverid==target) { //Send the message s2c_relaymessage(server,scan,user,flags,id,data+12,datalen-12); //Count the send count++; scan=NULL; } else scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); } //If nobody was sent to in the end, but they want confirmation, then //confirm, as the message WAS sent to all users it was supposed to go to if (count == 0 && flags & GRAPPLE_CONFIRM) s2c_confirm_received(server,user,id); return; } //The client has requested we relay a message to everyone static void process_message_relay_all(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { grapple_connection *scan; int flags,id,count=0; intchar val; //If the user has not completed handshake, dont let them send. if (!user->handshook) return; //Data layout is: // 4 bytes flags // 4 bytes message id // DATA memcpy(val.c,data,4); flags=val.i; memcpy(val.c,data+4,4); id=ntohl(val.i); pthread_mutex_lock(&server->connection_mutex); //Loop through all users scan=server->userlist; while (scan) { //Send this user the message s2c_relaymessage(server,scan,user,flags,id,data+8,datalen-8); //Count the send count++; scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); //If nobody was sent to in the end, but they want confirmation, then //confirm, as the message WAS sent to all users it was supposed to go to if (count == 0 && flags & GRAPPLE_CONFIRM) s2c_confirm_received(server,user,id); return; } //The user wants a message relayed to all OTHER users, so not to themself static void process_message_relay_all_but_self(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { grapple_connection *scan; int flags,id,count=0; intchar val; //If the user has not completed handshake, dont let them send. if (!user->handshook) return; //Data layout is: // 4 bytes flags // 4 bytes message id // DATA memcpy(val.c,data,4); flags=val.i; memcpy(val.c,data+4,4); id=ntohl(val.i); pthread_mutex_lock(&server->connection_mutex); //Loop all users scan=server->userlist; while (scan) { //Dont send to self if (scan->serverid!=user->serverid) { //Send the message s2c_relaymessage(server,scan,user,flags,id,data+8,datalen-8); //Count the send count++; } scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); //If nobody was sent to in the end, but they want confirmation, then //confirm, as the message WAS sent to all users it was supposed to go to if (count == 0 && flags & GRAPPLE_CONFIRM) s2c_confirm_received(server,user,id); return; } //A ping request has been received. This is just a request to reply //to see how long it takes. We use a ping over the grapple system instead of //an ICMP ping cos an ICMP ping would only show network latancies not //issues with the processing of the ping itself static void process_message_ping(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; //When we receive a ping, ALL we do is send the same number back - we dont //even need to ntohl it as its going back as it came if (datalen!=4) return; memcpy(val.c,data,4); //Send the reply s2c_pingreply(server,user,val.i); return; } //We have received a reply to a ping we sent out static void process_message_ping_reply(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; grapple_connection *scan; //When we receive a pingreply, the ping number is already correct if (datalen!=4) return; memcpy(val.c,data,4); if (val.i!=user->pingnumber) { //This ping is returning after the next one is sent,ignore it return; } //Now we see how long the ping took gettimeofday(&user->pingend,NULL); user->pingtime=((user->pingend.tv_sec-user->pingstart.tv_sec)*1000000); user->pingtime+=(user->pingend.tv_usec-user->pingstart.tv_usec); //Now send a message to the servers message queue s2SUQ_send_double(server,user->serverid,messagetype,user->pingtime); //Now we send the ping data back to all clients pthread_mutex_lock(&server->connection_mutex); //Loop through all users scan=server->userlist; while (scan) { //Send them the ping data s2c_ping_data(server,scan,user); scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); return; } //The client has requested a new message group ID to be sent to them static void process_message_request_next_groupid(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { //This function just sends a new next group ID to the client s2c_send_nextgroupid(server,user,server->user_serverid++); } //The client has requested that we create a new message group static void process_message_group_create(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { int groupid; intchar val; char *outdata; grapple_connection *scan; //If the user has not completed handshake, dont let them send. if (!user->handshook) return; //The reply to this command is to create the group and then send a message //to all clients (except the user that initiated) to create the group. //The format of the data is: // 4 bytes : Group ID // : Group name outdata=(char *)malloc(datalen+1); memcpy(val.c,data,4); groupid=ntohl(val.i); //Switch the group ID from network to host order, and place it back into the //Data to send to the servers message queue val.i=groupid; memcpy(outdata,val.c,4); //Add the name to the message queue memcpy(outdata+4,data+4,datalen-4); outdata[datalen]=0; //create a new group in the server create_server_group(server,groupid,outdata+4); //Now go to each client and tell them there is a new group pthread_mutex_lock(&server->connection_mutex); scan=server->userlist; while (scan) { //If the user is not the originator if (scan!=user) //Tell this user s2c_group_create(server,scan,groupid,outdata+4); scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); //Now send the message to the servers queue s2SUQ_send(server,user->serverid,GRAPPLE_MESSAGE_GROUP_CREATE, outdata,datalen); free(outdata); //We're done } //The client has requested adding a member to a group static void process_message_group_add(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { int groupid; int contentid; intchar val; grapple_connection *scan; char outdata[8]; //If the user has not completed handshake, dont let them send. if (!user->handshook) return; //The data is: // 4 bytes : Group ID // 4 bytes : User ID to add memcpy(val.c,data,4); groupid=ntohl(val.i); memcpy(val.c,data+4,4); contentid=ntohl(val.i); //create a new item in the servers group if (!server_group_add(server,groupid,contentid)) return; //Now go to each client and tell them there is a new member in this group pthread_mutex_lock(&server->connection_mutex); scan=server->userlist; while (scan) { //If its not the originator if (scan!=user) { //Send a message s2c_group_add(server,scan,groupid,contentid); } scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); //Construct the data to send it to the servers queue val.i=groupid; memcpy(outdata,val.c,4); val.i=contentid; memcpy(outdata+4,val.c,4); //Send it to the servers queue s2SUQ_send(server,user->serverid,GRAPPLE_MESSAGE_GROUP_ADD,outdata,8); //We're done } //The client has requested we remove a member from a group static void process_message_group_remove(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { int groupid; int contentid; intchar val; grapple_connection *scan; char outdata[8]; //If the user has not completed handshake, dont let them send. if (!user->handshook) return; //4 bytes : Group ID //4 bytes : User to remove memcpy(val.c,data,4); groupid=ntohl(val.i); memcpy(val.c,data+4,4); contentid=ntohl(val.i); //create a new item in the servers group if (!server_group_remove(server,groupid,contentid)) return; //Now go to each client and tell to remove the member from this group pthread_mutex_lock(&server->connection_mutex); scan=server->userlist; while (scan) { //If it isnt the originator if (scan!=user) //Send the message s2c_group_remove(server,scan,groupid,contentid); scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); //Now construct the data for the servers message queue val.i=groupid; memcpy(outdata,val.c,4); val.i=contentid; memcpy(outdata+4,val.c,4); //Send the message to the servers message queue s2SUQ_send(server,user->serverid,GRAPPLE_MESSAGE_GROUP_REMOVE,outdata,8); } //The client has requested a complete group delete static void process_message_group_delete(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { int groupid; intchar val; grapple_connection *scan; char *outdata; internal_grapple_group *group; int length; //If the user has not completed handshake, dont let them send. if (!user->handshook) return; //4 bytes group ID memcpy(val.c,data,4); groupid=ntohl(val.i); pthread_mutex_lock(&server->group_mutex); group=group_locate(server->groups,groupid); length=strlen(group->name); outdata=(char *)malloc(length+4); val.i=groupid; memcpy(outdata,val.c,4); memcpy(outdata+4,group->name,length); pthread_mutex_unlock(&server->group_mutex); //Delete it on the server if (!delete_server_group(server,groupid)) return; //Now go to each client and tell them pthread_mutex_lock(&server->connection_mutex); scan=server->userlist; while (scan) { //If it isnt the originating client if (scan!=user) //Send them the message s2c_group_delete(server,scan,groupid); scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); //Send the message to the servers message queue s2SUQ_send(server,user->serverid,GRAPPLE_MESSAGE_GROUP_DELETE, outdata,length+4); free(outdata); } //The client has said they arent able to provide a failover host static void process_message_failover_cant(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { //This is just a curtesy function, if the client cant failover to it, //then we dont actually do anything, we only do something if it CAN //failover } //The client has said thet think they CAN be a failover host, try and connect //to their test port static void process_message_failover_tryme(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { char *address; //The client says they can failover - so try and connect to them, see //if we can reach them. If we can, they can be a host. address=user->sock->host; if (!address) { //We dont know where the remote server is! tell it it cant be //a failover s2c_failover_cant(server,user,0); return; } //Connect to them either with TCP or UDP - as appropriate switch (server->protocol) { case GRAPPLE_PROTOCOL_TCP: user->failoversock=socket_create_inet_tcp_wait(address,server->port,0); break; case GRAPPLE_PROTOCOL_UDP: user->failoversock=socket_create_inet_udp2way_wait(address, server->port,0); break; } if (!user->failoversock) { //The socket couldnt be created s2c_failover_cant(server,user,0); return; } //This one could end up as a remote failover socket, add it to the //servers list of sockets to process server->socklist=socket_link(server->socklist,user->failoversock); //Now we just check it whenever we loop, to see if its alive or dead. If //it ends up dead, the client cant be a failover, if it ends up connected, //it can be a failover } //The client is reconnecting. This means we are a new host having just run //failover, and the client is trying to find where to live next static void process_message_reconnection(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; int length; //4 bytes : server ID //4 bytes : length of the name // : Name memcpy(val.c,data,4); //Set the new users server ID user->serverid=ntohl(val.i); memcpy(val.c,data+4,4); length=ntohl(val.i); //Create the users name user->name=(char *)malloc(length+1); memcpy(user->name,data+8,length); user->name[length]=0; //Mark the user as reconnecting for when they finish their handshake user->reconnecting=1; } //The server has received a confirmation that a message has been received //by the one of the users it was sent to. static void process_message_confirm_received(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { intchar val; int userid,messageid; grapple_connection *origin=NULL,*scan; //4 bytes : ID of origin user //4 bytes : Message ID memcpy(val.c,data,4); userid=ntohl(val.i); memcpy(val.c,data+4,4); messageid=ntohl(val.i); if (!userid) { //It came from the server, log the return here server_unregister_confirm(server,messageid,user->serverid); return; } //It came from a user pthread_mutex_lock(&server->connection_mutex); //Locate the user who sent the message scan=server->userlist; while (scan) { if (scan->serverid==userid) { //This is the user origin=scan; //Break the loop scan=NULL; } else scan=scan->next; if (scan==server->userlist) scan=NULL; } //If we found a sender if (origin) //Register it as confirmed unregister_confirm(server,origin,messageid,user->serverid); pthread_mutex_unlock(&server->connection_mutex); return; } //The server has received a message from a user. //Call the appropriate handler function static void process_message(internal_server_data *server, grapple_connection *user, grapple_messagetype_internal messagetype, void *data,int datalen) { switch (messagetype) { case GRAPPLE_MESSAGE_GRAPPLE_VERSION: process_message_grapple_version(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_PRODUCT_NAME: process_message_product_name(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_PRODUCT_VERSION: process_message_product_version(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_PASSWORD: process_message_password(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_USER_NAME: process_message_user_name(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_USER_MESSAGE: process_message_user_message(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_USER_DISCONNECTED: process_message_user_disconnected(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_RELAY_TO: process_message_relay_to(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_RELAY_ALL: process_message_relay_all(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_RELAY_ALL_BUT_SELF: process_message_relay_all_but_self(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_PING: process_message_ping(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_PING_REPLY: process_message_ping_reply(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_FAILOVER_CANT: process_message_failover_cant(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_FAILOVER_TRYME: process_message_failover_tryme(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_REQUEST_NEXT_GROUPID: process_message_request_next_groupid(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_GROUP_CREATE: process_message_group_create(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_GROUP_ADD: process_message_group_add(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_GROUP_REMOVE: process_message_group_remove(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_GROUP_DELETE: process_message_group_delete(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_RECONNECTION: process_message_reconnection(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_CONFIRM_RECEIVED: process_message_confirm_received(server,user,messagetype,data,datalen); break; case GRAPPLE_MESSAGE_USER_CONNECTED: case GRAPPLE_MESSAGE_USER_YOU_CONNECTED: case GRAPPLE_MESSAGE_SERVER_DISCONNECTED: case GRAPPLE_MESSAGE_HANDSHAKE_FAILED: case GRAPPLE_MESSAGE_SERVER_CLOSED: case GRAPPLE_MESSAGE_SERVER_FULL: case GRAPPLE_MESSAGE_PASSWORD_FAILED: case GRAPPLE_MESSAGE_SESSION_NAME: case GRAPPLE_MESSAGE_PING_DATA: case GRAPPLE_MESSAGE_FAILOVER_ON: case GRAPPLE_MESSAGE_FAILOVER_OFF: case GRAPPLE_MESSAGE_FAILOVER_CAN: case GRAPPLE_MESSAGE_NEXT_GROUPID: case GRAPPLE_MESSAGE_YOU_ARE_HOST: case GRAPPLE_MESSAGE_CONFIRM_TIMEOUT: //Will never be received by the server break; } } //Process a users incoming data which has been received via UDP static int process_user_udp(internal_server_data *server, grapple_connection *user) { socket_udp_data *pulldata; int messagelength; intchar indata; grapple_messagetype_internal messagetype; int count=0; char *ptr; //If the user is dead, ignore it if (user->delete) return 0; //Pull the next UDP packet from the socket pulldata=socket_udp_indata_pull(user->sock); //Continue while there is data to read while (pulldata) { //Data is of the form: //4 bytes: Message type //4 bytes: Message length // DATA ptr=pulldata->data; memcpy(indata.c,ptr,4); messagetype=ntohl(indata.i); ptr+=4; memcpy(indata.c,ptr,4); messagelength=ntohl(indata.i); ptr+=4; //Process the message process_message(server,user,messagetype,ptr,messagelength); //Free the data struct we were passed socket_udp_data_free(pulldata); count++; //Try and get another pulldata=socket_udp_indata_pull(user->sock); } return count; } //Process a users incoming data which has been received via TCP static int process_user_tcp(internal_server_data *server, grapple_connection *user) { const void *data,*ptr; void *pulldata,*pullptr; int length,messagelength; intchar indata; grapple_messagetype_internal messagetype; int count=0; //If the user is dead, dont read if (user->delete) return 0; //We will return as soon as there is no more data, so we can loop forever while (1) { //Initially only VIEW the data, dont take it length=socket_indata_length(user->sock); //There must be at least 8 bytes for the data, that is the minimum //amount of data a packet can contain if (length<8) return count; //Get the data to view data=socket_indata_view(user->sock); ptr=data; //Data is of the form: //4 bytes: Message type //4 bytes: Message length // DATA memcpy(indata.c,ptr,4); ptr+=4; messagetype=ntohl(indata.i); memcpy(indata.c,ptr,4); ptr+=4; messagelength=ntohl(indata.i); //Check there is enough in the buffer for the whole message if (length < messagelength+8) return count; //We have enough for the whole message, grab it pulldata=socket_indata_pull(user->sock,messagelength+8); //Move to the start of the data pullptr=pulldata+8; //Process the message process_message(server,user, messagetype,pullptr,messagelength); //Free the data we took free(pulldata); count++; } return count; } //Here we are processing the users failover socket, looking for a reply //from that socket that would indicate that that user is OK to use as a //failover static int process_failoversock(internal_server_data *server, grapple_connection *user) { grapple_connection *scan; if (socket_dead(user->failoversock)) { //This is a failed try, delete the socket and tell the user server->socklist=socket_unlink(server->socklist,user->failoversock); socket_destroy(user->failoversock); user->failoversock=NULL; s2c_failover_cant(server,user,0); return 1; } if (socket_connected(user->failoversock)) { //This is a successful try, delete the socket and tell the user server->socklist=socket_unlink(server->socklist,user->failoversock); socket_destroy(user->failoversock); user->failoversock=NULL; pthread_mutex_lock(&server->connection_mutex); //Tell all users scan=server->userlist; while (scan) { //Send the message s2c_failover_can(server,scan,user->serverid,user->sock->host); scan=scan->next; if (scan==server->userlist) scan=0; } pthread_mutex_unlock(&server->connection_mutex); //Now add this one to the list of possible failovers server->failoverhosts=failover_link_by_id(server->failoverhosts, user->serverid, user->sock->host); return 1; } return 0; } //This is the function that processes each user connected. It looks at //their inbound and outbound sockets, and disconnects dead users. static int process_userlist(internal_server_data *server) { grapple_connection *scan,*subscan,*target; int count=0; /*Count will be incrimented each time something is done. At the end of the cycle, if count is still 0, the thread will sleep for a short time, to avoid massive overhead when not being used*/ //Lock the userlist so the parent cant change anything pthread_mutex_lock(&server->connection_mutex); scan=server->userlist; while (scan) { //Process the users sockets based on what protocol they are using switch (server->protocol) { case GRAPPLE_PROTOCOL_TCP: count+=process_user_tcp(server,scan); break; case GRAPPLE_PROTOCOL_UDP: count+=process_user_udp(server,scan); break; } //Process the failover sockets if (scan->failoversock) { count+=process_failoversock(server,scan); } scan=scan->next; if (scan==server->userlist) scan=NULL; } pthread_mutex_unlock(&server->connection_mutex); //Unlock and lock to let another thread in for a moment, if we are blocking pthread_mutex_lock(&server->connection_mutex); scan=server->userlist; //Now loop through all the users while (scan) { target=scan; scan=scan->next; //If their socket is dead, tag for deletion if (socket_dead(target->sock)) target->delete=1; //If they are deleted, and have nothing left to send to the server if (target->delete && !target->message_out_queue) { count++; //If they are dead if (socket_dead(target->sock) || !socket_outdata_length(target->sock)) { //Now unlink them server->userlist=connection_unlink(server->userlist,target); server->socklist=socket_unlink(server->socklist,target->sock); if (target->handshook) { target->handshook=0; //Decriment the usercount server->usercount--; //Now inform other users subscan=server->userlist; while (subscan) { //Let each user know this user has disconnected s2c_inform_disconnect(server,subscan,target); subscan=subscan->next; if (subscan==server->userlist) subscan=0; } //Let the server player know the user has disconnected s2SUQ_user_disconnect(server,target); //If we are running failover, remove this one from the //failover circuit if (server->failover) server->failoverhosts= failover_unlink_by_id(server->failoverhosts, target->serverid); } //Dispose of this user connection_struct_dispose(target); } } if (!server->userlist || scan==server->userlist) scan=NULL; } pthread_mutex_unlock(&server->connection_mutex); return count; } //This function sends the outbound data queues to the socket static int process_message_out_queue_tcp(grapple_connection *user) { grapple_queue *data; int count=0; //Write ALL the data at once while (user->message_out_queue) { pthread_mutex_lock(&user->message_out_mutex); data=user->message_out_queue; if (!data) { pthread_mutex_unlock(&user->message_out_mutex); return count; } user->message_out_queue=queue_unlink(user->message_out_queue,data); pthread_mutex_unlock(&user->message_out_mutex); //We now have the message data to send socket_write(user->sock, data->data,data->length); free(data->data); free(data); //Count the send count++; } return count; } //Process the users outbound UDP data static int process_message_out_queue_udp(grapple_connection *user) { grapple_queue *data; int count=0; //Continue while there is data to send while (user->message_out_queue) { pthread_mutex_lock(&user->message_out_mutex); data=user->message_out_queue; if (!data) { pthread_mutex_unlock(&user->message_out_mutex); return count; } user->message_out_queue=queue_unlink(user->message_out_queue,data); pthread_mutex_unlock(&user->message_out_mutex); //We now have the message data to send. It may be reliable or unreliable if (data->reliablemode) socket_write_reliable(user->sock, data->data,data->length); else socket_write(user->sock, data->data,data->length); free(data->data); free(data); count++; } return count; } //This function processess all users via the TCP protocol static int process_message_out_queues_tcp(internal_server_data *server) { grapple_connection *scan; int count=0; //Loop for all users scan=server->userlist; while (scan) { //Process this user count+=process_message_out_queue_tcp(scan); scan=scan->next; if (scan==server->userlist) scan=0; } return count; } //This function processess all users via the UDP protocol static int process_message_out_queues_udp(internal_server_data *server) { grapple_connection *scan; int count=0; scan=server->userlist; //All users while (scan) { //Process this user count+=process_message_out_queue_udp(scan); scan=scan->next; if (scan==server->userlist) scan=0; } return count; } //If autoping is running, they we ping each user every few seconds static void run_autoping(internal_server_data *server) { grapple_connection *scan; struct timeval time_now; //Only do this if we are autopinging if (!server->autoping) return; //Find when the last time the user may have pinged, that it has been long //enough that it needs to ping again gettimeofday(&time_now,NULL); time_now.tv_usec-=(server->autoping*1000000); while (time_now.tv_usec<0) { time_now.tv_usec+=1000000; time_now.tv_sec--; } pthread_mutex_lock(&server->connection_mutex); scan=server->userlist; //Loop through every user while (scan) { if (scan->pingstart.tv_sec < scan->pingend.tv_sec || (scan->pingstart.tv_sec == scan->pingend.tv_sec && scan->pingstart.tv_usec <= scan->pingend.tv_usec)) { //We arent currently pinging this one if (scan->pingend.tv_sec < time_now.tv_sec || (scan->pingend.tv_sec == time_now.tv_sec && scan->pingend.tv_usec < time_now.tv_usec)) { //We have passed the autoping repeat time, so now ping s2c_ping(server,scan,++scan->pingnumber); gettimeofday(&scan->pingstart,NULL); } } scan=scan->next; if (scan==server->userlist) scan=NULL; } return; } //Run the server thread for one TCP/IP cycle static void grapple_server_thread_tcp(internal_server_data *server) { int count,sockcount,serverid; socketbuf *newsock; //Run continual pinging run_autoping(server); //Process the outbound messages count=process_message_out_queues_tcp(server); //This function tells the low level socket layer to actually do read and //write operations on the sockets sockcount=socket_process_sockets(server->socklist,server->timeout); //If anything happened on the sockets if (sockcount) { //Check if there are new connections newsock=socket_new(server->sock); if (newsock) { //There was, add this to the user list serverid=connection_server_add(server,newsock); //Link the socket into the process list server->socklist=socket_link(server->socklist,newsock); count++; } //There was some data in the sockets, go through the userlist and process //the data count+=process_userlist(server); } count+=sockcount; //If after all the processing, we have nothing to do, we set the next loop //to have a longer timeout on the socket processing, meaning that //if something DOES come in and interrupt, then we can return immediately, //otherwise we will queue for up to 1/20th of a second doing nothing if (!count) server->timeout=100000; else server->timeout=0; } //The UDP version of the server thread. This is pretty much the same as the //TCP one, it just sends to different handler functions static void grapple_server_thread_udp(internal_server_data *server) { int count,sockcount,serverid; socketbuf *newsock; //Run continual pinging run_autoping(server); //Process the outbound messages count=process_message_out_queues_udp(server); //This function tells the low level socket layer to actually do read and //write operations on the sockets sockcount=socket_process_sockets(server->socklist,server->timeout); //If anything happened on the sockets if (sockcount) { //Check if there are new connections newsock=socket_new(server->sock); if (newsock) { //There was, add this to the user list serverid=connection_server_add(server,newsock); //Link the socket into the process list server->socklist=socket_link(server->socklist,newsock); count++; } //There was some data in the sockets, go through the userlist and process //the data count+=process_userlist(server); } count+=sockcount; //If after all the processing, we have nothing to do, we set the next loop //to have a longer timeout on the socket processing, meaning that //if something DOES come in and interrupt, then we can return immediately, //otherwise we will queue for up to 1/20th of a second doing nothing if (!count) server->timeout=100000; else server->timeout=0; } //This is the function that is called when the server thread starts. It loops //while the thread is alive, and cleans up some when it dies static void *grapple_server_thread_main(void *voiddata) { internal_server_data *data; int finished=0; grapple_connection *user; grapple_callback_dispatcher *tmpdispatcher; grapple_confirm *confirm; grapple_failover_host *failover; internal_grapple_group *group; struct sigaction sa; sa.sa_handler = SIG_IGN; sa.sa_flags = 0; sigaction(SIGPIPE, &sa, 0); //The server we have started data=(internal_server_data *)voiddata; //Immediately, before anything else, create the dispatcher process //The dispatcher is a new thread that has messages passed to it for event //handling. This allows events to be called asynchronously, and not slow //down this handling thread which is pretty important to keep running //smoothly. For more information see grapple_dispatcher.c data->dispatcher=grapple_callback_dispatcher_create(); //Link the main incoming socket into the list of sockets to process. data->socklist=socket_link(data->socklist,data->sock); //Link the wakeup socket into the list of sockets to process. data->socklist=socket_link(data->socklist,data->wakesock); //Continue while we are not finished while (!finished) { //Process the thread data (users etc) via either the TCP or UDP handler switch (data->protocol) { case GRAPPLE_PROTOCOL_TCP: grapple_server_thread_tcp(data); break; case GRAPPLE_PROTOCOL_UDP: grapple_server_thread_udp(data); break; } //Process confirmation messages that are slow to come back process_slow_confirms(data); if (data->threaddestroy) { //We have been told to end the thread finished=1; //Destroy the incoming socket data->socklist=socket_unlink(data->socklist,data->sock); socket_destroy(data->sock); data->sock=NULL; pthread_mutex_lock(&data->internal_mutex); if (data->wakesock) { data->socklist=socket_unlink(data->socklist,data->wakesock); socket_destroy(data->wakesock); data->wakesock=NULL; } pthread_mutex_unlock(&data->internal_mutex); //Destroy the userlist, processing all outstanding data as possible while (data->userlist) { pthread_mutex_lock(&data->connection_mutex); user=data->userlist; if (!user) //The user could have been deleted by another thread since we //ehecked just a moment ago. Make SURE break; data->userlist=connection_unlink(data->userlist,data->userlist); pthread_mutex_unlock(&data->connection_mutex); //Send the disconnect message for this user s2c_disconnect(data,user); //Now try and ensure all data is sent to the user pthread_mutex_lock(&user->message_out_mutex); while (user->message_out_queue && !socket_dead(user->sock)) { //Process outgoing messages switch (user->protocol) { case GRAPPLE_PROTOCOL_TCP: process_message_out_queue_tcp(user); break; case GRAPPLE_PROTOCOL_UDP: process_message_out_queue_udp(user); break; } //Try and push the data down the socket. We do this here //as well as a little below so that we can try and give the //kernel as much time as possible to send the data if (socket_outdata_length(user->sock)>0 && !socket_dead(user->sock)) { socket_process(user->sock,0); } } pthread_mutex_unlock(&user->message_out_mutex); //While the socket is still alive, try and shove the remaining //data down the socket while (socket_outdata_length(user->sock)>0 && !socket_dead(user->sock)) { socket_process(user->sock,0); } //Get rid of the socket now data->socklist=socket_unlink(data->socklist,user->sock); connection_struct_dispose(user); } //Remove all callbacks pthread_mutex_lock(&data->callback_mutex); while (data->callbackanchor) { data->callbackanchor=grapple_callback_remove(data->callbackanchor, data->callbackanchor->type); } pthread_mutex_unlock(&data->callback_mutex); //Kill the callback dispatcher thread tmpdispatcher=data->dispatcher; data->dispatcher=NULL; tmpdispatcher->finished=1; //Unlink all of the confirm requests waiting, they dont matter now pthread_mutex_lock(&data->confirm_mutex); while (data->confirm) { confirm=data->confirm; data->confirm=grapple_confirm_unlink(data->confirm, data->confirm); grapple_confirm_dispose(confirm); } pthread_mutex_unlock(&data->confirm_mutex); //Remove the failover hosts pthread_mutex_lock(&data->failover_mutex); while (data->failoverhosts) { failover=data->failoverhosts; data->failoverhosts=failover_unlink(data->failoverhosts, data->failoverhosts); failover_dispose(failover); } pthread_mutex_unlock(&data->failover_mutex); //Remove all the message groups pthread_mutex_lock(&data->group_mutex); while (data->groups) { group=data->groups; data->groups=group_unlink(data->groups, data->groups); group_dispose(group); } pthread_mutex_unlock(&data->group_mutex); } } //We're done, the thread ends when this function ends data->thread=0; data->threaddestroy=0; return NULL; } //Function called by the grapple_server_start function to actually start the //thread int grapple_server_thread_start(internal_server_data *data) { int createval; data->threaddestroy=0; createval=-1; //Create the thread while(createval!=0) { createval=pthread_create(&data->thread,NULL, grapple_server_thread_main,(void *)data); if (createval!=0) { if (errno!=EAGAIN) { //Problem creating the thread that isnt a case of 'it will work //later, dont create it return -1; } } } pthread_detach(data->thread); return 1; } pong2-0.1.3/src/grapple/grapple_client_thread.h0000644000175000001440000000207010473646146016400 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_CLIENT_THREAD_H #define GRAPPLE_CLIENT_THREAD_H #include "grapple_structs.h" extern int grapple_client_thread_start(internal_client_data *); #endif pong2-0.1.3/src/grapple/tools.h0000644000175000001440000000213210473646146013220 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef TOOLS_H #define TOOLS_H #define S_MINUTE 60 #define S_HOUR 3600 #define S_DAY 86400 #define S_WEEK 604800 #define S_MONTH 2419200 #define S_YEAR 31536000 extern void microsleep(int); #endif pong2-0.1.3/src/grapple/grapple_lobbycallback.h0000644000175000001440000000271610473646146016366 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_LOBBYCALLBACK_H #define GRAPPLE_LOBBYCALLBACK_H #include "grapple_lobby_internal.h" #include "grapple_lobby.h" extern grapple_lobbycallback_internal *grapple_lobbycallback_add(grapple_lobbycallback_internal *, grapple_lobbymessagetype, grapple_lobbycallback, void *); extern grapple_lobbycallback_internal *grapple_lobbycallback_remove(grapple_lobbycallback_internal *, grapple_lobbymessagetype); extern int grapple_lobbyclient_callback_process(internal_lobbyclient_data *, grapple_lobbymessage *); #endif pong2-0.1.3/src/grapple/grapple_lobbymessage.c0000644000175000001440000000526510473646146016253 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include "grapple_lobbymessage.h" #include "grapple_lobby_internal.h" //Obtain a new message struct grapple_lobbymessage *grapple_lobbymessage_aquire() { return (grapple_lobbymessage *)calloc(1,sizeof(grapple_lobbymessage)); } //Dispose of a message and all memory associated with it int grapple_lobbymessage_dispose(grapple_lobbymessage *message) { switch (message->type) { case GRAPPLE_LOBBYMSG_CHAT: if (message->CHAT.message) free(message->CHAT.message); break; case GRAPPLE_LOBBYMSG_ROOMCREATE: case GRAPPLE_LOBBYMSG_ROOMDELETE: if (message->ROOM.name) free(message->ROOM.name); break; case GRAPPLE_LOBBYMSG_NEWGAME: if (message->GAME.name) free(message->GAME.name); break; case GRAPPLE_LOBBYMSG_ROOMLEAVE: case GRAPPLE_LOBBYMSG_ROOMENTER: case GRAPPLE_LOBBYMSG_DISCONNECTED: case GRAPPLE_LOBBYMSG_DELETEGAME: case GRAPPLE_LOBBYMSG_GAME_USERS: case GRAPPLE_LOBBYMSG_GAME_MAXUSERS: case GRAPPLE_LOBBYMSG_GAME_CLOSED: //Nothing to free break; } free(message); return 1; } //link a lobbymessage into a list of lobymessages grapple_lobbymessage *grapple_lobbymessage_link(grapple_lobbymessage *list, grapple_lobbymessage *item) { if (!list) { item->next=item; item->prev=item; return item; } item->next=list; item->prev=list->prev; item->next->prev=item; item->prev->next=item; return list; } //Unlink a lobbymessage from a list of lobbymessages grapple_lobbymessage *grapple_lobbymessage_unlink(grapple_lobbymessage *list, grapple_lobbymessage *item) { if (list->next==list) { return NULL; } item->next->prev=item->prev; item->prev->next=item->next; if (item==list) list=item->next; return list; } pong2-0.1.3/src/grapple/grapple_callback_dispatcher.c0000644000175000001440000001441110473646146017532 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #define _XOPEN_SOURCE 500 #include #include #include #include #include "tools.h" #include "grapple_callback_internal.h" #include "grapple_callback_dispatcher.h" /*The callback dispatcher needs a little explaining. Messages going to the program can go either as a message to be pulled off of a queue, or they can be processed via a callback. A callback is a function that runs as soon as the message is obtained. Initially the callback ran in the network thread, but a problem arose where a callback could take too much time and interfere with network processing. So, a separate thread for callback processing was created. This thread takes messages and performs callback functions. If the callback functions are taking too long, this is then a problem for the end user, not grapple, as we are now running them as fast as we can while not interfering with the network. Network should never be affected by long callbacks. An attempt was made to create a new thread for each callback, but that proved unworkable as too many threads were created and the system just couldnt handle it. */ //A callback event is a callback waiting to be handled by the dispatcher. //The callback system creates them and the dispatcher picks them off the //list. This function links an event into a list grapple_callbackevent *grapple_callbackevent_link(grapple_callbackevent *queue, grapple_callbackevent *item) { if (!queue) { item->next=item; item->prev=item; return item; } item->next=queue; item->prev=queue->prev; item->next->prev=item; item->prev->next=item; return queue; } //Remove a callback event from a list grapple_callbackevent *grapple_callbackevent_unlink(grapple_callbackevent *queue, grapple_callbackevent *item) { if (queue->next==queue) { if (queue!=item) return queue; return NULL; } item->prev->next=item->next; item->next->prev=item->prev; if (item==queue) queue=item->next; return queue; } //Actually run a callback. As you can see, the user provided function is //run here, it takes an unknown time to complete static void grapple_event_dispatch(grapple_callbackevent *event) { (*event->callback)(event->message,event->context); return; } //The main function for the dispatcher thread. static void *grapple_callback_dispatcher_main(void *data) { grapple_callback_dispatcher *thread; grapple_callbackevent *target; thread=(grapple_callback_dispatcher *)data; //Loop until told to stop while (!thread->finished) { //We can do this while test safely here, as we are only testing an //atomic value, and we access the data only after checking it again //INSIDE the mutex while (!thread->event_queue && !thread->finished) //Nothing to do, so sleep a little till there is something to do microsleep(1000); while (!thread->finished && thread->event_queue) { target=NULL; //Now we have the possibility of data, do the more expensive //lock and test pthread_mutex_lock(&thread->event_queue_mutex); if (thread->event_queue) { //Remove the event from the queue. We do this so that we can //unlock the queue before running the unknown length user //function. If we ran that in here, we would do so leaving the //thread locked, which would then block the network thread, //making this thread completely pointless target=thread->event_queue; thread->event_queue= grapple_callbackevent_unlink(thread->event_queue, thread->event_queue); } pthread_mutex_unlock(&thread->event_queue_mutex); //The mutex is unlocked now, so we can run the user function without //blocking other threads if (target) { grapple_event_dispatch(target); free(target); } } } //Now the thread has finished, delete the list of messages waiting, we cant //finish them. pthread_mutex_lock(&thread->event_queue_mutex); while (thread->event_queue) { target=thread->event_queue; thread->event_queue= grapple_callbackevent_unlink(thread->event_queue, thread->event_queue); free(target); } pthread_mutex_unlock(&thread->event_queue_mutex); //Now close the mutex pthread_mutex_destroy(&thread->event_queue_mutex); //Finally free the thread memory free(thread); //we're done return NULL; } //This function creates the dispatcher thread grapple_callback_dispatcher *grapple_callback_dispatcher_create() { grapple_callback_dispatcher *returnval; pthread_mutexattr_t attr; int createval; returnval= (grapple_callback_dispatcher *)malloc(sizeof(grapple_callback_dispatcher)); //Create the required thread mutex pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&returnval->event_queue_mutex,&attr); returnval->finished=0; returnval->event_queue=NULL; createval=-1; //Run the thread while(createval!=0) { createval=pthread_create(&returnval->thread,NULL, grapple_callback_dispatcher_main, (void *)returnval); if (createval!=0) { if (errno!=EAGAIN) { //Problem creating the thread that isnt a case of 'it will work //later, dont create it free(returnval); return NULL; } } } pthread_detach(returnval->thread); return returnval; } pong2-0.1.3/src/grapple/grapple_lobbyconnection.h0000644000175000001440000000321610473646146016765 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_LOBBYCONNECTION_H #define GRAPPLE_LOBBYCONNECTION_H #include "grapple_lobby_internal.h" extern grapple_lobbyconnection *grapple_lobbyconnection_create(void); extern grapple_lobbyconnection *grapple_lobbyconnection_link(grapple_lobbyconnection *, grapple_lobbyconnection *); extern grapple_lobbyconnection *grapple_lobbyconnection_unlink(grapple_lobbyconnection *, grapple_lobbyconnection *); extern grapple_lobbyconnection *grapple_lobbyconnection_locate_by_name(grapple_lobbyconnection *, const char *); extern grapple_lobbyconnection *grapple_lobbyconnection_locate_by_id(grapple_lobbyconnection *, grapple_user); extern int grapple_lobbyconnection_dispose(grapple_lobbyconnection *); #endif pong2-0.1.3/src/grapple/socket.h0000644000175000001440000001444510473646146013362 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef SOCKET_H #define SOCKET_H #include #include #include #include #ifndef HOST_NAME_MAX # define HOST_NAME_MAX 255 #endif #ifdef SOCK_SSL #include #endif #include "dynstring.h" #define SOCKET_LISTENER (1<<0) #define SOCKET_CONNECTING (1<<1) #define SOCKET_CONNECTED (1<<2) #define SOCKET_DELAYED_NOW_CONNECTED (1<<4) #define SOCKET_DEAD (1<<5) #define SOCKET_INCOMING (1<<6) #define SOCKET_TCP (0) #define SOCKET_UDP (1) #define SOCKET_UNIX (2) #define SOCKET_INTERRUPT (3) #define SOCKET_MODE_UDP2W_SEQUENTIAL (1<<0) //Internal #define SOCKET_UDP2W_PROTOCOL_CONNECTION 0 #define SOCKET_UDP2W_PROTOCOL_DATA 1 #define SOCKET_UDP2W_PROTOCOL_RDATA 3 #define SOCKET_UDP2W_PROTOCOL_RCONFIRM 5 #define SOCKET_UDP2W_PROTOCOL_PING 7 // typedef struct _socketbuf { int fd; int debug; time_t connect_time; size_t bytes_in; size_t bytes_out; dynstring *indata; dynstring *outdata; int flags; int protocol; char *host; int port; char *path; int mode; struct sockaddr_in udp_sa; int interrupt_fd; //2 way UDP extras int udp2w; int udp2w_infd; int udp2w_port; int udp2w_routpacket; int udp2w_rinpacket; long long udp2w_averound; time_t udp2w_nextping; time_t udp2w_lastmsg; char udp2w_unique[HOST_NAME_MAX+60+1]; struct _socket_udp_rdata *udp2w_rdata_out; struct _socket_udp_rdata *udp2w_rdata_in; #ifdef SOCK_SSL //Encryption stuff int encrypted; SSL *ssl; SSL_CTX *ctx; X509 *server_cert; char *server_key_file; char *server_cert_file; char *client_ca_file; #endif struct _socketbuf *parent; struct _socketbuf *new_children; struct _socketbuf *connected_children; struct _socketbuf *new_child_next; struct _socketbuf *new_child_prev; struct _socketbuf *connected_child_next; struct _socketbuf *connected_child_prev; } socketbuf; typedef struct _socket_processlist { socketbuf *sock; struct _socket_processlist *next; struct _socket_processlist *prev; } socket_processlist; typedef struct _socket_udp_data { struct sockaddr_in sa; char *data; int length; } socket_udp_data; typedef struct _socket_udp_rdata { char *data; int length; int packetnum; int sent; struct timeval sendtime; struct _socket_udp_rdata *next; struct _socket_udp_rdata *prev; } socket_udp_rdata; typedef union { int i; char c[4]; } socket_intchar; extern size_t socket_bytes_out(socketbuf *); extern size_t socket_bytes_in(socketbuf *); extern int socket_connected(socketbuf *); extern socketbuf *socket_create_inet_tcp(const char *,int); extern socketbuf *socket_create_inet_tcp_listener_on_ip(const char *,int); extern socketbuf *socket_create_inet_tcp_listener(int); extern socketbuf *socket_create_inet_udp_listener_on_ip(const char *,int); extern socketbuf *socket_create_inet_udp_listener(int); extern socketbuf *socket_create_inet_udp2way_listener_on_ip(const char *,int); extern socketbuf *socket_create_inet_udp2way_listener(int); extern socketbuf *socket_create_inet_tcp_wait(const char *,int,int); extern socketbuf *socket_create_inet_udp_wait(const char *,int,int); extern socketbuf *socket_create_inet_udp2way_wait(const char *,int,int); extern socketbuf *socket_create_unix(const char *); extern socketbuf *socket_create_unix_wait(const char *,int); extern socketbuf *socket_create_unix_listener(const char *); extern socketbuf *socket_create_interrupt(void); extern int socket_interrupt(socketbuf *); extern int socket_dead(socketbuf *); extern void socket_destroy(socketbuf *); extern int socket_get_port(socketbuf *); extern void socket_indata_drop(socketbuf *,int); extern size_t socket_indata_length(socketbuf *); extern size_t socket_outdata_length(socketbuf *); extern time_t socket_connecttime(socketbuf *); extern char *socket_indata_pull(socketbuf *,int); extern const char *socket_indata_view(socketbuf *); extern socket_udp_data *socket_udp_indata_pull(socketbuf *); extern socket_udp_data *socket_udp_indata_view(socketbuf *); extern int socket_just_connected(socketbuf *); extern socketbuf *socket_new(socketbuf *); extern int socket_process(socketbuf *,long int); extern int socket_process_sockets(socket_processlist *,long int); extern void socket_debug_off(socketbuf *); extern void socket_debug_on(socketbuf *); extern void socket_write(socketbuf *,const char *,size_t); extern void socket_write_reliable(socketbuf *,const char *,size_t); extern int socket_udp_data_free(socket_udp_data *); extern int socket_mode_set(socketbuf *sock,unsigned int mode); extern int socket_mode_unset(socketbuf *sock,unsigned int mode); extern unsigned int socket_mode_get(socketbuf *sock); extern const char *socket_host_get(socketbuf *sock); extern void socket_relocate_data(socketbuf *from,socketbuf *to); #ifdef SOCK_SSL extern void socket_set_encrypted(socketbuf *); extern void socket_set_server_key(socketbuf *,const char *); extern void socket_set_server_cert(socketbuf *,const char *); extern void socket_set_client_ca(socketbuf *,const char *); #endif extern socket_processlist *socket_link(socket_processlist *,socketbuf *); extern socket_processlist *socket_unlink(socket_processlist *,socketbuf *); #endif pong2-0.1.3/src/grapple/grapple_message.c0000644000175000001440000005017110473646146015217 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #define _XOPEN_SOURCE 500 #include #include #include #include "grapple_structs.h" #include "grapple_message.h" #include "grapple_message_internal.h" #include "grapple_defines.h" //Obtain a new message struct static grapple_message *grapple_message_aquire(void) { return (grapple_message *)calloc(1,sizeof(grapple_message)); } //Delete a message struct void grapple_message_dispose(grapple_message *message) { //Delete associated memory based on the type of message switch (message->type) { case GRAPPLE_MSG_USER_NAME: if (message->USER_NAME.name) free(message->USER_NAME.name); break; case GRAPPLE_MSG_SESSION_NAME: if (message->SESSION_NAME.name) free(message->SESSION_NAME.name); break; case GRAPPLE_MSG_USER_MSG: if (message->USER_MSG.data) free(message->USER_MSG.data); break; case GRAPPLE_MSG_GROUP_CREATE: if (message->GROUP.name) free(message->GROUP.name); break; case GRAPPLE_MSG_CONFIRM_TIMEOUT: if (message->CONFIRM.timeouts) free(message->CONFIRM.timeouts); break; case GRAPPLE_MSG_NEW_USER: case GRAPPLE_MSG_NEW_USER_ME: case GRAPPLE_MSG_USER_DISCONNECTED: case GRAPPLE_MSG_SERVER_DISCONNECTED: case GRAPPLE_MSG_CONNECTION_REFUSED: case GRAPPLE_MSG_PING: case GRAPPLE_MSG_GROUP_ADD: case GRAPPLE_MSG_GROUP_REMOVE: case GRAPPLE_MSG_GROUP_DELETE: case GRAPPLE_MSG_YOU_ARE_HOST: case GRAPPLE_MSG_CONFIRM_RECEIVED: //No allocations here break; } //Delete the message itself free(message); return; } /* From here on in, most of the functions are just converting one message type to another. There is little point in commenting the obvious, so each function will just note what is being converted to what GRAPPLE_MESSAGE_* is an internal grapple message GRAPPLE_MSG_* is a message to the outside, and is attached to a grapple_message struct */ //Convert GRAPPLE_MESSAGE_USER_CONNECTED to GRAPPLE_MSG_NEW_USER static grapple_message *server_convert_user_connected_message(grapple_queue *queue) { intchar val; grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_NEW_USER; memcpy(val.c,queue->data,4); message->NEW_USER.id=val.i; return message; } //Converting GRAPPLE_MESSAGE_USER_DISCONNECTED to GRAPPLE_MSG_USER_DISCONNECTED static grapple_message *generic_convert_user_disconnected_message(grapple_queue *queue) { intchar val; grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_USER_DISCONNECTED; memcpy(val.c,queue->data,4); message->USER_DISCONNECTED.id=val.i; return message; } //GRAPPLE_MESSAGE_USER_NAME to GRAPPLE_MSG_USER_NAME static grapple_message *server_convert_user_name_message(grapple_queue *queue) { grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_USER_NAME; message->USER_NAME.id=queue->from; message->USER_NAME.name=(char *)malloc(queue->length+1); memcpy(message->USER_NAME.name,queue->data,queue->length); message->USER_NAME.name[queue->length]=0; return message; } //GRAPPLE_MESSAGE_USER_MESSAGE to GRAPPLE_MSG_USER_MSG static grapple_message *server_convert_user_message_message(grapple_queue *queue) { grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_USER_MSG; message->USER_NAME.id=queue->from; message->USER_MSG.data=(char *)malloc(queue->length); memcpy(message->USER_MSG.data,queue->data,queue->length); message->USER_MSG.length=queue->length; return message; } //GRAPPLE_MESSAGE_PING_REPLY to GRAPPLE_MSG_PING static grapple_message *server_convert_ping_reply_message(grapple_queue *queue) { doublechar val; grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_PING; message->PING.id=queue->from; memcpy(val.c,queue->data,8); message->PING.pingtime=val.d; return message; } //GRAPPLE_MESSAGE_GROUP_CREATE to GRAPPLE_MSG_GROUP_CREATE static grapple_message *generic_convert_group_create_message(grapple_queue *queue) { intchar val; grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_GROUP_CREATE; memcpy(val.c,queue->data,4); message->GROUP.groupid=val.i; message->GROUP.name=(char *)malloc(queue->length); memcpy(message->GROUP.name,queue->data+4,queue->length-4); message->GROUP.name[queue->length-4]=0; return message; } //GRAPPLE_MESSAGE_GROUP_ADD to GRAPPLE_MSG_GROUP_ADD static grapple_message *generic_convert_group_add_message(grapple_queue *queue) { intchar val; grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_GROUP_ADD; memcpy(val.c,queue->data,4); message->GROUP.groupid=val.i; memcpy(val.c,queue->data+4,4); message->GROUP.memberid=val.i; return message; } //GRAPPLE_MESSAGE_GROUP_REMOVE to GRAPPLE_MSG_GROUP_REMOVE static grapple_message *generic_convert_group_remove_message(grapple_queue *queue) { intchar val; grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_GROUP_REMOVE; memcpy(val.c,queue->data,4); message->GROUP.groupid=val.i; memcpy(val.c,queue->data+4,4); message->GROUP.memberid=val.i; return message; } //GRAPPLE_MESSAGE_GROUP_DELETE to GRAPPLE_MSG_GROUP_DELETE static grapple_message *generic_convert_group_delete_message(grapple_queue *queue) { intchar val; grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_GROUP_DELETE; memcpy(val.c,queue->data,4); message->GROUP.groupid=val.i; message->GROUP.name=(char *)malloc(queue->length); memcpy(message->GROUP.name,queue->data+4,queue->length-4); message->GROUP.name[queue->length-4]=0; return message; } //GRAPPLE_MESSAGE_CONFIRM_RECEIVED to GRAPPLE_MSG_CONFIRM_RECEIVED static grapple_message *generic_convert_confirm_received_message(grapple_queue *queue) { intchar val; grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_CONFIRM_RECEIVED; memcpy(val.c,queue->data,4); message->CONFIRM.messageid=val.i; return message; } //GRAPPLE_MESSAGE_CONFIRM_TIMEOUT to GRAPPLE_MSG_CONFIRM_TIMEOUT static grapple_message *generic_convert_confirm_timeout_message(grapple_queue *queue) { intchar val; int loopa; grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_CONFIRM_TIMEOUT; memcpy(val.c,queue->data,4); message->CONFIRM.messageid=val.i; memcpy(val.c,queue->data+4,4); message->CONFIRM.usercount=val.i; message->CONFIRM.timeouts= (int *)malloc(message->CONFIRM.usercount*sizeof(int)); for (loopa=0;loopaCONFIRM.usercount;loopa++) { memcpy(val.c,queue->data+8+(loopa*4),4); message->CONFIRM.timeouts[loopa]=val.i; } return message; } //Convert a message for the server, pass off to a subfunction grapple_message *server_convert_message_for_user(grapple_queue *queue) { switch (queue->messagetype) { case GRAPPLE_MESSAGE_USER_CONNECTED: return server_convert_user_connected_message(queue); break; case GRAPPLE_MESSAGE_USER_NAME: return server_convert_user_name_message(queue); break; case GRAPPLE_MESSAGE_USER_MESSAGE: return server_convert_user_message_message(queue); break; case GRAPPLE_MESSAGE_USER_DISCONNECTED: return generic_convert_user_disconnected_message(queue); break; case GRAPPLE_MESSAGE_PING_REPLY: return server_convert_ping_reply_message(queue); break; case GRAPPLE_MESSAGE_GROUP_CREATE: return generic_convert_group_create_message(queue); break; case GRAPPLE_MESSAGE_GROUP_ADD: return generic_convert_group_add_message(queue); break; case GRAPPLE_MESSAGE_GROUP_REMOVE: return generic_convert_group_remove_message(queue); break; case GRAPPLE_MESSAGE_GROUP_DELETE: return generic_convert_group_delete_message(queue); break; case GRAPPLE_MESSAGE_CONFIRM_RECEIVED: return generic_convert_confirm_received_message(queue); break; case GRAPPLE_MESSAGE_CONFIRM_TIMEOUT: return generic_convert_confirm_timeout_message(queue); break; case GRAPPLE_MESSAGE_GRAPPLE_VERSION: case GRAPPLE_MESSAGE_PRODUCT_NAME: case GRAPPLE_MESSAGE_PRODUCT_VERSION: case GRAPPLE_MESSAGE_USER_YOU_CONNECTED: case GRAPPLE_MESSAGE_SERVER_DISCONNECTED: case GRAPPLE_MESSAGE_HANDSHAKE_FAILED: case GRAPPLE_MESSAGE_SESSION_NAME: case GRAPPLE_MESSAGE_RELAY_TO: case GRAPPLE_MESSAGE_RELAY_ALL: case GRAPPLE_MESSAGE_RELAY_ALL_BUT_SELF: case GRAPPLE_MESSAGE_SERVER_CLOSED: case GRAPPLE_MESSAGE_SERVER_FULL: case GRAPPLE_MESSAGE_PASSWORD: case GRAPPLE_MESSAGE_PASSWORD_FAILED: case GRAPPLE_MESSAGE_PING: case GRAPPLE_MESSAGE_PING_DATA: case GRAPPLE_MESSAGE_FAILOVER_OFF: case GRAPPLE_MESSAGE_FAILOVER_ON: case GRAPPLE_MESSAGE_FAILOVER_CANT: case GRAPPLE_MESSAGE_FAILOVER_TRYME: case GRAPPLE_MESSAGE_FAILOVER_CAN: case GRAPPLE_MESSAGE_NEXT_GROUPID: case GRAPPLE_MESSAGE_REQUEST_NEXT_GROUPID: case GRAPPLE_MESSAGE_YOU_ARE_HOST: case GRAPPLE_MESSAGE_RECONNECTION: //Never passed on to server break; } return NULL; } //GRAPPLE_MESSAGE_USER_YOU_CONNECTED to GRAPPLE_MSG_NEW_USER_ME //and //GRAPPLE_MESSAGE_USER_CONNECTED to GRAPPLE_MSG_NEW_USER static grapple_message *client_convert_user_connected_message(grapple_queue *queue) { intchar val; grapple_message *message=grapple_message_aquire(); if (queue->messagetype==GRAPPLE_MESSAGE_USER_YOU_CONNECTED) { message->type=GRAPPLE_MSG_NEW_USER_ME; message->NEW_USER.me=1; } else message->type=GRAPPLE_MSG_NEW_USER; memcpy(val.c,queue->data,4); message->NEW_USER.id=val.i; return message; } //GRAPPLE_MESSAGE_USER_NAME to GRAPPLE_MSG_USER_NAME static grapple_message *client_convert_user_name_message(grapple_queue *queue) { grapple_message *message=grapple_message_aquire(); intchar val; message->type=GRAPPLE_MSG_USER_NAME; memcpy(val.c,queue->data,4); message->USER_NAME.id=val.i; message->USER_NAME.name=(char *)malloc(queue->length-3); memcpy(message->USER_NAME.name,queue->data+4,queue->length-4); message->USER_NAME.name[queue->length-4]=0; return message; } //GRAPPLE_MESSAGE_SESSION_NAME to GRAPPLE_MSG_SESSION_NAME static grapple_message *client_convert_session_name_message(grapple_queue *queue) { grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_SESSION_NAME; message->SESSION_NAME.name=(char *)malloc(queue->length+1); memcpy(message->SESSION_NAME.name,queue->data,queue->length); message->SESSION_NAME.name[queue->length]=0; return message; } //GRAPPLE_MESSAGE_USER_MESSAGE to GRAPPLE_MSG_USER_MSG static grapple_message *client_convert_user_message_message(grapple_queue *queue) { grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_USER_MSG; message->USER_MSG.id=GRAPPLE_SERVER; message->USER_MSG.data=(char *)malloc(queue->length); memcpy(message->USER_MSG.data,queue->data,queue->length); message->USER_MSG.length=queue->length; return message; } //GRAPPLE_MESSAGE_RELAY_MESSAGE to GRAPPLE_MSG_USER_MSG static grapple_message *client_convert_relay_to_message(grapple_queue *queue) { intchar val; grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_USER_MSG; memcpy(val.c,queue->data,4); message->USER_MSG.id=val.i; message->USER_MSG.data=(char *)malloc(queue->length-4); memcpy(message->USER_MSG.data,queue->data+4,queue->length-4); message->USER_MSG.length=queue->length-4; return message; } //GRAPPLE_MESSAGE_CONNECTION_REFUSED to GRAPPLE_MSG_CONNECTION_REFUSED static grapple_message *client_convert_handshake_failed_message(grapple_queue *queue) { grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_CONNECTION_REFUSED; message->CONNECTION_REFUSED.reason=GRAPPLE_NOCONN_VERSION_MISMATCH; return message; } //GRAPPLE_MESSAGE_PASSWORD_FAILED to GRAPPLE_MSG_CONNECTION_REFUSED static grapple_message *client_convert_password_failed_message(grapple_queue *queue) { grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_CONNECTION_REFUSED; message->CONNECTION_REFUSED.reason=GRAPPLE_NOCONN_PASSWORD_MISMATCH; return message; } //GRAPPLE_MESSAGE_SERVER_CLOSED to GRAPPLE_MESSAGE_CONNECTION_REFUSED static grapple_message *client_convert_server_closed_message(grapple_queue *queue) { grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_CONNECTION_REFUSED; message->CONNECTION_REFUSED.reason=GRAPPLE_NOCONN_SERVER_CLOSED; return message; } //GRAPPLE_MESSAGE_SERVER_FULL to GRAPPLE_MESSAGE_CONNECTION_REFUSED static grapple_message *client_convert_server_full_message(grapple_queue *queue) { grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_CONNECTION_REFUSED; message->CONNECTION_REFUSED.reason=GRAPPLE_NOCONN_SERVER_FULL; return message; } //GRAPPLE_MESSAGE_SERVER_DISCONNECTED to GRAPPLE_MSG_SERVER_DISCONNECTED static grapple_message *client_convert_server_disconnected_message(grapple_queue *queue) { grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_SERVER_DISCONNECTED; return message; } //GRAPPLE_MESSAGE_PING_DATA to GRAPPLE_MSG_PING static grapple_message *client_convert_ping_data_message(grapple_queue *queue) { doublechar dval; intchar val; grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_PING; memcpy(val.c,queue->data,4); memcpy(dval.c,queue->data+4,8); message->PING.pingtime=dval.d; message->PING.id=val.i; return message; } //GRAPPLE_MESSAGE_YOU_ARE_HOST to GRAPPLE_MSG_YOU_ARE_HOST static grapple_message *client_convert_you_are_host_message(grapple_queue *queue) { grapple_message *message=grapple_message_aquire(); message->type=GRAPPLE_MSG_YOU_ARE_HOST; return message; } //Convert any message for the client, passing it off to a subfunction grapple_message *client_convert_message_for_user(grapple_queue *queue) { switch (queue->messagetype) { case GRAPPLE_MESSAGE_USER_CONNECTED: case GRAPPLE_MESSAGE_USER_YOU_CONNECTED: return client_convert_user_connected_message(queue); break; case GRAPPLE_MESSAGE_USER_NAME: return client_convert_user_name_message(queue); break; case GRAPPLE_MESSAGE_SESSION_NAME: return client_convert_session_name_message(queue); break; case GRAPPLE_MESSAGE_USER_MESSAGE: return client_convert_user_message_message(queue); break; case GRAPPLE_MESSAGE_USER_DISCONNECTED: return generic_convert_user_disconnected_message(queue); break; case GRAPPLE_MESSAGE_SERVER_DISCONNECTED: return client_convert_server_disconnected_message(queue); break; case GRAPPLE_MESSAGE_HANDSHAKE_FAILED: return client_convert_handshake_failed_message(queue); break; case GRAPPLE_MESSAGE_PASSWORD_FAILED: return client_convert_password_failed_message(queue); break; case GRAPPLE_MESSAGE_SERVER_FULL: return client_convert_server_full_message(queue); break; case GRAPPLE_MESSAGE_SERVER_CLOSED: return client_convert_server_closed_message(queue); break; case GRAPPLE_MESSAGE_RELAY_TO: return client_convert_relay_to_message(queue); break; case GRAPPLE_MESSAGE_PING_DATA: return client_convert_ping_data_message(queue); break; case GRAPPLE_MESSAGE_GROUP_CREATE: return generic_convert_group_create_message(queue); break; case GRAPPLE_MESSAGE_GROUP_ADD: return generic_convert_group_add_message(queue); break; case GRAPPLE_MESSAGE_GROUP_REMOVE: return generic_convert_group_remove_message(queue); break; case GRAPPLE_MESSAGE_GROUP_DELETE: return generic_convert_group_delete_message(queue); break; case GRAPPLE_MESSAGE_YOU_ARE_HOST: return client_convert_you_are_host_message(queue); break; case GRAPPLE_MESSAGE_CONFIRM_RECEIVED: return generic_convert_confirm_received_message(queue); break; case GRAPPLE_MESSAGE_CONFIRM_TIMEOUT: return generic_convert_confirm_timeout_message(queue); break; case GRAPPLE_MESSAGE_GRAPPLE_VERSION: case GRAPPLE_MESSAGE_PRODUCT_NAME: case GRAPPLE_MESSAGE_PRODUCT_VERSION: case GRAPPLE_MESSAGE_RELAY_ALL: case GRAPPLE_MESSAGE_RELAY_ALL_BUT_SELF: case GRAPPLE_MESSAGE_PASSWORD: case GRAPPLE_MESSAGE_PING: case GRAPPLE_MESSAGE_PING_REPLY: case GRAPPLE_MESSAGE_FAILOVER_OFF: case GRAPPLE_MESSAGE_FAILOVER_ON: case GRAPPLE_MESSAGE_FAILOVER_CANT: case GRAPPLE_MESSAGE_FAILOVER_TRYME: case GRAPPLE_MESSAGE_FAILOVER_CAN: case GRAPPLE_MESSAGE_NEXT_GROUPID: case GRAPPLE_MESSAGE_REQUEST_NEXT_GROUPID: case GRAPPLE_MESSAGE_RECONNECTION: //Never passed on to client break; } return NULL; } //Function to show which GRAPPLE_MESSAGES get passed to which //GRAPPLE_MSG value grapple_messagetype grapple_message_convert_to_usermessage_enum(grapple_messagetype_internal int_messagetype) { switch (int_messagetype) { case GRAPPLE_MESSAGE_USER_CONNECTED: return GRAPPLE_MSG_NEW_USER; break; case GRAPPLE_MESSAGE_USER_YOU_CONNECTED: return GRAPPLE_MSG_NEW_USER_ME; break; case GRAPPLE_MESSAGE_USER_NAME: return GRAPPLE_MSG_USER_NAME; break; case GRAPPLE_MESSAGE_SESSION_NAME: return GRAPPLE_MSG_SESSION_NAME; break; case GRAPPLE_MESSAGE_USER_MESSAGE: return GRAPPLE_MSG_USER_MSG; break; case GRAPPLE_MESSAGE_USER_DISCONNECTED: return GRAPPLE_MSG_USER_DISCONNECTED; break; case GRAPPLE_MESSAGE_SERVER_DISCONNECTED: return GRAPPLE_MSG_SERVER_DISCONNECTED; break; case GRAPPLE_MESSAGE_HANDSHAKE_FAILED: case GRAPPLE_MESSAGE_SERVER_CLOSED: case GRAPPLE_MESSAGE_SERVER_FULL: return GRAPPLE_MSG_CONNECTION_REFUSED; break; case GRAPPLE_MESSAGE_RELAY_TO: return GRAPPLE_MSG_USER_MSG; break; case GRAPPLE_MESSAGE_PING_REPLY: return GRAPPLE_MSG_PING; break; case GRAPPLE_MESSAGE_GROUP_CREATE: return GRAPPLE_MSG_GROUP_CREATE; break; case GRAPPLE_MESSAGE_GROUP_ADD: return GRAPPLE_MSG_GROUP_ADD; break; case GRAPPLE_MESSAGE_GROUP_REMOVE: return GRAPPLE_MSG_GROUP_REMOVE; break; case GRAPPLE_MESSAGE_GROUP_DELETE: return GRAPPLE_MSG_GROUP_DELETE; break; case GRAPPLE_MESSAGE_YOU_ARE_HOST: return GRAPPLE_MSG_YOU_ARE_HOST; break; case GRAPPLE_MESSAGE_CONFIRM_RECEIVED: return GRAPPLE_MSG_CONFIRM_RECEIVED; break; case GRAPPLE_MESSAGE_CONFIRM_TIMEOUT: return GRAPPLE_MSG_CONFIRM_TIMEOUT; break; case GRAPPLE_MESSAGE_GRAPPLE_VERSION: case GRAPPLE_MESSAGE_PRODUCT_NAME: case GRAPPLE_MESSAGE_PRODUCT_VERSION: case GRAPPLE_MESSAGE_RELAY_ALL: case GRAPPLE_MESSAGE_RELAY_ALL_BUT_SELF: case GRAPPLE_MESSAGE_PASSWORD: case GRAPPLE_MESSAGE_PASSWORD_FAILED: case GRAPPLE_MESSAGE_PING: case GRAPPLE_MESSAGE_PING_DATA: case GRAPPLE_MESSAGE_FAILOVER_OFF: case GRAPPLE_MESSAGE_FAILOVER_ON: case GRAPPLE_MESSAGE_FAILOVER_CANT: case GRAPPLE_MESSAGE_FAILOVER_TRYME: case GRAPPLE_MESSAGE_FAILOVER_CAN: case GRAPPLE_MESSAGE_NEXT_GROUPID: case GRAPPLE_MESSAGE_REQUEST_NEXT_GROUPID: case GRAPPLE_MESSAGE_RECONNECTION: return 0; break; } return 0; } pong2-0.1.3/src/grapple/grapple_callback.c0000644000175000001440000001644010473646146015330 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include #include "grapple_callback.h" #include "grapple_callback_internal.h" #include "grapple_structs.h" #include "grapple_message_internal.h" /*Callbacks are ways to process replies from the network asynchronously. A pull method involves users pulling the message from a queue and seeing what it says. A push method, like this, means that as soon as a message arrives it is handled immediately by a handler function. Each side has benefits and problems. Pulling messages means that you get the messages only when you expect them, you know the state of your application, and can predict how the message will be processed. On the other hand a message may wait for a short time in the queue before you get round to looking at it, so this is slower Pushing means that the message is handled immediately, no delay. The problem is that you have no idea what your program will be doing when the message comes in. You need to handle push messages very very carefully to ensure you do not have problems. */ //Find the callback for a specific type of message grapple_callback_list *grapple_callback_get(grapple_callback_list *list, grapple_messagetype type) { grapple_callback_list *scan; scan=list; while (scan) { if (scan->type==type) //Found it return scan; scan=scan->next; if (scan==list) scan=NULL; } //No callback for this message return NULL; } //Add a new callback to the list. grapple_callback_list *grapple_callback_add(grapple_callback_list *list, grapple_messagetype type, grapple_callback callback, void *context) { grapple_callback_list *target; //If we already have this callback, replace the values with new ones. target=grapple_callback_get(list,type); if (target) { target->callback=callback; target->context=context; return list; } //A new callback target=(grapple_callback_list *)malloc(sizeof(grapple_callback_list)); //Link it into the list if (list) { target->next=list; target->prev=list->prev; target->next->prev=target; target->prev->next=target; } else { list=target; target->next=target; target->prev=target; } target->callback=callback; target->context=context; target->type=type; return list; } //Remove a callback grapple_callback_list *grapple_callback_remove(grapple_callback_list *list, grapple_messagetype type) { grapple_callback_list *target; //Find the callback target=grapple_callback_get(list,type); if (!target) { //We dont have one anyway return list; } //Remove it from the list if (target->next==target) list=NULL; else if (list==target) list=list->next; target->next->prev=target->prev; target->prev->next=target->next; //Free the memory free(target); return list; } //Now we have a callback on the server //Make up a message and then call the dispatcher with the message int grapple_server_callback_generate(internal_server_data *server, grapple_queue *item) { grapple_callback_list *target; grapple_messagetype type; grapple_message *message; grapple_callbackevent *event; //We have no callbacks - shortcut abort if (!server->callbackanchor) { return 0; } //Find out what type of user message this is type=grapple_message_convert_to_usermessage_enum(item->messagetype); if (!type) { //This kind of message cant have a callback, abort return 0; } pthread_mutex_lock(&server->callback_mutex); target=grapple_callback_get(server->callbackanchor,type); if (!target) { pthread_mutex_unlock(&server->callback_mutex); //No callback for this message return 0; } //We have a callback, create a callback event for the dispatcher event=(grapple_callbackevent *)malloc(sizeof(grapple_callbackevent)); event->callback=target->callback; event->context=target->context; pthread_mutex_unlock(&server->callback_mutex); message=server_convert_message_for_user(item); event->message=message; //Only add messages to the dispatcher if it isnt finishing (obviously) if (server->dispatcher && !server->dispatcher->finished) { pthread_mutex_lock(&server->dispatcher->event_queue_mutex); //Link the message into the dispatchers queue server->dispatcher->event_queue= grapple_callbackevent_link(server->dispatcher->event_queue,event); pthread_mutex_unlock(&server->dispatcher->event_queue_mutex); return 1; } //We couldnt link the message to the dispatcher, so we fail the return free(event); return 0; } //Now we have a callback on the client //Make up a message and then call the dispatcher with the message int grapple_client_callback_generate(internal_client_data *client, grapple_queue *item) { grapple_callback_list *target; grapple_messagetype type; grapple_message *message; grapple_callbackevent *event; //We have no callbacks - shortcut abort if (!client->callbackanchor) return 0; //Find out what type of user message this is type=grapple_message_convert_to_usermessage_enum(item->messagetype); if (!type) { //This kind of message cant have a callback, abort return 0; } pthread_mutex_lock(&client->callback_mutex); target=grapple_callback_get(client->callbackanchor,type); if (!target) { pthread_mutex_unlock(&client->callback_mutex); //No callback for this message return 0; } //We have a callback, create a callback event for the dispatcher event=(grapple_callbackevent *)malloc(sizeof(grapple_callbackevent)); event->callback=target->callback; event->context=target->context; pthread_mutex_unlock(&client->callback_mutex); message=client_convert_message_for_user(item); event->message=message; //Only add messages to the dispatcher if it isnt finishing (obviously) if (client->dispatcher && !client->dispatcher->finished) { pthread_mutex_lock(&client->dispatcher->event_queue_mutex); //Link the message into the dispatchers queue client->dispatcher->event_queue= grapple_callbackevent_link(client->dispatcher->event_queue,event); pthread_mutex_unlock(&client->dispatcher->event_queue_mutex); return 1; } //We couldnt link the message to the dispatcher, so we fail the return free(event); return 0; } pong2-0.1.3/src/grapple/grapple_lobbygame.c0000644000175000001440000000521310473646146015531 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include "grapple_lobby_internal.h" #include "grapple_lobbygame.h" //Create a basic internal game structure grapple_lobbygame_internal *grapple_lobbygame_internal_create() { grapple_lobbygame_internal *returnval; returnval= (grapple_lobbygame_internal *)calloc(1,sizeof(grapple_lobbygame_internal)); return returnval; } //Delete a lobbygame_internal and all associated memory int grapple_lobbygame_internal_dispose(grapple_lobbygame_internal *target) { if (target->session) free(target->session); if (target->address) free(target->address); free(target); return 0; } //Link a lobbygame_internal into a linked list grapple_lobbygame_internal *grapple_lobbygame_internal_link(grapple_lobbygame_internal *game, grapple_lobbygame_internal *item) { if (!game) { item->next=item; item->prev=item; return item; } item->next=game; item->prev=game->prev; item->next->prev=item; item->prev->next=item; return game; } //Remove a lobbygame_internal from a linked list grapple_lobbygame_internal *grapple_lobbygame_internal_unlink(grapple_lobbygame_internal *game, grapple_lobbygame_internal *item) { if (game->next==game) return NULL; item->next->prev=item->prev; item->prev->next=item->next; if (item==game) game=item->next; return game; } //Locate a game by its ID grapple_lobbygame_internal *grapple_lobbygame_internal_locate_by_id(grapple_lobbygame_internal *list, grapple_user id) { grapple_lobbygame_internal *scan; scan=list; while (scan) { if (scan->id==id) //Match return scan; scan=scan->next; if (scan==list) scan=NULL; } //No match, return NULL return NULL; } pong2-0.1.3/src/grapple/grapple_lobbygame.h0000644000175000001440000000305610473646146015541 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_LOBBYGAME_H #define GRAPPLE_LOBBYGAME_H #include "grapple_lobby_internal.h" extern grapple_lobbygame_internal *grapple_lobbygame_internal_create(void); extern grapple_lobbygame_internal *grapple_lobbygame_internal_link(grapple_lobbygame_internal *, grapple_lobbygame_internal *); extern grapple_lobbygame_internal *grapple_lobbygame_internal_unlink(grapple_lobbygame_internal *, grapple_lobbygame_internal *); extern grapple_lobbygame_internal *grapple_lobbygame_internal_locate_by_id(grapple_lobbygame_internal *, grapple_user); extern int grapple_lobbygame_internal_dispose(grapple_lobbygame_internal *); #endif pong2-0.1.3/src/grapple/grapple_lobbycallback.c0000644000175000001440000000727210473646146016363 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include #include "grapple_lobby_internal.h" #include "grapple_lobbycallback.h" //Find the callback for a specific type of message static grapple_lobbycallback_internal *grapple_lobbycallback_get(grapple_lobbycallback_internal *list, grapple_lobbymessagetype type) { grapple_lobbycallback_internal *scan; scan=list; while (scan) { if (scan->type==type) //Found it return scan; scan=scan->next; if (scan==list) scan=NULL; } //No callback for this message return NULL; } //Add a new callback to the list. grapple_lobbycallback_internal *grapple_lobbycallback_add(grapple_lobbycallback_internal *list, grapple_lobbymessagetype type, grapple_lobbycallback callback, void *context) { grapple_lobbycallback_internal *target; //If we already have this callback, replace the values with new ones. target=grapple_lobbycallback_get(list,type); if (target) { target->callback=callback; target->context=context; return list; } //A new callback target=(grapple_lobbycallback_internal *)malloc(sizeof(grapple_lobbycallback_internal)); //Link it into the list if (list) { target->next=list; target->prev=list->prev; target->next->prev=target; target->prev->next=target; } else { list=target; target->next=target; target->prev=target; } target->callback=callback; target->context=context; target->type=type; return list; } //Process a callback int grapple_lobbyclient_callback_process(internal_lobbyclient_data *client, grapple_lobbymessage *message) { grapple_lobbycallback_internal *target; grapple_lobbycallback callback; void *context; //If we already have this callback, replace the values with new ones. pthread_mutex_lock(&client->callback_mutex); target=grapple_lobbycallback_get(client->callbacks,message->type); if (!target) { pthread_mutex_unlock(&client->callback_mutex); return 0; } callback=target->callback; context=target->context; pthread_mutex_unlock(&client->callback_mutex); (*callback)(message,context); return 1; } //Remove a callback grapple_lobbycallback_internal *grapple_lobbycallback_remove(grapple_lobbycallback_internal *list, grapple_lobbymessagetype type) { grapple_lobbycallback_internal *target; //Find the callback target=grapple_lobbycallback_get(list,type); if (!target) { //We dont have one anyway return list; } //Remove it from the list if (target->next==target) list=NULL; else if (list==target) list=list->next; target->next->prev=target->prev; target->prev->next=target->next; //Free the memory free(target); return list; } pong2-0.1.3/src/grapple/grapple_message.h0000644000175000001440000000520110473646146015216 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_MESSAGE #define GRAPPLE_MESSAGE #include "grapple_types.h" typedef enum { GRAPPLE_MSG_NEW_USER = 1, GRAPPLE_MSG_NEW_USER_ME, GRAPPLE_MSG_USER_NAME, GRAPPLE_MSG_USER_MSG, GRAPPLE_MSG_SESSION_NAME, GRAPPLE_MSG_USER_DISCONNECTED, GRAPPLE_MSG_SERVER_DISCONNECTED, GRAPPLE_MSG_CONNECTION_REFUSED, GRAPPLE_MSG_PING, GRAPPLE_MSG_GROUP_CREATE, GRAPPLE_MSG_GROUP_ADD, GRAPPLE_MSG_GROUP_REMOVE, GRAPPLE_MSG_GROUP_DELETE, GRAPPLE_MSG_YOU_ARE_HOST, GRAPPLE_MSG_CONFIRM_RECEIVED, GRAPPLE_MSG_CONFIRM_TIMEOUT, } grapple_messagetype; typedef enum { GRAPPLE_NOCONN_VERSION_MISMATCH = 1, GRAPPLE_NOCONN_SERVER_FULL, GRAPPLE_NOCONN_SERVER_CLOSED, GRAPPLE_NOCONN_PASSWORD_MISMATCH, } grapple_connection_refused; typedef struct { grapple_messagetype type; union { struct { grapple_user id; char *name; } USER_NAME; struct { char *name; } SESSION_NAME; struct { grapple_user id; int me; } NEW_USER; struct { grapple_user id; void *data; int length; } USER_MSG; struct { grapple_user id; } USER_DISCONNECTED; struct { grapple_connection_refused reason; } CONNECTION_REFUSED; struct { grapple_user id; double pingtime; } PING; struct { grapple_user groupid; char *name; grapple_user memberid; } GROUP; struct { grapple_confirmid messageid; int usercount; grapple_user *timeouts; } CONFIRM; }; } grapple_message; #ifdef __cplusplus extern "C" { #endif extern void grapple_message_dispose(grapple_message *); #ifdef __cplusplus } #endif #endif pong2-0.1.3/src/grapple/grapple_server.c0000644000175000001440000012612310473646146015102 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #define _XOPEN_SOURCE 500 #include #include #include #include #include "grapple_defines.h" #include "grapple_server.h" #include "grapple_server_internal.h" #include "grapple_server_thread.h" #include "grapple_error_internal.h" #include "grapple_queue.h" #include "grapple_message_internal.h" #include "grapple_connection.h" #include "grapple_comms_api.h" #include "grapple_callback.h" #include "grapple_callback_internal.h" #include "grapple_group.h" #include "grapple_internal.h" #include "socket.h" #include "tools.h" #include "prototypes.h" /************************************************************************** ** The functions in this file are generally those that are accessible ** ** to the end user. Obvious exceptions are those that are static which ** ** are just internal utilities. ** ** Care should be taken to not change the parameters of outward facing ** ** functions unless absolutely required ** **************************************************************************/ //This is a static variable which keeps track of the list of all servers //run by this program. The servers are kept in a linked list. This variable //is global to this file only. static internal_server_data *grapple_server_head=NULL; //Link a server to the list static int internal_server_link(internal_server_data *data) { if (!grapple_server_head) { grapple_server_head=data; data->next=data; data->prev=data; return 1; } data->next=grapple_server_head; data->prev=grapple_server_head->prev; data->next->prev=data; data->prev->next=data; grapple_server_head=data; return 1; } //Remove a server from the linked list static int internal_server_unlink(internal_server_data *data) { if (data->next==data) { grapple_server_head=NULL; return 1; } data->next->prev=data->prev; data->prev->next=data->next; if (data==grapple_server_head) grapple_server_head=data->next; data->next=NULL; data->prev=NULL; return 1; } //Find the server from the ID number passed by the user internal_server_data *internal_server_get(grapple_server num) { internal_server_data *scan; //By default if passed 0, then the oldest server is returned if (!num) return grapple_server_head; //This is a cache as most often you will want the same one as last time //Loop through the servers scan=grapple_server_head; while (scan) { if (scan->servernum==num) { return scan; } scan=scan->next; if (scan==grapple_server_head) return NULL; } //No match return NULL; } //Create a new server static internal_server_data *server_create(void) { static int nextval=1; internal_server_data *data; pthread_mutexattr_t attr; //Create the structure data=(internal_server_data *)calloc(1,sizeof(internal_server_data)); //Assign it a default ID data->servernum=nextval++; //Create the mutexes we'll need pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&data->connection_mutex,&attr); pthread_mutex_init(&data->group_mutex,&attr); pthread_mutex_init(&data->failover_mutex,&attr); pthread_mutex_init(&data->message_in_mutex,&attr); pthread_mutex_init(&data->callback_mutex,&attr); pthread_mutex_init(&data->confirm_mutex,&attr); pthread_mutex_init(&data->internal_mutex,&attr); data->user_serverid=65536; //Link it into the array of servers internal_server_link(data); return data; } //User function for initialising the server grapple_server grapple_server_init(const char *name,const char *version) { internal_server_data *data; //Create the internal data data=server_create(); //Assign the user supplied values data->productname=(char *)malloc(strlen(name)+1); strcpy(data->productname,name); data->productversion=(char *)malloc(strlen(version)+1); strcpy(data->productversion,version); //Return the client ID - the end user only gets an integer, called a //'grapple_server' return data->servernum; } //Set the port number to connect to int grapple_server_port_set(grapple_server server,int port) { internal_server_data *data; //Get the server data data=internal_server_get(server); if (!data) { return GRAPPLE_FAILED; } if (data->sock) { grapple_server_error_set(data,GRAPPLE_ERROR_SERVER_CONNECTED); return GRAPPLE_FAILED; } //Set the port data->port=port; return GRAPPLE_OK; } //Retrieve the port number int grapple_server_port_get(grapple_server server) { internal_server_data *data; //Get the server data data=internal_server_get(server); if (!data) { return 0; } //Return the port return data->port; } //Set the IP address to bind to. This is an optional, if not set, then all //local addresses are bound to int grapple_server_ip_set(grapple_server server,const char *ip) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } if (serverdata->sock) { grapple_server_error_set(serverdata,GRAPPLE_ERROR_SERVER_CONNECTED); return GRAPPLE_FAILED; } //Free the old data if set if (serverdata->ip) free (serverdata->ip); //Set the new value serverdata->ip=(char *)malloc(strlen(ip)+1); strcpy(serverdata->ip,ip); return GRAPPLE_OK; } //Get the IP address we have bound to const char *grapple_server_ip_get(grapple_server server) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return NULL; } //Send the IP back - this may or may not be NULL return serverdata->ip; } //Set the protocol this server must use int grapple_server_protocol_set(grapple_server server, grapple_protocol protocol) { internal_server_data *data; //Get the server data=internal_server_get(server); if (!data) { return GRAPPLE_FAILED; } if (data->sock) { grapple_server_error_set(data,GRAPPLE_ERROR_SERVER_CONNECTED); return GRAPPLE_FAILED; } //Set the protocol data->protocol=protocol; return GRAPPLE_OK; } //Get the protocol grapple_protocol grapple_server_protocol_get(grapple_server server) { internal_server_data *data; //Get the server data=internal_server_get(server); if (!data) { return 0; } //Return the protocol return data->protocol; } //Find out if this server is running int grapple_server_running(grapple_server server) { internal_server_data *data; //Get the server data=internal_server_get(server); if (!data) { //No server, not running return 0; } if (data->sock) { if (socket_dead(data->sock)) { return 0; } //Have a live socket, running return 1; } //Otherwise, not running return 0; } //Set the maximum number of users that may connect to the server at any time int grapple_server_maxusers_set(grapple_server server,int maxusers) { internal_server_data *data; //Get the server data=internal_server_get(server); if (!data) { return GRAPPLE_FAILED; } //Set the value data->maxusers=maxusers; return GRAPPLE_OK; } //Get the maximum number of users that may connect to the server at any time int grapple_server_maxusers_get(grapple_server server) { internal_server_data *data; //Get the server data=internal_server_get(server); if (!data) { return 0; } //Get the value return data->maxusers; } int grapple_server_currentusers_get(grapple_server server) { internal_server_data *data; //Get the server data=internal_server_get(server); if (!data) { return 0; } //Get the value return data->usercount; } //Count the number of outstanding messages in the incoming queue int grapple_server_messagecount_get(grapple_server server) { internal_server_data *data; int returnval; //Find the server data data=internal_server_get(server); if (!data) { return GRAPPLE_FAILED; } pthread_mutex_lock(&data->message_in_mutex); //Count the messages returnval=grapple_queue_count(data->message_in_queue); pthread_mutex_unlock(&data->message_in_mutex); //Return the count return returnval; } //return true if there are any messages waiting int grapple_server_messages_waiting(grapple_server server) { internal_server_data *data; data=internal_server_get(server); if (!data) { return GRAPPLE_FAILED; } if (data->message_in_queue) return 1; else return 0; } //Start the server int grapple_server_start(grapple_server server) { internal_server_data *data; data=internal_server_get(server); //Check the servers minimum defaults are set if (!data) { return GRAPPLE_FAILED; } if (data->sock) { grapple_server_error_set(data,GRAPPLE_ERROR_SERVER_CONNECTED); return GRAPPLE_FAILED; } if (!data->port) { grapple_server_error_set(data,GRAPPLE_ERROR_PORT_NOT_SET); return GRAPPLE_FAILED; } if (!data->port) { grapple_server_error_set(data,GRAPPLE_ERROR_PROTOCOL_NOT_SET); return GRAPPLE_FAILED; } if (!data->session) { grapple_server_error_set(data,GRAPPLE_ERROR_SESSION_NOT_SET); return GRAPPLE_FAILED; } switch (data->protocol) { case GRAPPLE_PROTOCOL_TCP: //Create a TCP listener socket data->sock=socket_create_inet_tcp_listener_on_ip(data->ip,data->port); break; case GRAPPLE_PROTOCOL_UDP: //Create a 2 way UDP listener socket data->sock=socket_create_inet_udp2way_listener_on_ip(data->ip, data->port); break; } if (!data->sock) { //The socket couldnt be created grapple_server_error_set(data,GRAPPLE_ERROR_SERVER_CANNOT_BIND_SOCKET); return GRAPPLE_FAILED; } //Set the socket mode to be sequential if required if (data->sequential) socket_mode_set(data->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); else socket_mode_unset(data->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); //Start up the wakeup socket. This is a socket that can break into the //long timeout incoming loop, tell it that there is something to do locally data->wakesock=socket_create_interrupt(); //Start the server thread that will handle all the communication grapple_server_thread_start(data); return GRAPPLE_OK; } //Pull the oldest message grapple_message *grapple_server_message_pull(grapple_server server) { internal_server_data *data; grapple_queue *queuedata; grapple_message *returnval=NULL; //Find the server data data=internal_server_get(server); if (!data) { return NULL; } pthread_mutex_lock(&data->message_in_mutex); if (data->message_in_queue) { //Remove the oldest message queuedata=data->message_in_queue; data->message_in_queue= queue_unlink(data->message_in_queue,data->message_in_queue); pthread_mutex_unlock(&data->message_in_mutex); /*Now we have the message, clone it into a new form useful for the end user*/ returnval=server_convert_message_for_user(queuedata); //Get rid of the queue message queue_struct_dispose(queuedata); } else { pthread_mutex_unlock(&data->message_in_mutex); } //Return the message return returnval; } //This is the function used to send messages by the server to either //the one or more clients, or a group grapple_confirmid grapple_server_send(grapple_server server, grapple_user serverid, int flags,void *data,int datalen) { internal_server_data *serverdata; grapple_connection *target,*scan; grapple_confirmid thismessageid=0; static int staticmessageid=1; /*This gets incrimented for each message that is requiring confirmation*/ int *group_data,loopa,count=0; //Find the data serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } if (flags & GRAPPLE_WAIT) flags |= GRAPPLE_CONFIRM; //This message requests a confirmation if (flags & GRAPPLE_CONFIRM) { //Set it a message ID thismessageid=staticmessageid++; flags|=GRAPPLE_RELIABLE; } switch (serverid) { case GRAPPLE_USER_UNKNOWN: //The target was the unknown user - cant send to this one break; case GRAPPLE_EVERYONE: //Sending a message to ALL players pthread_mutex_lock(&serverdata->connection_mutex); //Loop through all players scan=serverdata->userlist; while (scan) { //Send a message to this one s2c_message(serverdata,scan,flags,thismessageid,data,datalen); //Count the number sent to count++; scan=scan->next; if (scan==serverdata->userlist) scan=0; } pthread_mutex_unlock(&serverdata->connection_mutex); break; default: //Sending to a specific single user or a group pthread_mutex_lock(&serverdata->connection_mutex); //Locate the user target=connection_from_serverid(serverdata->userlist,serverid); if (target) { //Send to the user s2c_message(serverdata,target,flags,thismessageid,data,datalen); //Count it count++; pthread_mutex_unlock(&serverdata->connection_mutex); } else { //Cant find a user with that ID pthread_mutex_unlock(&serverdata->connection_mutex); //Try and send to a group instead, as there is no such user pthread_mutex_lock(&serverdata->group_mutex); if (group_locate(serverdata->groups,serverid)) { //We have a group that matches pthread_mutex_unlock(&serverdata->group_mutex); //Get the mist of all users in the group group_data=server_group_unroll(serverdata,serverid); //Loop through this array of ints loopa=0; while (group_data[loopa]) { pthread_mutex_lock(&serverdata->connection_mutex); //Loop through the users scan=serverdata->userlist; while (scan) { if (scan->serverid==group_data[loopa]) { //The user is a match //Send the message to them s2c_message(serverdata,scan,flags,thismessageid, data,datalen); //Count the send count++; break; } scan=scan->next; if (scan==serverdata->userlist) scan=0; } pthread_mutex_unlock(&serverdata->connection_mutex); loopa++; } free(group_data); } else { //Cant find any match for the user to send to pthread_mutex_unlock(&serverdata->group_mutex); grapple_server_error_set(serverdata, GRAPPLE_ERROR_NO_SUCH_USER); return GRAPPLE_FAILED; } } break; } //If we didnt send to anyone, but they requested a message be sent, we send //a confirm message right back to the server queue if (count == 0 && flags & GRAPPLE_CONFIRM) { s2SUQ_confirm_received(serverdata,thismessageid); } else { if (flags & GRAPPLE_WAIT) { serverdata->sendwait=thismessageid; while (serverdata->sendwait==thismessageid) microsleep(1000); } } //Return the message ID return thismessageid; } //Destroy the server int grapple_server_destroy(grapple_server server) { internal_server_data *serverdata; grapple_queue *target; //Find the server serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Remove it from the list internal_server_unlink(serverdata); //Tell the thread to kill itself if (serverdata->thread) { serverdata->threaddestroy=1; pthread_mutex_lock(&serverdata->internal_mutex); if (serverdata->wakesock) socket_interrupt(serverdata->wakesock); pthread_mutex_unlock(&serverdata->internal_mutex); while (serverdata->threaddestroy==1 && serverdata->thread) microsleep(1000); serverdata->threaddestroy=0; } //Free memory if (serverdata->session) free(serverdata->session); if (serverdata->password) free(serverdata->password); if (serverdata->productname) free(serverdata->productname); if (serverdata->productversion) free(serverdata->productversion); //Delete the message queue while (serverdata->message_in_queue) { target=serverdata->message_in_queue; serverdata->message_in_queue=queue_unlink(serverdata->message_in_queue, serverdata->message_in_queue); queue_struct_dispose(target); } //Delete the mutexes pthread_mutex_destroy(&serverdata->message_in_mutex); pthread_mutex_destroy(&serverdata->connection_mutex); pthread_mutex_destroy(&serverdata->group_mutex); pthread_mutex_destroy(&serverdata->failover_mutex); pthread_mutex_destroy(&serverdata->callback_mutex); pthread_mutex_destroy(&serverdata->confirm_mutex); pthread_mutex_destroy(&serverdata->internal_mutex); //Free the last bit free(serverdata); return GRAPPLE_OK; } //Get an array of ints - the users connected grapple_user *grapple_server_userlist_get(grapple_server server) { internal_server_data *serverdata; //Get the server serverdata=internal_server_get(server); if (!serverdata) { return NULL; } //Return the array. return connection_server_intarray_get(serverdata); } //Set a callback. Callbacks are so that instead of needing to poll for //messages, a callback can be set so that the messages are handled immediately int grapple_server_callback_set(grapple_server server, grapple_messagetype message, grapple_callback callback, void *context) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } pthread_mutex_lock(&serverdata->callback_mutex); //Add the callback to the list of callbacks serverdata->callbackanchor=grapple_callback_add(serverdata->callbackanchor, message,callback,context); pthread_mutex_unlock(&serverdata->callback_mutex); return GRAPPLE_OK; } //Set ALL callbacks to the function requested int grapple_server_callback_setall(grapple_server server, grapple_callback callback, void *context) { //Set one using the function above if (grapple_server_callback_set(server,GRAPPLE_MSG_NEW_USER,callback, context)==GRAPPLE_FAILED) return GRAPPLE_FAILED; //if one is ok, they all should be grapple_server_callback_set(server,GRAPPLE_MSG_NEW_USER_ME,callback,context); grapple_server_callback_set(server,GRAPPLE_MSG_USER_MSG,callback,context); grapple_server_callback_set(server,GRAPPLE_MSG_USER_NAME,callback,context); grapple_server_callback_set(server,GRAPPLE_MSG_USER_MSG,callback,context); grapple_server_callback_set(server,GRAPPLE_MSG_SESSION_NAME,callback, context); grapple_server_callback_set(server,GRAPPLE_MSG_USER_DISCONNECTED,callback, context); grapple_server_callback_set(server,GRAPPLE_MSG_SERVER_DISCONNECTED,callback, context); grapple_server_callback_set(server,GRAPPLE_MSG_CONNECTION_REFUSED,callback, context); grapple_server_callback_set(server,GRAPPLE_MSG_PING,callback,context); grapple_server_callback_set(server,GRAPPLE_MSG_GROUP_CREATE,callback, context); grapple_server_callback_set(server,GRAPPLE_MSG_GROUP_ADD,callback,context); grapple_server_callback_set(server,GRAPPLE_MSG_GROUP_REMOVE,callback, context); grapple_server_callback_set(server,GRAPPLE_MSG_GROUP_DELETE,callback, context); grapple_server_callback_set(server,GRAPPLE_MSG_YOU_ARE_HOST,callback, context); grapple_server_callback_set(server,GRAPPLE_MSG_CONFIRM_RECEIVED,callback, context); grapple_server_callback_set(server,GRAPPLE_MSG_CONFIRM_TIMEOUT,callback, context); return GRAPPLE_OK; } //Remove a callback int grapple_server_callback_unset(grapple_server server, grapple_messagetype message) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } pthread_mutex_lock(&serverdata->callback_mutex); //Remove the callback serverdata->callbackanchor=grapple_callback_remove(serverdata->callbackanchor, message); pthread_mutex_unlock(&serverdata->callback_mutex); return GRAPPLE_OK; } //Get the ID of the default server grapple_server grapple_server_default_get() { internal_server_data *serverdata; serverdata=internal_server_get(0); if (serverdata) //Return its ID if we have it return serverdata->servernum; else //return 0 (the default anyway) if we dont return 0; } //Set the name of the session. This isnt functional it is cosmetic int grapple_server_session_set(grapple_server server,const char *session) { internal_server_data *serverdata; grapple_connection *scan; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } if (serverdata->sock) { grapple_server_error_set(serverdata,GRAPPLE_ERROR_SERVER_CONNECTED); return GRAPPLE_FAILED; } //Remove the old value if (serverdata->session) free (serverdata->session); //Set the new serverdata->session=(char *)malloc(strlen(session)+1); strcpy(serverdata->session,session); //If we have started if (serverdata->sock) { pthread_mutex_lock(&serverdata->connection_mutex); //Loop through all users and tell them the new session name scan=serverdata->userlist; while (scan) { //Tell this user s2c_session_name(serverdata,scan,session); scan=scan->next; if (scan==serverdata->userlist) scan=0; } pthread_mutex_unlock(&serverdata->connection_mutex); } return GRAPPLE_OK; } //Get the name of the session. const char *grapple_server_session_get(grapple_server server) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return NULL; } return serverdata->session; } //Set the password required to connect. int grapple_server_password_set(grapple_server server,const char *password) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Free the memory if it is already set if (serverdata->password) free (serverdata->password); //Set the new serverdata->password=(char *)malloc(strlen(password)+1); strcpy(serverdata->password,password); return GRAPPLE_OK; } //Find out if a password is required int grapple_server_password_required(grapple_server server) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return 0; } ////If there is a password required - 1 if (serverdata->password) return 1; //No password, return 0 return 0; } //Find if the server is closed to new connections int grapple_server_closed_get(grapple_server server) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Return the value return serverdata->closed; } //Set the server closed or open. Closed will completely stop any //users from connecting to the server. The server will reject the handshake void grapple_server_closed_set(grapple_server server,int state) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return; } //Set the internal value serverdata->closed=state; return; } //Force a client to drop, so the server can kick people off int grapple_server_disconnect_client(grapple_server server, grapple_user serverid) { grapple_connection *target; internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } pthread_mutex_lock(&serverdata->connection_mutex); //Find the target target=connection_from_serverid(serverdata->userlist,serverid); if (!target) { pthread_mutex_unlock(&serverdata->connection_mutex); //Cant find that user grapple_server_error_set(serverdata,GRAPPLE_ERROR_NO_SUCH_USER); return GRAPPLE_FAILED; } //Send a delete message to the client s2c_failover_off(serverdata,target); s2c_disconnect(serverdata,target); //Set the target to be deleted next round of the server thread target->delete=1; pthread_mutex_unlock(&serverdata->connection_mutex); return GRAPPLE_OK; } //Stop the server - while keeping its data intact to start again int grapple_server_stop(grapple_server server) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Stop the thread if (serverdata->thread) { serverdata->threaddestroy=1; pthread_mutex_lock(&serverdata->internal_mutex); if (serverdata->wakesock) socket_interrupt(serverdata->wakesock); pthread_mutex_unlock(&serverdata->internal_mutex); //Wait for the thread to stop while (serverdata->threaddestroy==1 && serverdata->thread) microsleep(1000); serverdata->threaddestroy=0; } //All done, the server is now ready to restart if required return GRAPPLE_OK; } //Set the server into autoping mode. This will make the server ping all clients //every frequency seconds. int grapple_server_autoping(grapple_server server,double frequency) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Set the value serverdata->autoping=frequency; return GRAPPLE_OK; } //Manually ping a user int grapple_server_ping(grapple_server server,grapple_user serverid) { internal_server_data *serverdata; grapple_connection *user; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } pthread_mutex_lock(&serverdata->connection_mutex); //Find the user user=connection_from_serverid(serverdata->userlist,serverid); if (!user) { pthread_mutex_unlock(&serverdata->connection_mutex); grapple_server_error_set(serverdata,GRAPPLE_ERROR_NO_SUCH_USER); return GRAPPLE_FAILED; } //Send a ping. A reply will come back from the user in the form of a //queue message s2c_ping(serverdata,user,++user->pingnumber); gettimeofday(&user->pingstart,NULL); pthread_mutex_unlock(&serverdata->connection_mutex); return GRAPPLE_OK; } //Get the last recorded ping time for a specific user double grapple_server_ping_get(grapple_server server,grapple_user serverid) { internal_server_data *serverdata; grapple_connection *user; double returnval; serverdata=internal_server_get(server); if (!serverdata) { return 0; } pthread_mutex_lock(&serverdata->connection_mutex); //Get the user user=connection_from_serverid(serverdata->userlist,serverid); if (!user) { pthread_mutex_unlock(&serverdata->connection_mutex); grapple_server_error_set(serverdata,GRAPPLE_ERROR_NO_SUCH_USER); return 0; } //Find that users pingtime returnval=user->pingtime; pthread_mutex_unlock(&serverdata->connection_mutex); return returnval; } //Set failover mode on. Failover mode being where the server - if it dies - //will be replaced by a new server from one fo the clients and all other //clients will reconnect to the new server int grapple_server_failover_set(grapple_server server,int value) { internal_server_data *serverdata; grapple_connection *scan; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Set failover to be either on or off serverdata->failover=value; if (!serverdata->sock) { //This isnt a failure, we just cant tell anyone to failover yet, cos //nobody is connected return 0; } pthread_mutex_lock(&serverdata->connection_mutex); //Loop through each connected user scan=serverdata->userlist; while (scan) { //Tell each user failover is either on or off if (value) s2c_failover_on(serverdata,scan); else { s2c_failover_off(serverdata,scan); } scan=scan->next; if (scan==serverdata->userlist) scan=0; } pthread_mutex_unlock(&serverdata->connection_mutex); return GRAPPLE_OK; } //Set whether the server is in sequential mode or not int grapple_server_sequential_set(grapple_server server,int value) { internal_server_data *serverdata; grapple_connection *scan; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } if (value) { //Turn sequential on for the server serverdata->sequential=1; if (serverdata->sock) { //Turn it on at the socket level socket_mode_set(serverdata->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); pthread_mutex_lock(&serverdata->connection_mutex); //Loop all users and turn sequential on on the socket at this end scan=serverdata->userlist; while (scan) { scan->sequential=1; if (scan->handshook) //Set the socket socket_mode_set(scan->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); scan=scan->next; if (scan==serverdata->userlist) scan=0; } pthread_mutex_unlock(&serverdata->connection_mutex); } } else { //Turn sequential off for the server serverdata->sequential=0; if (serverdata->sock) { //Turn it off at the socket level socket_mode_unset(serverdata->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); pthread_mutex_lock(&serverdata->connection_mutex); //Loop all users and turn sequential off on the socket at this end scan=serverdata->userlist; while (scan) { scan->sequential=0; if (scan->handshook) //Set the socket socket_mode_unset(scan->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); scan=scan->next; if (scan==serverdata->userlist) scan=0; } pthread_mutex_unlock(&serverdata->connection_mutex); } } return GRAPPLE_OK; } //Find out if we are running sequential or not int grapple_server_sequential_get(grapple_server server) { internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Simply return the internal value return serverdata->sequential; } //Messages can be sent to groups, not just to users. This function //returns the ID of a group from the name grapple_user grapple_server_group_from_name(grapple_server server,const char *name) { internal_server_data *serverdata; int returnval; internal_grapple_group *scan; serverdata=internal_server_get(server); pthread_mutex_lock(&serverdata->group_mutex); //Loop through all groups scan=serverdata->groups; while (scan) { //If the name matches if (!strcmp(scan->name,name)) { //return this groups ID returnval=scan->id; pthread_mutex_unlock(&serverdata->group_mutex); return returnval; } scan=scan->next; if (scan==serverdata->groups) scan=NULL; } pthread_mutex_unlock(&serverdata->group_mutex); //No ID to find return 0; } //create a group. grapple_user grapple_server_group_create(grapple_server server, const char *name) { //create a group. internal_server_data *serverdata; int returnval; grapple_connection *scan; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Find the new ID returnval=serverdata->user_serverid++; //Now create a group locally create_server_group(serverdata,returnval,name); //Now go to each client and tell them there is a new group in town pthread_mutex_lock(&serverdata->connection_mutex); scan=serverdata->userlist; while (scan) { //Tell this user s2c_group_create(serverdata,scan,returnval,name); scan=scan->next; if (scan==serverdata->userlist) scan=0; } pthread_mutex_unlock(&serverdata->connection_mutex); //Return the ID of the group return returnval; } //Adding a user to a group. This will mean that any messages sent to the //group will also be sent to that user int grapple_server_group_add(grapple_server server,grapple_user group, grapple_user add) { internal_server_data *serverdata; grapple_connection *scan; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Now add to the group locally if (server_group_add(serverdata,group,add)) { //Now go to each client and tell them there is a new member in this group pthread_mutex_lock(&serverdata->connection_mutex); scan=serverdata->userlist; while (scan) { //Send the message s2c_group_add(serverdata,scan,group,add); scan=scan->next; if (scan==serverdata->userlist) scan=0; } pthread_mutex_unlock(&serverdata->connection_mutex); return GRAPPLE_OK; } return GRAPPLE_FAILED; } //Remove a user from a group int grapple_server_group_remove(grapple_server server,grapple_user group, grapple_user removeid) { internal_server_data *serverdata; grapple_connection *scan; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Now remove a group member locally if (server_group_remove(serverdata,group,removeid)) { pthread_mutex_lock(&serverdata->connection_mutex); //Tell all connected users scan=serverdata->userlist; while (scan) { //Send the message to this user s2c_group_remove(serverdata,scan,group,removeid); scan=scan->next; if (scan==serverdata->userlist) scan=0; } pthread_mutex_unlock(&serverdata->connection_mutex); return GRAPPLE_OK; } return GRAPPLE_FAILED; } //Delete a group entirely int grapple_server_group_delete(grapple_server server,grapple_user group) { grapple_connection *scan; internal_server_data *serverdata; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Now delete the group locally if (delete_server_group(serverdata,group)) { //Now go to each client and tell them pthread_mutex_lock(&serverdata->connection_mutex); scan=serverdata->userlist; while (scan) { //Tell this user s2c_group_delete(serverdata,scan,group); scan=scan->next; if (scan==serverdata->userlist) scan=0; } pthread_mutex_unlock(&serverdata->connection_mutex); return GRAPPLE_OK; } return GRAPPLE_FAILED; } grapple_user *grapple_server_groupusers_get(grapple_server server, grapple_user groupid) { internal_server_data *serverdata; grapple_user *userarray; //Find the server serverdata=internal_server_get(server); if (!serverdata) { return NULL; } //Get the user array userarray=server_group_unroll(serverdata,groupid); return userarray; } char *grapple_server_client_address_get(grapple_server server, grapple_user target) { internal_server_data *serverdata; grapple_connection *user; char *returnval=0; const char *address; //Find the server serverdata=internal_server_get(server); if (!serverdata) { return NULL; } //Lock the user list pthread_mutex_lock(&serverdata->connection_mutex); //Locate the user user=connection_from_serverid(serverdata->userlist,target); if (user) { address=socket_host_get(user->sock); returnval=(char *)malloc(strlen(address)+1); strcpy(returnval,address); } pthread_mutex_unlock(&serverdata->connection_mutex); return returnval; } //Enumerate the users. Effectively this means run the passed callback //function for each user in the group int grapple_server_enumgroup(grapple_server server, grapple_user groupid, grapple_user_enum_callback callback, void *context) { internal_server_data *serverdata; int *userarray; grapple_user serverid; int loopa; grapple_connection *user; char *tmpname; //Find the server serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Get the user array userarray=server_group_unroll(serverdata,groupid); loopa=0; //Loop for each user while (userarray[loopa]) { pthread_mutex_lock(&serverdata->connection_mutex); //Find the user user=connection_from_serverid(serverdata->userlist,userarray[loopa]); if (user) { //Set the default values to an unnamed user serverid=user->serverid; tmpname=NULL; if(user->name && *user->name) { //If the user has a name, note that tmpname=(char *)malloc(strlen(user->name)+1); strcpy(tmpname,user->name); } //Unlock the mutex, we are now only using copied data pthread_mutex_unlock(&serverdata->connection_mutex); //If the user is valid if (serverid != GRAPPLE_USER_UNKNOWN) { //Run the callback (*callback)(serverid,tmpname,0,context); } if (tmpname) free(tmpname); } else { //Unlock the mutex pthread_mutex_unlock(&serverdata->connection_mutex); } loopa++; } return GRAPPLE_OK; } //Enumerate the list of groups, running a user function for each group int grapple_server_enumgrouplist(grapple_server server, grapple_user_enum_callback callback, void *context) { internal_server_data *serverdata; int *grouplist; grapple_user groupid; int count; char *tmpname; internal_grapple_group *scan; //Find the server serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //The rest of this is pretty inefficient, but it is done this way for a //reason. It is done to minimise the lock time on the group mutex, //as calling a user function with that mutex locked could be disasterous for //performance. //Get the group list into an array count=0; scan=serverdata->groups; pthread_mutex_lock(&serverdata->group_mutex); //Count them first so we can size the array while (scan) { count++; scan=scan->next; if (scan==serverdata->groups) scan=NULL; } if (!count) { pthread_mutex_unlock(&serverdata->group_mutex); return GRAPPLE_OK; } //The array allocation grouplist=(int *)malloc(count * (sizeof(int))); scan=serverdata->groups; count=0; //Insert the groups into it while (scan) { grouplist[count++]=scan->id; scan=scan->next; if (scan==serverdata->groups) scan=NULL; } pthread_mutex_unlock(&serverdata->group_mutex); //We now have the list of groups while (count>0) { //Loop backwards through the groups. We make no guarentee of enumeration //order groupid=grouplist[--count]; pthread_mutex_lock(&serverdata->group_mutex); scan=group_locate(serverdata->groups,groupid); tmpname=NULL; if (scan) { //If the group has a name, note that tmpname=(char *)malloc(strlen(scan->name)+1); strcpy(tmpname,scan->name); } //We're finished with the mutex, unlock it pthread_mutex_unlock(&serverdata->group_mutex); if (groupid) { //Run the callback (*callback)(groupid,tmpname,0,context); } if (tmpname) free(tmpname); } free(grouplist); return GRAPPLE_OK; } //Get an int array list of groups grapple_user *grapple_server_grouplist_get(grapple_server server) { internal_server_data *serverdata; int *grouplist; int count; internal_grapple_group *scan; //Find the server serverdata=internal_server_get(server); if (!serverdata) { return NULL; } //Get the group list into an array count=0; scan=serverdata->groups; pthread_mutex_lock(&serverdata->group_mutex); //Count them first so we can size the array while (scan) { count++; scan=scan->next; if (scan==serverdata->groups) scan=NULL; } if (!count) { pthread_mutex_unlock(&serverdata->group_mutex); return NULL; } //The array allocation grouplist=(int *)malloc((count+1) * (sizeof(int))); scan=serverdata->groups; count=0; //Insert the groups into it while (scan) { grouplist[count++]=scan->id; scan=scan->next; if (scan==serverdata->groups) scan=NULL; } pthread_mutex_unlock(&serverdata->group_mutex); grouplist[count]=0; //We now have the list of groups return grouplist; } //Enumerate the users. Effectively this means run the passed callback //function for each user int grapple_server_enumusers(grapple_server server, grapple_user_enum_callback callback, void *context) { internal_server_data *serverdata; int *userarray; grapple_user serverid; int loopa; grapple_connection *user; char *tmpname; //Find the server serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_FAILED; } //Get the user array userarray=grapple_server_userlist_get(server); loopa=0; //Loop for each user while (userarray[loopa]) { pthread_mutex_lock(&serverdata->connection_mutex); //Find the user user=connection_from_serverid(serverdata->userlist,userarray[loopa]); if (user) { //Set the default values to an unnamed user serverid=user->serverid; tmpname=NULL; if(user->name && *user->name) { //If the user has a name, note that tmpname=(char *)malloc(strlen(user->name)+1); strcpy(tmpname,user->name); } //Unlock the mutex, we are now only using copied data pthread_mutex_unlock(&serverdata->connection_mutex); //If the user is valid if (serverid != GRAPPLE_USER_UNKNOWN) { //Run the callback (*callback)(serverid,tmpname,0,context); } if (tmpname) free(tmpname); } else { //Unlock the mutex pthread_mutex_unlock(&serverdata->connection_mutex); } loopa++; } return GRAPPLE_OK; } char *grapple_server_groupname_get(grapple_server server,grapple_user groupid) { internal_server_data *serverdata; internal_grapple_group *group; char *groupname; //Find the server serverdata=internal_server_get(server); if (!serverdata) { return NULL; } pthread_mutex_lock(&serverdata->group_mutex); group=group_locate(serverdata->groups,groupid); if (!group) return NULL; groupname=(char *)malloc(strlen(group->name)+1); strcpy(groupname,group->name); return groupname; } //Get the last error grapple_error grapple_server_error_get(grapple_server server) { internal_server_data *serverdata; grapple_error returnval; serverdata=internal_server_get(server); if (!serverdata) { return GRAPPLE_ERROR_NOT_INITIALISED; } returnval=serverdata->last_error; //Now wipe the last error serverdata->last_error=GRAPPLE_NO_ERROR; return returnval; } pong2-0.1.3/src/grapple/grapple.h0000644000175000001440000000224310473646146013515 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_H #define GRAPPLE_H #include "grapple_defines.h" #include "grapple_types.h" #include "grapple_callback.h" #include "grapple_client.h" #include "grapple_server.h" #include "grapple_protocols.h" #include "grapple_error.h" #include "grapple_message.h" #endif pong2-0.1.3/src/grapple/grapple_confirm.h0000644000175000001440000000315110473646146015231 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_CONFIRM_H #define GRAPPLE_CONFIRM_H #include "grapple_structs.h" #define GRAPPLE_CONFIRM_TIMEOUT (10) extern int register_confirm(grapple_connection *,int,int); extern int unregister_confirm(internal_server_data*, grapple_connection *,int,int); extern int server_register_confirm(internal_server_data *,int,int); extern int server_unregister_confirm(internal_server_data *,int,int); extern void process_slow_confirms(internal_server_data *); extern grapple_confirm *grapple_confirm_unlink(grapple_confirm *, grapple_confirm *); extern int grapple_confirm_spare_init(void); extern int grapple_confirm_spare_cleanup(void); extern int grapple_confirm_dispose(grapple_confirm *); #endif pong2-0.1.3/src/grapple/grapple_lobby_internal.h0000644000175000001440000000772410473646146016611 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_LOBBY_INTERNAL_H #define GRAPPLE_LOBBY_INTERNAL_H #include #include "grapple_types.h" #include "grapple_lobby.h" #define GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_DISCONNECTED 0 #define GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_PENDING 1 #define GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_REJECTED 2 #define GRAPPLE_LOBBYCLIENT_CONNECTSTATUS_CONNECTED 3 typedef enum { GRAPPLE_LOBBYMESSAGE_DUPLICATENAME = 1, GRAPPLE_LOBBYMESSAGE_CONNECTED = 2, GRAPPLE_LOBBYMESSAGE_CHAT = 3, GRAPPLE_LOBBYMESSAGE_REGISTERGAME = 4, GRAPPLE_LOBBYMESSAGE_YOURGAMEID = 5, GRAPPLE_LOBBYMESSAGE_DELETEGAME = 6, GRAPPLE_LOBBYMESSAGE_GAME_USERCOUNT = 7, GRAPPLE_LOBBYMESSAGE_GAME_MAXUSERCOUNT = 8, GRAPPLE_LOBBYMESSAGE_GAME_CLOSED = 9, } grapple_lobbymessagetype_internal; typedef struct _grapple_lobbygame_internal { grapple_lobbygameid id; char *session; char *address; int port; grapple_protocol protocol; int currentusers; int maxusers; int needpassword; int room; int closed; grapple_user owner; struct _grapple_lobbygame_internal *next; struct _grapple_lobbygame_internal *prev; } grapple_lobbygame_internal; typedef struct _grapple_lobbyconnection { char *name; grapple_user id; int connected; grapple_lobbygameid game; grapple_user currentroom; struct _grapple_lobbyconnection *next; struct _grapple_lobbyconnection *prev; } grapple_lobbyconnection; typedef struct _grapple_lobbycallback_internal { grapple_lobbymessagetype type; void *context; grapple_lobbycallback callback; struct _grapple_lobbycallback_internal *next; struct _grapple_lobbycallback_internal *prev; } grapple_lobbycallback_internal; typedef struct _internal_lobby_data { grapple_server server; grapple_lobby lobbynum; grapple_user mainroom; grapple_error last_error; pthread_mutex_t userlist_mutex; grapple_lobbyconnection *userlist; pthread_mutex_t message_mutex; grapple_lobbymessage *messages; pthread_mutex_t games_mutex; grapple_lobbygame_internal *games; pthread_mutex_t callback_mutex; grapple_lobbycallback_internal *callbacks; struct _internal_lobby_data *next; struct _internal_lobby_data *prev; } internal_lobby_data; typedef struct _internal_lobbyclient_data { grapple_client client; grapple_lobbyclient lobbyclientnum; char *name; int connectstatus; grapple_lobbygameid gameid; int ingame; grapple_error last_error; pthread_t thread; int threaddestroy; grapple_server runninggame; grapple_client joinedgame; grapple_user currentroom; grapple_user firstroom; grapple_user serverid; pthread_mutex_t userlist_mutex; grapple_lobbyconnection *userlist; pthread_mutex_t message_mutex; grapple_lobbymessage *messages; pthread_mutex_t games_mutex; grapple_lobbygame_internal *games; pthread_mutex_t callback_mutex; grapple_lobbycallback_internal *callbacks; struct _internal_lobbyclient_data *next; struct _internal_lobbyclient_data *prev; } internal_lobbyclient_data; typedef union { int i; char c[4]; } intchar; #endif pong2-0.1.3/src/grapple/grapple_server_internal.h0000644000175000001440000000177310473646146017006 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_SERVER_INTERNAL_H #define GRAPPLE_SERVER_INTERNAL_H #include "grapple_structs.h" #endif pong2-0.1.3/src/grapple/grapple_server_thread.h0000644000175000001440000000235710473646146016440 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_SERVER_THREAD_H #define GRAPPLE_SERVER_THREAD_H #include "grapple_server_internal.h" #define HANDSHAKE_FLAG_GRAPPLE_VERSION (1<<0) #define HANDSHAKE_FLAG_PRODUCT_NAME (1<<1) #define HANDSHAKE_FLAG_PRODUCT_VERSION (1<<2) #define HANDSHAKE_FLAG_PASSWORD (1<<3) extern int grapple_server_thread_start(internal_server_data *); #endif pong2-0.1.3/src/grapple/grapple_defines.h0000644000175000001440000000311010473646146015204 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_DEFINES_H #define GRAPPLE_DEFINES_H //Transmit flags for messages #define GRAPPLE_RELIABLE (0x0001) #define GRAPPLE_CONFIRM (0x0002) #define GRAPPLE_WAIT (0x0004) //A define to mean 'the server gets this message' #define GRAPPLE_SERVER (1) //A define to mean 'everyone gets this message' #define GRAPPLE_EVERYONE (2) #define GRAPPLE_EVERYONEELSE (3) //Return values #define GRAPPLE_OK (1) #define GRAPPLE_FAILED (-1) //Open or closed state #define GRAPPLE_SERVER_OPEN (0) #define GRAPPLE_SERVER_CLOSED (1) //Sequential ON or OFF #define GRAPPLE_SEQUENTIAL (1) #define GRAPPLE_NONSEQUENTIAL (1) //The unknown player ID #define GRAPPLE_USER_UNKNOWN (0) #endif pong2-0.1.3/src/grapple/grapple_connection.c0000644000175000001440000002300210473646146015723 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #define _XOPEN_SOURCE 500 #include #include #include "grapple_defines.h" #include "grapple_queue.h" #include "grapple_confirm.h" #include "grapple_connection.h" //Wrapper function for creating a new connection. Coded this way to allow //the later implimentation of queues or stacks or something, if that turns //out to be a timesaver static grapple_connection *connection_struct_aquire(void) { return (grapple_connection *)calloc(1,sizeof(grapple_connection)); } //Dispose of a connection. This wrapper frees all memory associated with a //connection and closes any open sockets void connection_struct_dispose(grapple_connection *connection) { grapple_queue *target; grapple_confirm *conf; if (connection->sock) { //destroy the socket if it is present socket_destroy(connection->sock); } if (connection->failoversock) { //Also the failover socket, if we happened to disconnect in the //middle of a failover test socket_destroy(connection->failoversock); } if (connection->name) { //Free the name free(connection->name); connection->name=NULL; } //Wipe the message queues while (connection->message_in_queue) { target=connection->message_in_queue; connection->message_in_queue=queue_unlink(connection->message_in_queue, connection->message_in_queue); queue_struct_dispose(target); } while (connection->message_out_queue) { target=connection->message_out_queue; connection->message_out_queue=queue_unlink(connection->message_out_queue, connection->message_out_queue); queue_struct_dispose(target); } //Wipe the confirm queue while (connection->confirm) { conf=connection->confirm; connection->confirm=grapple_confirm_unlink(connection->confirm, connection->confirm); grapple_confirm_dispose(conf); } //Destroy the mutexes pthread_mutex_destroy(&connection->confirm_mutex); pthread_mutex_destroy(&connection->message_out_mutex); pthread_mutex_destroy(&connection->message_in_mutex); //Free the data free(connection); return; } //Find a connection somewhere in a list, by its ID number grapple_connection *connection_from_serverid(grapple_connection *list, int serverid) { grapple_connection *scan; scan=list; //Loop through the list while (scan) { if (scan->serverid==serverid) //Found a match return scan; scan=scan->next; if (scan==list) scan=NULL; } //No match return NULL; } //Link a connection into a linked list static grapple_connection *connection_link(grapple_connection *connection, grapple_connection *item) { if (!connection) { item->next=item; item->prev=item; return item; } item->next=connection; item->prev=connection->prev; item->next->prev=item; item->prev->next=item; return connection; } //Remove a connection from a linked list grapple_connection *connection_unlink(grapple_connection *connection, grapple_connection *item) { if (connection->next==connection) { return NULL; } item->next->prev=item->prev; item->prev->next=item->next; if (item==connection) connection=item->next; return connection; } //Add a new connection to the client int connection_client_add(internal_client_data *client,int serverid,int me) { grapple_connection *newitem,*scan; //Check it doesnt already exist scan=client->userlist; while (scan) { if (scan->serverid==serverid) { scan->me=me; return 1; } scan=scan->next; if (scan==client->userlist) scan=NULL; } //Create a new connection struct newitem=connection_struct_aquire(); //Set its values newitem->serverid=serverid; newitem->me=me; //link it into the clients list of users pthread_mutex_lock(&client->connection_mutex); client->userlist=connection_link(client->userlist,newitem); pthread_mutex_unlock(&client->connection_mutex); return 1; } //Remove a connection from the cient by its ID number int connection_client_remove_by_id(internal_client_data *client,int serverid) { grapple_connection *target; //Find the connection target=connection_from_serverid(client->userlist,serverid); if (target) { //Unlink it pthread_mutex_lock(&client->connection_mutex); client->userlist=connection_unlink(client->userlist,target); pthread_mutex_unlock(&client->connection_mutex); //Destroy it connection_struct_dispose(target); } return 1; } //Add a new connection to the server int connection_server_add(internal_server_data *server,socketbuf *sock) { grapple_connection *newitem; pthread_mutexattr_t attr; //Create the struct to hold the data newitem=connection_struct_aquire(); //Link this socket in newitem->sock=sock; //Asign a new server ID newitem->serverid=server->user_serverid++; //Create the required thread mutexes pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&newitem->message_in_mutex,&attr); pthread_mutex_init(&newitem->message_out_mutex,&attr); pthread_mutex_init(&newitem->confirm_mutex,&attr); //Set the protocol newitem->protocol=server->protocol; //Link this into the server pthread_mutex_lock(&server->connection_mutex); server->userlist=connection_link(server->userlist,newitem); pthread_mutex_unlock(&server->connection_mutex); return newitem->serverid; } //Count the number of users connected int connection_server_count(internal_server_data *server) { int count=0; grapple_connection *scan; //Lock the mutex pthread_mutex_lock(&server->connection_mutex); scan=server->userlist; while (scan) { //Count one user count++; scan=scan->next; if (scan==server->userlist) scan=NULL; } //Unlock pthread_mutex_unlock(&server->connection_mutex); //Return the count return count; } //get an array of the users connected, as a list of integers int *connection_server_intarray_get(internal_server_data *server) { int count; int *returnval; grapple_connection *scan; //the list returned will be 0 terminated pthread_mutex_lock(&server->connection_mutex); //First count the number of users count=connection_server_count(server); //Allocate memory for the array returnval=(int *)calloc(1,sizeof(int)*(count+1)); scan=server->userlist; count=0; while (scan) { //Add all known users to the list if (scan->serverid!=GRAPPLE_USER_UNKNOWN) returnval[count++]=scan->serverid; scan=scan->next; if (scan==server->userlist) scan=NULL; } pthread_mutex_unlock(&server->connection_mutex); //Return the list return returnval; } //Rename a users connection int connection_client_rename(internal_client_data *client, int serverid, char *name) { grapple_connection *user; pthread_mutex_lock(&client->connection_mutex); //Find the user user=connection_from_serverid(client->userlist,serverid); if (user) { //Delete the old name if they have one if (user->name) free(user->name); //New name user->name=(char *)malloc(strlen(name)+1); strcpy(user->name,name); //If it is 'me' change this name on the client also if (user->me) { if (client->name) free(client->name); client->name=(char *)malloc(strlen(name)+1); strcpy(client->name,name); } } pthread_mutex_unlock(&client->connection_mutex); return 1; } //Count the users connected to the client int connection_client_count(internal_client_data *client) { int count=0; grapple_connection *scan; pthread_mutex_lock(&client->connection_mutex); scan=client->userlist; while (scan) { //Count this user count++; scan=scan->next; if (scan==client->userlist) scan=NULL; } pthread_mutex_unlock(&client->connection_mutex); return count; } //Return the array of users connected to the server int *connection_client_intarray_get(internal_client_data *client) { int count; int *returnval; grapple_connection *scan; pthread_mutex_lock(&client->connection_mutex); //First count the number of users count=connection_client_count(client); //Allocate thememory for the array returnval=(int *)calloc(1,sizeof(int)*(count+1)); scan=client->userlist; count=0; while (scan) { if (scan->serverid!=GRAPPLE_USER_UNKNOWN) //Add this valid user to the array returnval[count++]=scan->serverid; scan=scan->next; if (scan==client->userlist) scan=NULL; } pthread_mutex_unlock(&client->connection_mutex); //return the array return returnval; } pong2-0.1.3/src/grapple/grapple_callback.h0000644000175000001440000000224110473646146015327 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_CALLBACK_H #define GRAPPLE_CALLBACK_H #include #include "grapple_message.h" typedef int(*grapple_callback)(grapple_message *,void *); typedef bool(*grapple_user_enum_callback)(grapple_user,const char *, unsigned long,void *); #endif pong2-0.1.3/src/grapple/grapple_client.c0000644000175000001440000011053010473646146015045 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #define _XOPEN_SOURCE 500 #include #include #include #include #include "grapple_defines.h" #include "grapple_callback.h" #include "grapple_callback_internal.h" #include "grapple_client.h" #include "grapple_client_internal.h" #include "grapple_client_thread.h" #include "grapple_comms_api.h" #include "grapple_queue.h" #include "grapple_error_internal.h" #include "grapple_message_internal.h" #include "grapple_internal.h" #include "grapple_group.h" #include "grapple_connection.h" #include "prototypes.h" #include "tools.h" /************************************************************************** ** The functions in this file are generally those that are accessible ** ** to the end user. Obvious exceptions are those that are static which ** ** are just internal utilities. ** ** Care should be taken to not change the parameters of outward facing ** ** functions unless absolutely required ** **************************************************************************/ //This is a static variable which keeps track of the list of all clients //run by this program. The clients are kept in a linked list. This variable //is global to this file only. static internal_client_data *grapple_client_head=NULL; //Link a client into the list static int internal_client_link(internal_client_data *data) { if (!grapple_client_head) { grapple_client_head=data; data->next=data; data->prev=data; return 1; } data->next=grapple_client_head; data->prev=grapple_client_head->prev; data->next->prev=data; data->prev->next=data; grapple_client_head=data; return 1; } //Remove a client from the linked list static int internal_client_unlink(internal_client_data *data) { if (data->next==data) { grapple_client_head=NULL; return 1; } data->next->prev=data->prev; data->prev->next=data->next; if (data==grapple_client_head) grapple_client_head=data->next; data->next=NULL; data->prev=NULL; return 1; } //Find the client from the ID number passed by the user static internal_client_data *internal_client_get(grapple_client num) { internal_client_data *scan; //By default if passed 0, then the oldest client is returned if (!num) return grapple_client_head; //This is a cache as most often you will want the same one as last time //Loop through the clients scan=grapple_client_head; while (scan) { if (scan->clientnum==num) { //Match and return it return scan; } scan=scan->next; if (scan==grapple_client_head) return NULL; } //No match return NULL; } //Create a new client static internal_client_data *client_create(void) { static int nextval=256; /*A unique value for the clients ID. This will be changed by the server, but is a good unique start*/ internal_client_data *data; pthread_mutexattr_t attr; //Create the structure data=(internal_client_data *)calloc(1,sizeof(internal_client_data)); //Assign it some default values data->clientnum=nextval++; data->serverid=GRAPPLE_USER_UNKNOWN; //Create the mutexes we'll need pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&data->message_in_mutex,&attr); pthread_mutex_init(&data->message_out_mutex,&attr); pthread_mutex_init(&data->connection_mutex,&attr); pthread_mutex_init(&data->group_mutex,&attr); pthread_mutex_init(&data->failover_mutex,&attr); pthread_mutex_init(&data->callback_mutex,&attr); pthread_mutex_init(&data->internal_mutex,&attr); //Link it into the array of clients internal_client_link(data); return data; } //User function for initialising the client grapple_client grapple_client_init(const char *name,const char *version) { internal_client_data *data; //Create the internal data data=client_create(); //Assign the user supplied values data->productname=(char *)malloc(strlen(name)+1); strcpy(data->productname,name); data->productversion=(char *)malloc(strlen(version)+1); strcpy(data->productversion,version); //Return the client ID - the end user only gets an integer, called a //'grapple_client' return data->clientnum; } //Set the address to connect to int grapple_client_address_set(grapple_client client,const char *address) { internal_client_data *data; //Locate the client data=internal_client_get(client); if (!data) { return GRAPPLE_FAILED; } //Cant set this if we're connected already if (data->sock) { grapple_client_error_set(data,GRAPPLE_ERROR_CLIENT_CONNECTED); return GRAPPLE_FAILED; } //If we set it to NULL, then use localhost if (!address || !*address) { address="127.0.0.1"; } if (data->address) free(data->address); //Set the value into the client data->address=(char *)malloc(strlen(address)+1); strcpy(data->address,address); //OK return GRAPPLE_OK; } //Set the port number to connect to int grapple_client_port_set(grapple_client client,int port) { internal_client_data *data; //Get the client data data=internal_client_get(client); if (!data) { return GRAPPLE_FAILED; } if (data->sock) { grapple_client_error_set(data,GRAPPLE_ERROR_CLIENT_CONNECTED); return GRAPPLE_FAILED; } //Set the port data->port=port; return GRAPPLE_OK; } //Set the protocol this connection must use int grapple_client_protocol_set(grapple_client client, grapple_protocol protocol) { internal_client_data *data; //Get the client data=internal_client_get(client); if (!data) { return GRAPPLE_FAILED; } if (data->sock) { grapple_client_error_set(data,GRAPPLE_ERROR_CLIENT_CONNECTED); return GRAPPLE_FAILED; } //Set the protocol data->protocol=protocol; return GRAPPLE_OK; } //Set the password that the client must use to connect to the server int grapple_client_password_set(grapple_client client,const char *password) { internal_client_data *data; data=internal_client_get(client); if (!data) { return GRAPPLE_FAILED; } if (data->sock) { grapple_client_error_set(data,GRAPPLE_ERROR_CLIENT_CONNECTED); return GRAPPLE_FAILED; } if (data->password) free(data->password); data->password=(char *)malloc(strlen(password)+1); strcpy(data->password,password); return GRAPPLE_OK; } int grapple_client_start(grapple_client client,int flags) { internal_client_data *data; //Find the client data struct data=internal_client_get(client); if (!data) { return GRAPPLE_FAILED; } //Already connected? if (data->sock) { grapple_client_error_set(data,GRAPPLE_ERROR_CLIENT_CONNECTED); return GRAPPLE_FAILED; } //Check all required values are initialised if (!data->address) { grapple_client_error_set(data,GRAPPLE_ERROR_ADDRESS_NOT_SET); return GRAPPLE_FAILED; } if (!data->port) { grapple_client_error_set(data,GRAPPLE_ERROR_PORT_NOT_SET); return GRAPPLE_FAILED; } if (!data->protocol) { grapple_client_error_set(data,GRAPPLE_ERROR_PROTOCOL_NOT_SET); return GRAPPLE_FAILED; } //Start a network connection - either 2 way UDP or TCP switch (data->protocol) { case GRAPPLE_PROTOCOL_TCP: data->sock=socket_create_inet_tcp_wait(data->address,data->port,1); break; case GRAPPLE_PROTOCOL_UDP: data->sock=socket_create_inet_udp2way_wait(data->address,data->port,1); data->connecting=1; break; } //The connection couldnt be created. if (!data->sock) { grapple_client_error_set(data,GRAPPLE_ERROR_CANNOT_CONNECT); return GRAPPLE_FAILED; } //Set this to be sequential for the moment, to ensure the handshake //goes in properly socket_mode_set(data->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); //Start up the wakeup socket. This is a socket that can break into the //long timeout incoming loop, tell it that there is something to do locally data->wakesock=socket_create_interrupt(); //Start the client thread. This thread handles the sockets, processes the //data, and passes data back to the main thread in the form of a message //queue grapple_client_thread_start(data); return GRAPPLE_OK; } //report whether the client is connected to the server int grapple_client_connected(grapple_client client) { internal_client_data *data; data=internal_client_get(client); if (!data) return 0; if (!data->sock) return 0; if (socket_dead(data->sock)) return 0; if (data->serverid) return 1; return 0; } //Set the name int grapple_client_name_set(grapple_client client,const char *name) { internal_client_data *data; data=internal_client_get(client); if (!data) { return GRAPPLE_FAILED; } pthread_mutex_lock(&data->internal_mutex); if (data->name_provisional) free(data->name_provisional); //The value is 'provisional' cos we havent been told by the server we can //use this name yet data->name_provisional=(char *)malloc(strlen(name)+1); strcpy(data->name_provisional,name); pthread_mutex_unlock(&data->internal_mutex); //Tell the server this is the name we want - as long as the server is //connected if (data->sock) c2s_set_name(data,name); return GRAPPLE_OK; } //Get the name of a client char *grapple_client_name_get(grapple_client client,grapple_user serverid) { internal_client_data *data; char *returnval; grapple_connection *user; //Find the client data=internal_client_get(client); if (!data) { return NULL; } //We are getting ourown pre-auth name if (serverid==GRAPPLE_USER_UNKNOWN) { pthread_mutex_lock(&data->internal_mutex); //So check if it has a proivisional name if (!data->name_provisional) { pthread_mutex_unlock(&data->internal_mutex); return NULL; } //Make a copy of the provisional name - as this can be deleted at any //moment returnval=(char *)malloc(strlen(data->name_provisional)+1); strcpy(returnval,data->name_provisional); pthread_mutex_unlock(&data->internal_mutex); return returnval; } pthread_mutex_lock(&data->connection_mutex); //Look for the ID that matches the request user=connection_from_serverid(data->userlist,serverid); if (!user) { //No such ID pthread_mutex_unlock(&data->connection_mutex); return NULL; } //Copy this ID's name if (user->name && *user->name) { returnval=(char *)malloc(strlen(user->name)+1); strcpy(returnval,user->name); } else { returnval=NULL; } pthread_mutex_unlock(&data->connection_mutex); //return it return returnval; } //Count the number of outstanding messages in the users incoming queue int grapple_client_messagecount_get(grapple_client client) { internal_client_data *data; int returnval; //Find the client data data=internal_client_get(client); if (!data) { return GRAPPLE_FAILED; } pthread_mutex_lock(&data->message_in_mutex); //Count the messages returnval=grapple_queue_count(data->message_in_queue); pthread_mutex_unlock(&data->message_in_mutex); //Return the count return returnval; } //return true if there are any messages waiting int grapple_client_messages_waiting(grapple_client client) { internal_client_data *data; data=internal_client_get(client); if (!data) { return GRAPPLE_FAILED; } if (data->message_in_queue) return 1; else return 0; } //Pull the oldest message grapple_message *grapple_client_message_pull(grapple_client client) { internal_client_data *data; grapple_queue *queuedata; grapple_message *returnval=NULL; //Find the client data data=internal_client_get(client); if (!data) { return NULL; } pthread_mutex_lock(&data->message_in_mutex); if (data->message_in_queue) { //Remove the oldest message queuedata=data->message_in_queue; data->message_in_queue= queue_unlink(data->message_in_queue,data->message_in_queue); pthread_mutex_unlock(&data->message_in_mutex); /*Now we have the message, clone it into a new form useful for the end user*/ returnval=client_convert_message_for_user(queuedata); //Get rid of the queue message queue_struct_dispose(queuedata); } else { pthread_mutex_unlock(&data->message_in_mutex); } //Return the message return returnval; } //This is the function used to send messages by the client to either //the server or to other clients grapple_confirmid grapple_client_send(grapple_client client, grapple_user target, int flags,void *data,int datalen) { internal_client_data *clientdata; grapple_confirmid thismessageid=0; static int staticmessageid=1; /*This gets incrimented for each message that is requiring confirmation*/ //Find the data clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } if (flags & GRAPPLE_WAIT) flags |= GRAPPLE_CONFIRM; //This message requests a confirmation if (flags & GRAPPLE_CONFIRM) { //Set it a message ID thismessageid=staticmessageid++; flags|=GRAPPLE_RELIABLE; } switch (target) { case GRAPPLE_USER_UNKNOWN: //The target was the unknown user - cant send to this one break; case GRAPPLE_SERVER: //Sending a message to the server c2s_message(clientdata,flags,thismessageid,data,datalen); break; case GRAPPLE_EVERYONE: //Sending a message to ALL players c2s_relayallmessage(clientdata,flags,thismessageid,data,datalen); break; case GRAPPLE_EVERYONEELSE: //Sending a message to all OTHER players c2s_relayallbutselfmessage(clientdata,flags,thismessageid,data,datalen); break; default: //Sending a message to a specific player c2s_relaymessage(clientdata,target,flags,thismessageid,data,datalen); break; } if (flags & GRAPPLE_WAIT) { clientdata->sendwait=thismessageid; while (clientdata->sendwait==thismessageid) microsleep(1000); } //Return the message ID - will be 0 if no confirmation was requested return thismessageid; } //Destroy the client int grapple_client_destroy(grapple_client client) { internal_client_data *clientdata; grapple_queue *target; //Find the client to kill clientdata=internal_client_get(client); if (!clientdata) { //There is no client to kill return GRAPPLE_FAILED; } //Disconnect the client from the server if (clientdata->thread) c2s_disconnect(clientdata); //Unlink the client from the list of clients internal_client_unlink(clientdata); //Kill the thread if (clientdata->thread) { clientdata->threaddestroy=1; pthread_mutex_lock(&clientdata->internal_mutex); if (clientdata->wakesock) socket_interrupt(clientdata->wakesock); pthread_mutex_unlock(&clientdata->internal_mutex); //Wait for the thread to go. while (clientdata->threaddestroy==1 && clientdata->thread) microsleep(1000); } //Free memory if (clientdata->address) free(clientdata->address); if (clientdata->name_provisional) free(clientdata->name_provisional); if (clientdata->name) free(clientdata->name); if (clientdata->session) free(clientdata->session); if (clientdata->password) free(clientdata->password); if (clientdata->productname) free(clientdata->productname); if (clientdata->productversion) free(clientdata->productversion); //Delete the thread mutexes pthread_mutex_destroy(&clientdata->message_in_mutex); pthread_mutex_destroy(&clientdata->message_out_mutex); pthread_mutex_destroy(&clientdata->connection_mutex); pthread_mutex_destroy(&clientdata->group_mutex); pthread_mutex_destroy(&clientdata->failover_mutex); pthread_mutex_destroy(&clientdata->callback_mutex); pthread_mutex_destroy(&clientdata->internal_mutex); //Remove messages in the queue while (clientdata->message_in_queue) { target=clientdata->message_in_queue; clientdata->message_in_queue=queue_unlink(clientdata->message_in_queue, clientdata->message_in_queue); queue_struct_dispose(target); } //Thats it, done. free(clientdata); return GRAPPLE_OK; } //Get an array of connected users grapple_user *grapple_client_userlist_get(grapple_client client) { internal_client_data *clientdata; //Get this client clientdata=internal_client_get(client); if (!clientdata) { return NULL; } //Return the array return connection_client_intarray_get(clientdata); } //Set a callback. Callbacks are so that instead of needing to poll for //messages, a callback can be set so that the messages are handled immediately int grapple_client_callback_set(grapple_client client, grapple_messagetype message, grapple_callback callback, void *context) { internal_client_data *clientdata; clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } pthread_mutex_lock(&clientdata->callback_mutex); //Add the callback to the list of callbacks clientdata->callbackanchor=grapple_callback_add(clientdata->callbackanchor, message, callback,context); pthread_mutex_unlock(&clientdata->callback_mutex); return GRAPPLE_OK; } //Set ALL callbacks to the function requested int grapple_client_callback_setall(grapple_client client, grapple_callback callback, void *context) { //Set one using the function above if (grapple_client_callback_set(client,GRAPPLE_MSG_NEW_USER,callback, context)==GRAPPLE_FAILED) return GRAPPLE_FAILED; //if one is ok, they all should be grapple_client_callback_set(client,GRAPPLE_MSG_NEW_USER_ME,callback,context); grapple_client_callback_set(client,GRAPPLE_MSG_USER_MSG,callback,context); grapple_client_callback_set(client,GRAPPLE_MSG_USER_NAME,callback,context); grapple_client_callback_set(client,GRAPPLE_MSG_USER_MSG,callback,context); grapple_client_callback_set(client,GRAPPLE_MSG_SESSION_NAME,callback, context); grapple_client_callback_set(client,GRAPPLE_MSG_USER_DISCONNECTED,callback, context); grapple_client_callback_set(client,GRAPPLE_MSG_SERVER_DISCONNECTED,callback, context); grapple_client_callback_set(client,GRAPPLE_MSG_CONNECTION_REFUSED,callback, context); grapple_client_callback_set(client,GRAPPLE_MSG_PING,callback,context); grapple_client_callback_set(client,GRAPPLE_MSG_GROUP_CREATE,callback, context); grapple_client_callback_set(client,GRAPPLE_MSG_GROUP_ADD,callback,context); grapple_client_callback_set(client,GRAPPLE_MSG_GROUP_REMOVE,callback, context); grapple_client_callback_set(client,GRAPPLE_MSG_GROUP_DELETE,callback, context); grapple_client_callback_set(client,GRAPPLE_MSG_YOU_ARE_HOST,callback, context); grapple_client_callback_set(client,GRAPPLE_MSG_CONFIRM_RECEIVED,callback, context); grapple_client_callback_set(client,GRAPPLE_MSG_CONFIRM_TIMEOUT,callback, context); return GRAPPLE_OK; } //Remove a callback int grapple_client_callback_unset(grapple_client client, grapple_messagetype message) { internal_client_data *clientdata; //Get the client clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } pthread_mutex_lock(&clientdata->callback_mutex); //Remove the callback clientdata->callbackanchor=grapple_callback_remove(clientdata->callbackanchor, message); pthread_mutex_unlock(&clientdata->callback_mutex); return GRAPPLE_OK; } //Get the ID of the default client grapple_client grapple_client_default_get() { internal_client_data *clientdata; //Get the default client clientdata=internal_client_get(0); if (clientdata) //Return its ID if we have it return clientdata->clientnum; else //return 0 (the default anyway) if we dont return 0; } //Enumerate the users. Effectively this means run the passed callback //function for each user int grapple_client_enumusers(grapple_client client, grapple_user_enum_callback callback, void *context) { internal_client_data *clientdata; int *userarray; grapple_user serverid; int loopa; grapple_connection *user; char *tmpname; //Find the client clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } //Get the user array userarray=grapple_client_userlist_get(client); loopa=0; //Loop for each user while (userarray[loopa]) { pthread_mutex_lock(&clientdata->connection_mutex); //Find the user user=connection_from_serverid(clientdata->userlist,userarray[loopa]); if (user) { //Set the default values to an unnamed user serverid=user->serverid; tmpname=NULL; if(user->name && *user->name) { //If the user has a name, note that tmpname=(char *)malloc(strlen(user->name)+1); strcpy(tmpname,user->name); } //Unlock the mutex, we are now only using copied data pthread_mutex_unlock(&clientdata->connection_mutex); //If the user is valid if (serverid != GRAPPLE_USER_UNKNOWN) { //Run the callback (*callback)(serverid,tmpname,0,context); } if (tmpname) free(tmpname); } else { //Unlock the mutex pthread_mutex_unlock(&clientdata->connection_mutex); } loopa++; } return GRAPPLE_OK; } //Get the name of the current session char *grapple_client_session_get(grapple_client client) { internal_client_data *clientdata; char *returnval; clientdata=internal_client_get(client); if (!clientdata) { return NULL; } //If no session name has been set, return null if (!clientdata->session) return NULL; //Allocate memory for the session name, and return it returnval=(char *)malloc(strlen(clientdata->session)+1); strcpy(returnval,clientdata->session); return returnval; } //Stop (but dont destroy) the client int grapple_client_stop(grapple_client client) { internal_client_data *clientdata; clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } //Disconnect from the server if (clientdata->thread) { c2s_disconnect(clientdata); clientdata->threaddestroy=1; pthread_mutex_lock(&clientdata->internal_mutex); if (clientdata->wakesock) socket_interrupt(clientdata->wakesock); pthread_mutex_unlock(&clientdata->internal_mutex); //Wait for the thread to be destroyed while (clientdata->threaddestroy==1 && clientdata->thread) microsleep(1000); clientdata->threaddestroy=0; } //Leave the rest of the data intact return GRAPPLE_OK; } //Ping the server, find the round trip time int grapple_client_ping(grapple_client client) { internal_client_data *clientdata; clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } //Send the ping to the server c2s_ping(clientdata,++clientdata->pingnumber); gettimeofday(&clientdata->pingstart,NULL); //In the end a ping reply will come back, this will be passed to the user return GRAPPLE_OK; } //Get the last recorded ping time for a specific user double grapple_client_ping_get(grapple_client client,grapple_user serverid) { internal_client_data *clientdata; double returnval=0; grapple_connection *user; clientdata=internal_client_get(client); if (!clientdata) { return 0; } //If we dont know the user, find ourown ping time if (serverid==GRAPPLE_USER_UNKNOWN) serverid=clientdata->serverid; pthread_mutex_lock(&clientdata->connection_mutex); //Get the user user=connection_from_serverid(clientdata->userlist,serverid); if (user) { //Find that users pingtime returnval=user->pingtime; } pthread_mutex_unlock(&clientdata->connection_mutex); return returnval; } //Get the server ID of the client grapple_user grapple_client_serverid_get(grapple_client client) { internal_client_data *clientdata; clientdata=internal_client_get(client); if (!clientdata) { return 0; } if (!clientdata->sock) { grapple_client_error_set(clientdata,GRAPPLE_ERROR_CLIENT_NOT_CONNECTED); return 0; } //This can only remain USER_UNKNOWN for so long, in the end, it has to change while (clientdata->sock && !socket_dead(clientdata->sock) && clientdata->serverid==GRAPPLE_USER_UNKNOWN) { microsleep(1000); } return clientdata->serverid; } //Set that the client is requiring all data to be received sequentially. For //TCP this doesnt matter. For UDP it forces the client to hold out-of-order //network packets until earlier ones come in. int grapple_client_sequential_set(grapple_client client,int value) { internal_client_data *clientdata; clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } if (value) { //Set sequential on clientdata->sequential=1; //Set it low level to the socket if (clientdata->sock) socket_mode_set(clientdata->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); } else { //Set sequential off clientdata->sequential=0; //And low level on the socket if (clientdata->sock) socket_mode_unset(clientdata->sock,SOCKET_MODE_UDP2W_SEQUENTIAL); } return GRAPPLE_OK; } //Get the current state of sequential or non-sequential int grapple_client_sequential_get(grapple_client client) { internal_client_data *clientdata; clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } return clientdata->sequential; } //Messages can be sent to groups, not just to users. This function //returns the ID of a group from the name int grapple_client_group_from_name(grapple_client client,const char *name) { internal_client_data *clientdata; int returnval; internal_grapple_group *scan; clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } pthread_mutex_lock(&clientdata->group_mutex); //Loop through all groups scan=clientdata->groups; while (scan) { //If the name matches if (scan->name && *scan->name && !strcmp(scan->name,name)) { //return this groups ID returnval=scan->id; pthread_mutex_unlock(&clientdata->group_mutex); return returnval; } scan=scan->next; if (scan==clientdata->groups) scan=NULL; } pthread_mutex_unlock(&clientdata->group_mutex); //No ID to find return 0; } //create a group. The group is always assigned by the server. To speed things //up the server pre-assigns each user a group grapple_user grapple_client_group_create(grapple_client client, const char *name) { internal_client_data *clientdata; int returnval; clientdata=internal_client_get(client); if (!clientdata) { return 0; } if (!clientdata->sock) { grapple_client_error_set(clientdata,GRAPPLE_ERROR_CLIENT_NOT_CONNECTED); return 0; } //If the server hasnt pre-assigned the group, it will shortly. Wait for //it. while (clientdata->sock && clientdata->next_group==0) microsleep(1000); //Note the group ID returnval=clientdata->next_group; //Remove it from the client clientdata->next_group=0; //Request a new group ID from the server c2s_request_group(clientdata); //Tell the server to create a new group based on the ID we have just obtained c2s_group_create(clientdata,returnval,name); //Now create a group locally create_client_group(clientdata,returnval,name); //Return the group ID return returnval; } //Adding a user to a group. This will mean that any messages sent to the //group will also be sent to that user int grapple_client_group_add(grapple_client client,grapple_user group, grapple_user add) { internal_client_data *clientdata; clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } if (!clientdata->sock) { grapple_client_error_set(clientdata,GRAPPLE_ERROR_CLIENT_NOT_CONNECTED); return GRAPPLE_FAILED; } //Add a user to the group if (client_group_add(clientdata,group,add)) { //Tell the server about it, if it was successful c2s_group_add(clientdata,group,add); return GRAPPLE_OK; } return GRAPPLE_FAILED; } //Remove a user from a group int grapple_client_group_remove(grapple_client client,grapple_user group, grapple_user removeid) { internal_client_data *clientdata; clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } if (!clientdata->sock) { grapple_client_error_set(clientdata,GRAPPLE_ERROR_CLIENT_NOT_CONNECTED); return GRAPPLE_FAILED; } //Now remove the user locally if (client_group_remove(clientdata,group,removeid)) { //If successful, remove from the server c2s_group_remove(clientdata,group,removeid); return GRAPPLE_OK; } return GRAPPLE_FAILED; } //Delete a group entirely int grapple_client_group_delete(grapple_client client,grapple_user group) { internal_client_data *clientdata; clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } if (!clientdata->sock) { grapple_client_error_set(clientdata,GRAPPLE_ERROR_CLIENT_NOT_CONNECTED); return GRAPPLE_FAILED; } //Delete the group locally if (delete_client_group(clientdata,group)) { //If successful, tell the server about it c2s_group_delete(clientdata,group); return GRAPPLE_OK; } return GRAPPLE_FAILED; } //Enumerate the users. Effectively this means run the passed callback //function for each user in the group int grapple_client_enumgroup(grapple_client client, grapple_user groupid, grapple_user_enum_callback callback, void *context) { internal_client_data *clientdata; int *userarray; grapple_user serverid; int loopa; grapple_connection *user; char *tmpname; //Find the client clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } //Get the user array userarray=client_group_unroll(clientdata,groupid); loopa=0; //Loop for each user while (userarray[loopa]) { pthread_mutex_lock(&clientdata->connection_mutex); //Find the user user=connection_from_serverid(clientdata->userlist,userarray[loopa]); if (user) { //Set the default values to an unnamed user serverid=user->serverid; tmpname=NULL; if(user->name && *user->name) { //If the user has a name, note that tmpname=(char *)malloc(strlen(user->name)+1); strcpy(tmpname,user->name); } //Unlock the mutex, we are now only using copied data pthread_mutex_unlock(&clientdata->connection_mutex); //If the user is valid if (serverid != GRAPPLE_USER_UNKNOWN) { //Run the callback (*callback)(serverid,tmpname,0,context); } if (tmpname) free(tmpname); } else { //Unlock the mutex pthread_mutex_unlock(&clientdata->connection_mutex); } loopa++; } return GRAPPLE_OK; } grapple_user *grapple_client_groupusers_get(grapple_client client, grapple_user groupid) { internal_client_data *clientdata; grapple_user *userarray; //Find the client clientdata=internal_client_get(client); if (!clientdata) { return NULL; } //Get the user array userarray=client_group_unroll(clientdata,groupid); return userarray; } //Enumerate the list of groups, running a user function for each group int grapple_client_enumgrouplist(grapple_client client, grapple_user_enum_callback callback, void *context) { internal_client_data *clientdata; int *grouplist; grapple_user groupid; int count; char *tmpname; internal_grapple_group *scan; //Find the client clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_FAILED; } //The rest of this is pretty inefficient, but it is done this way for a //reason. It is done to minimise the lock time on the group mutex, //as calling a user function with that mutex locked could be disasterous for //performance. //Get the group list into an array count=0; scan=clientdata->groups; pthread_mutex_lock(&clientdata->group_mutex); //Count them first so we can size the array while (scan) { count++; scan=scan->next; if (scan==clientdata->groups) scan=NULL; } if (!count) { pthread_mutex_unlock(&clientdata->group_mutex); return GRAPPLE_OK; } //The array allocation grouplist=(int *)malloc(count * (sizeof(int))); scan=clientdata->groups; count=0; //Insert the groups into it while (scan) { grouplist[count++]=scan->id; scan=scan->next; if (scan==clientdata->groups) scan=NULL; } pthread_mutex_unlock(&clientdata->group_mutex); //We now have the list of groups while (count>0) { //Loop backwards through the groups. We make no guarentee of enumeration //order groupid=grouplist[--count]; pthread_mutex_lock(&clientdata->group_mutex); scan=group_locate(clientdata->groups,groupid); tmpname=NULL; if (scan) { //If the group has a name, note that if (scan->name && *scan->name) { tmpname=(char *)malloc(strlen(scan->name)+1); strcpy(tmpname,scan->name); } } //We're finished with the mutex, unlock it pthread_mutex_unlock(&clientdata->group_mutex); if (groupid) { //Run the callback (*callback)(groupid,tmpname,0,context); } if (tmpname) free(tmpname); } free(grouplist); return GRAPPLE_OK; } //Get an int array list of groups grapple_user *grapple_client_grouplist_get(grapple_client client) { internal_client_data *clientdata; int *grouplist; int count; internal_grapple_group *scan; //Find the client clientdata=internal_client_get(client); if (!clientdata) { return NULL; } //Get the group list into an array count=0; scan=clientdata->groups; pthread_mutex_lock(&clientdata->group_mutex); //Count them first so we can size the array while (scan) { count++; scan=scan->next; if (scan==clientdata->groups) scan=NULL; } if (!count) { pthread_mutex_unlock(&clientdata->group_mutex); return NULL; } //The array allocation grouplist=(int *)malloc((count+1) * (sizeof(int))); scan=clientdata->groups; count=0; //Insert the groups into it while (scan) { grouplist[count++]=scan->id; scan=scan->next; if (scan==clientdata->groups) scan=NULL; } pthread_mutex_unlock(&clientdata->group_mutex); grouplist[count]=0; //We now have the list of groups return grouplist; } char *grapple_client_groupname_get(grapple_client client,grapple_user groupid) { internal_client_data *clientdata; internal_grapple_group *group; char *groupname; //Find the client clientdata=internal_client_get(client); if (!clientdata) { return NULL; } pthread_mutex_lock(&clientdata->group_mutex); group=group_locate(clientdata->groups,groupid); if (!group) return NULL; groupname=(char *)malloc(strlen(group->name)+1); strcpy(groupname,group->name); return groupname; } //Get the last error grapple_error grapple_client_error_get(grapple_client client) { internal_client_data *clientdata; grapple_error returnval; clientdata=internal_client_get(client); if (!clientdata) { return GRAPPLE_ERROR_NOT_INITIALISED; } returnval=clientdata->last_error; //Now wipe the last error clientdata->last_error=GRAPPLE_NO_ERROR; return returnval; } pong2-0.1.3/src/grapple/Makefile.am0000644000175000001440000000255210474150241013734 00000000000000noinst_LIBRARIES = \ libgrapple.a libgrapple_a_SOURCES = \ dynstring.c dynstring.h \ grapple_callback.c \ grapple_callback_dispatcher.c \ grapple_client.c \ grapple_client_thread.c \ grapple_comms.c \ grapple_comms_api.c \ grapple_confirm.c \ grapple_connection.c \ grapple_error.c \ grapple_failover.c \ grapple_group.c \ grapple_lobby.c \ grapple_lobbycallback.c \ grapple_lobbyclient.c \ grapple_lobbyclient_thread.c \ grapple_lobbyconnection.c \ grapple_lobbygame.c \ grapple_lobbymessage.c \ grapple_message.c \ grapple_queue.c \ grapple_server.c \ grapple_server_thread.c \ socket.c socket.h \ tools.c tools.h prototypes.h \ grapple.h grapple_confirm.h grapple_lobby.h grapple_protocols.h \ grapple_callback.h grapple_connection.h grapple_lobby_internal.h grapple_queue.h \ grapple_callback_dispatcher.h grapple_defines.h grapple_lobbycallback.h grapple_server.h \ grapple_callback_internal.h grapple_enums.h grapple_lobbyclient_thread.h grapple_server_internal.h \ grapple_client.h grapple_error.h grapple_lobbyconnection.h grapple_server_thread.h \ grapple_client_internal.h grapple_error_internal.h grapple_lobbygame.h grapple_structs.h \ grapple_client_thread.h grapple_failover.h grapple_lobbymessage.h grapple_types.h \ grapple_comms.h grapple_group.h grapple_message.h \ grapple_comms_api.h grapple_internal.h grapple_message_internal.h pong2-0.1.3/src/grapple/grapple_lobby.h0000644000175000001440000001251410473646146014706 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_LOBBY_H #define GRAPPLE_LOBBY_H #include "grapple_defines.h" #include "grapple_error.h" #include "grapple_protocols.h" #include "grapple_types.h" typedef int grapple_lobby; typedef int grapple_lobbyclient; typedef int grapple_lobbygameid; typedef int grapple_lobbyroomid; #define GRAPPLE_LOBBY_ENTRY_ROOM "Entry" typedef enum { GRAPPLE_LOBBYMSG_ROOMLEAVE = 1, GRAPPLE_LOBBYMSG_ROOMENTER, GRAPPLE_LOBBYMSG_ROOMCREATE, GRAPPLE_LOBBYMSG_ROOMDELETE, GRAPPLE_LOBBYMSG_CHAT, GRAPPLE_LOBBYMSG_DISCONNECTED, GRAPPLE_LOBBYMSG_NEWGAME, GRAPPLE_LOBBYMSG_DELETEGAME, GRAPPLE_LOBBYMSG_GAME_MAXUSERS, GRAPPLE_LOBBYMSG_GAME_USERS, GRAPPLE_LOBBYMSG_GAME_CLOSED, } grapple_lobbymessagetype; typedef struct _grapple_lobbymessage { grapple_lobbymessagetype type; union { struct { grapple_user id; int length; char *message; } CHAT; struct { grapple_lobbyroomid roomid; grapple_user userid; char *name; } ROOM; struct { grapple_lobbygameid id; char *name; int maxusers; int currentusers; int needpassword; int closed; } GAME; }; struct _grapple_lobbymessage *next; struct _grapple_lobbymessage *prev; } grapple_lobbymessage; typedef struct { grapple_lobbygameid gameid; char *name; int currentusers; int maxusers; int needpassword; grapple_lobbyroomid room; int closed; } grapple_lobbygame; //The callback typedef typedef int(*grapple_lobbycallback)(grapple_lobbymessage *,void *); /////////////////////SERVER////////////////////// extern grapple_lobby grapple_lobby_init(const char *,const char *); extern int grapple_lobby_ip_set(grapple_lobby,const char *); extern int grapple_lobby_port_set(grapple_lobby,int); extern int grapple_lobby_start(grapple_lobby); extern int grapple_lobby_destroy(grapple_lobby); extern grapple_error grapple_lobby_error_get(grapple_lobbyclient); /////////////////////CLIENT////////////////////// extern grapple_lobbyclient grapple_lobbyclient_init(const char *,const char *); extern int grapple_lobbyclient_address_set(grapple_lobbyclient, const char *); extern int grapple_lobbyclient_port_set(grapple_lobbyclient,int); extern int grapple_lobbyclient_name_set(grapple_lobbyclient, const char *); extern int grapple_lobbyclient_start(grapple_lobbyclient); extern int grapple_lobbyclient_destroy(grapple_lobbyclient); extern int grapple_lobbyclient_room_create(grapple_lobbyclient,const char *); extern int grapple_lobbyclient_room_enter(grapple_lobbyclient,grapple_lobbyroomid); extern int grapple_lobbyclient_room_leave(grapple_lobbyclient); extern int grapple_lobbyclient_chat(grapple_lobbyclient,const char *); extern grapple_lobbymessage *grapple_lobbyclient_message_pull(grapple_lobbyclient); extern grapple_lobbygameid grapple_lobbyclient_game_register(grapple_lobbyclient, grapple_server); extern int grapple_lobbyclient_game_unregister(grapple_lobbyclient); extern int grapple_lobbyclient_game_join(grapple_lobbyclient, grapple_lobbygameid, grapple_client); extern int grapple_lobbyclient_game_leave(grapple_lobbyclient,grapple_client); extern grapple_lobbyroomid grapple_lobbyclient_currentroomid_get(grapple_lobbyclient); extern grapple_lobbyroomid *grapple_lobbyclient_roomlist_get(grapple_lobbyclient); extern char *grapple_lobbyclient_roomname_get(grapple_lobbyclient, grapple_lobbyroomid); extern grapple_lobbyroomid grapple_lobbyclient_roomid_get(grapple_lobbyclient, const char *); extern grapple_user *grapple_lobbyclient_roomusers_get(grapple_lobbyclient, grapple_lobbyroomid); extern grapple_lobbygameid *grapple_lobbyclient_gamelist_get(grapple_lobbyclient, grapple_user); extern grapple_lobbygame *grapple_lobbyclient_game_get(grapple_lobbyclient,grapple_lobbygameid); extern int grapple_lobbyclient_game_dispose(grapple_lobbygame *); extern int grapple_lobbyclient_callback_set(grapple_lobbyclient, grapple_lobbymessagetype, grapple_lobbycallback, void *); extern int grapple_lobbyclient_callback_setall(grapple_lobbyclient, grapple_lobbycallback, void *); extern int grapple_lobbyclient_callback_unset(grapple_lobbyclient, grapple_lobbymessagetype); extern grapple_error grapple_lobbyclient_error_get(grapple_lobbyclient); /////////////////////////OTHER////////////////////// extern int grapple_lobbymessage_dispose(grapple_lobbymessage *); #endif pong2-0.1.3/src/grapple/grapple_lobbymessage.h0000644000175000001440000000250110473646146016246 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_LOBBYMESSAGE_H #define GRAPPLE_LOBBYMESSAGE_H #include "grapple_lobby_internal.h" #include "grapple_lobby.h" extern grapple_lobbymessage *grapple_lobbymessage_aquire(void); extern grapple_lobbymessage *grapple_lobbymessage_link(grapple_lobbymessage *, grapple_lobbymessage *); extern grapple_lobbymessage *grapple_lobbymessage_unlink(grapple_lobbymessage *, grapple_lobbymessage *); #endif pong2-0.1.3/src/grapple/grapple_callback_internal.h0000644000175000001440000000377310473646146017236 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_CALLBACK_INTERNAL_H #define GRAPPLE_CALLBACK_INTERNAL_H #include "grapple_structs.h" typedef struct _grapple_callbackevent { grapple_callback callback; void *context; grapple_message *message; struct _grapple_callbackevent *next; struct _grapple_callbackevent *prev; } grapple_callbackevent; extern grapple_callbackevent *grapple_callbackevent_link(grapple_callbackevent *, grapple_callbackevent *); extern grapple_callbackevent *grapple_callbackevent_unlink(grapple_callbackevent *, grapple_callbackevent *); extern grapple_callback_list *grapple_callback_get(grapple_callback_list *, grapple_messagetype); extern grapple_callback_list *grapple_callback_add(grapple_callback_list *, grapple_messagetype, grapple_callback, void *); extern grapple_callback_list *grapple_callback_remove(grapple_callback_list *, grapple_messagetype); extern int grapple_client_callback_generate(internal_client_data *, grapple_queue *); extern int grapple_server_callback_generate(internal_server_data *, grapple_queue *); #endif pong2-0.1.3/src/grapple/socket.c0000644000175000001440000031340710473646146013355 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef SOCK_SSL #include #endif #ifndef MSG_DONTWAIT #define MSG_DONTWAIT 0x40 #endif #include "dynstring.h" #include "socket.h" extern int gethostname (char *, size_t); static int socket_udp2way_connectmessage(socketbuf *); static int socket_udp2way_listener_data_process(socketbuf *, struct sockaddr_in *, size_t,signed char *,int); static int socket_udp2way_reader_data_process(socketbuf *sock, signed char *buf,int datalen); #ifdef SOCK_SSL //Handle the SSL errors static int ssl_process_error(SSL *ssl,int rv) { switch (SSL_get_error(ssl,rv)) { case SSL_ERROR_NONE: case SSL_ERROR_WANT_READ: case SSL_ERROR_WANT_WRITE: case SSL_ERROR_WANT_CONNECT: case SSL_ERROR_WANT_ACCEPT: rv=0; //Set rv (the retutn value) to 0 for each of these errors break; case SSL_ERROR_ZERO_RETURN: case SSL_ERROR_WANT_X509_LOOKUP: case SSL_ERROR_SYSCALL: case SSL_ERROR_SSL: break; } return rv; } //Function to initialise the socket to be encrypted static void socket_set_listener_encrypted(socketbuf *sock) { int rv; SSL_METHOD *ssl_meth=0; ssl_meth=SSLv23_server_method(); sock->ctx = SSL_CTX_new(ssl_meth); if (!sock->ctx) { sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } if (!sock->server_cert_file || !*sock->server_cert_file || !sock->server_key_file || !*sock->server_key_file) { sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } rv=SSL_CTX_use_certificate_file(sock->ctx,sock->server_cert_file, SSL_FILETYPE_PEM); rv=SSL_CTX_use_RSAPrivateKey_file(sock->ctx,sock->server_key_file, SSL_FILETYPE_PEM); if (!SSL_CTX_check_private_key(sock->ctx)) { printf("Private key does not match the certificate public key\n"); sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } //It has all initialised correctly, set it as encrypted sock->encrypted=1; } //Set the socket to be a host type encrypted socket - so other sockets will //verify against it. static void socket_set_server_encrypted(socketbuf *sock) { int rv; if (sock->encrypted==2) { sock->ctx = sock->parent->ctx; if (!sock->ctx) { sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } sock->ssl = SSL_new(sock->ctx); if (!sock->ssl) { SSL_CTX_free(sock->ctx); sock->ctx=0; sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } SSL_set_fd(sock->ssl,sock->fd); sock->encrypted=3; } if (sock->encrypted==3) { rv=SSL_accept(sock->ssl); if (rv<0) { rv=ssl_process_error(sock->ssl,rv); } if (rv<0) { SSL_CTX_free(sock->ctx); sock->ctx=0; SSL_free(sock->ssl); sock->ssl=0; sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } if (rv==0) return; sock->encrypted=4; } if (sock->encrypted==4) { if (!strcmp(SSL_get_cipher(sock->ssl),"(NONE)")) { SSL_CTX_free(sock->ctx); sock->ctx=0; SSL_free(sock->ssl); sock->ssl=0; sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } } SSL_set_mode(sock->ssl, SSL_get_mode(sock->ssl)|SSL_MODE_ENABLE_PARTIAL_WRITE); //It worked, note it as an encrypted socket sock->encrypted=1; return; } //Set this socket up to be an encryption client that will verift against the //host static void socket_set_client_encrypted(socketbuf *sock) { SSL_METHOD *ssl_meth=0; int rv; if (sock->encrypted==2) { ssl_meth=SSLv23_client_method(); sock->ctx = SSL_CTX_new(ssl_meth); if (!sock->ctx) { sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } sock->ssl=SSL_new(sock->ctx); if (!sock->ssl) { SSL_CTX_free(sock->ctx); sock->ctx=0; sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } if (sock->client_ca_file) { rv=SSL_CTX_load_verify_locations(sock->ctx,sock->client_ca_file,NULL); if (!rv) { SSL_CTX_free(sock->ctx); sock->ctx=0; sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } } SSL_set_fd(sock->ssl,sock->fd); sock->encrypted=3; } if (sock->encrypted==3) { rv=SSL_connect(sock->ssl); if (rv<0) { rv=ssl_process_error(sock->ssl,rv); } if (rv<0) { SSL_CTX_free(sock->ctx); sock->ctx=0; SSL_free(sock->ssl); sock->ssl=0; sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } if (rv==0) return; sock->encrypted=4; } if (sock->encrypted==4) { if (!strcmp(SSL_get_cipher(sock->ssl),"(NONE)")) { SSL_CTX_free(sock->ctx); sock->ctx=0; SSL_free(sock->ssl); sock->ssl=0; sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } } if (sock->client_ca_file) { //Now we verify that the cert we have is good rv=SSL_get_verify_result(sock->ssl); if (rv!=X509_V_OK) { SSL_CTX_free(sock->ctx); sock->ctx=0; SSL_free(sock->ssl); sock->ssl=0; sock->encrypted=0; sock->flags |= SOCKET_DEAD; return; } } SSL_set_mode(sock->ssl, SSL_get_mode(sock->ssl)|SSL_MODE_ENABLE_PARTIAL_WRITE); //Successful sock->encrypted=1; return; } static void socket_process_ssl(socketbuf *sock) { if (sock->flags & SOCKET_INCOMING) socket_set_server_encrypted(sock); else socket_set_client_encrypted(sock); } #endif //SOCK_SSL #ifdef DEBUG //Simple debug function that reports all socket data to a file, the filename //based on the fd number static void socket_data_debug(socketbuf *sock,char *buf,int len,int writer) { FILE *fp; int loopa; char filename[PATH_MAX]; //Set the filename if (writer) sprintf(filename,"/tmp/socket_%d.write",sock->fd); else sprintf(filename,"/tmp/socket_%d.read",sock->fd); //Open the file for appending fp=fopen(filename,"a"); if (fp) { //Write the bytes into the file, on oneline. If the value is printable //also write the character, as this can help debugging some streams for (loopa=0;loopaprotocol==SOCKET_UDP) { //Calculate how long the length will be of the UDP packet newlen=len; if (sock->udp2w) { //It will be 4 extra bytes if it is a 2 way UDP if (sock->udp2w_infd) //And an extra 4 if we have the incoming socket ready newlen+=8; else //Just that 4 newlen+=4; } //So, the first data goes in, this is the length of the following data //This happens for all UDP packets, so the buffer knows how long to send //as the data packet udplen.i=newlen; dynstringRawappend(sock->outdata,udplen.c,4); if (sock->udp2w) { //Then for 2 way UDP, we send the protocol - we are sending user //data not a low level protocol packet udpdata.i=htonl(SOCKET_UDP2W_PROTOCOL_DATA); dynstringRawappend(sock->outdata,udpdata.c,4); if (sock->udp2w_infd) { //We then send the port number of the return port, if we have one udpdata.i=htonl(sock->udp2w_port); dynstringRawappend(sock->outdata,udpdata.c,4); } } } //Now we simply append the data itself. If this is TCP thats all we need //to do, as TCP sends a whole stream, its up to the client to rebuild //it, with UDP we have made and sent a header dynstringRawappend(sock->outdata,data,len); sock->bytes_out+=len; return; } //rdata is the resend data, used on reliable UDP packets to resend //packets that may have gone missing. Here we delete one from a //linked list. Any linked list, we dont care static socket_udp_rdata *socket_rdata_delete(socket_udp_rdata *list, socket_udp_rdata *target) { if (target->next==target) { list=NULL; } else { target->next->prev=target->prev; target->prev->next=target->next; if (target==list) list=target->next; } if (target->data) free(target->data); free(target); return list; } //This function locates a rdata packet by its ID from a list static socket_udp_rdata *socket_rdata_locate_packetnum(socket_udp_rdata *list, int packetnum) { socket_udp_rdata *scan; scan=list; //Scan through the list while (scan) { if (scan->packetnum==packetnum) //We have a match, return it return scan; scan=scan->next; if (scan==list) //Come to the end of the list (it is circular) scan=NULL; } //No match, return NULL return NULL; } //Allocate an rdata packet and put it into a list static socket_udp_rdata *rdata_allocate(socket_udp_rdata *list, int packetnum, const char *data,int len,int sent) { socket_udp_rdata *newpacket; //Allocate the memory newpacket=(socket_udp_rdata *)calloc(1,sizeof(socket_udp_rdata)); //Allocate the data segment memory newpacket->data=(char *)malloc(len); memcpy(newpacket->data,data,len); newpacket->length=len; newpacket->sent=sent; //Set the send time gettimeofday(&newpacket->sendtime,NULL); newpacket->packetnum=packetnum; //Link this into the list we have supplied if (list) { newpacket->next=list; newpacket->prev=list->prev; newpacket->prev->next=newpacket; newpacket->next->prev=newpacket; return list; } newpacket->next=newpacket; newpacket->prev=newpacket; return newpacket; } //Write a data packet in reliable mode void socket_write_reliable(socketbuf *sock, const char *data,size_t len) { socket_intchar udplen,udpdata; int newlen,packetnum; //If we arent using 2 way UDP, we just send, as we cant have reliable one way //UDP and UDP is the only protocol we support that is unreliable if (sock->protocol!=SOCKET_UDP || !sock->udp2w) { socket_write(sock, data,len); return; } //Incriment the outbound packet number packetnum=sock->udp2w_routpacket++; //Calculate the length of the data newlen=len; if (sock->udp2w_infd) newlen+=12; else newlen+=8; //Send the length first //This does NOT get htonl'd as it gets stripped //before actually sending it udplen.i=newlen; dynstringRawappend(sock->outdata,udplen.c,4); //Then the protocol udpdata.i=htonl(SOCKET_UDP2W_PROTOCOL_RDATA); dynstringRawappend(sock->outdata,udpdata.c,4); if (sock->udp2w_infd) { //Then the port number udpdata.i=htonl(sock->udp2w_port); dynstringRawappend(sock->outdata,udpdata.c,4); } //Then the packet number, so the other end keeps in sync udpdata.i=htonl(packetnum); dynstringRawappend(sock->outdata,udpdata.c,4); //Then the data itself dynstringRawappend(sock->outdata,data,len); sock->bytes_out+=len; //Add this packet to the RDATA out list, so we know to resend it if we //dont get a confirmation of the receipt sock->udp2w_rdata_out=rdata_allocate(sock->udp2w_rdata_out, packetnum, data,len,0); return; } //Just a user accessible function to return the number of bytes received size_t socket_bytes_in(socketbuf *sock) { return sock->bytes_in; } //Just a user accessible function to return the number of bytes sent size_t socket_bytes_out(socketbuf *sock) { return sock->bytes_out; } //Sockets are processed out of a 'processlist' - which is a linked list //of socketbuf's. This function adds a socketbuf to a processlist. It creates //a processlist object to hold the socketbuf socket_processlist *socket_link(socket_processlist *list,socketbuf *sock) { socket_processlist *newitem; newitem=(socket_processlist *)malloc(sizeof(socket_processlist)); newitem->sock=sock; if (!list) { newitem->next=newitem; newitem->prev=newitem; return newitem; } newitem->next=list; newitem->prev=list->prev; newitem->next->prev=newitem; newitem->prev->next=newitem; return list; } //And this function unlinks a socketbuf from a processlist. It also frees the //processlist container that held the socketbuf socket_processlist *socket_unlink(socket_processlist *list,socketbuf *sock) { socket_processlist *scan; if (list->next==list) { if (list->sock!=sock) return list; free(list); return NULL; } scan=list; while (scan) { if (scan->sock==sock) { scan->prev->next=scan->next; scan->next->prev=scan->prev; if (scan==list) list=scan->next; free(scan); return list; } scan=scan->next; if (scan==list) return list; } return list; } //This is the basic function for creating a socketbuf object around a //file descriptor static socketbuf *socket_create(int fd) { socketbuf *returnval; //Allocate the memory for the socket returnval=(socketbuf *)calloc(1,sizeof(socketbuf)); //Give it a small in and out buffer - these resize dynamically so it doesnt //really matter what size we give it. 128 is a fairly small number in case //the socket only sends small bits of data, this saves over-allocating. returnval->indata=dynstringInit(128); returnval->outdata=dynstringInit(128); //Set the file descriptor into the structure returnval->fd=fd; //Thats it, we have our socketbuf. Much more wil happen to this depending //on what the type of socket being made is, this data will be filled in //by the function that calls this one. return returnval; } //We are destroying a socket. We are also however needing to be careful that //we destroy any connecting sockets if this is a listener. void socket_destroy(socketbuf *sock) { socketbuf *scan; while (sock->new_children) { //Now we MUST destroy this, they are connecting sockets who have //no parent, if we dont destroy now we will leak memory //This will, incidentally, cascade down, destroying always the last //one in the tree, and then roll back up to here socket_destroy(sock->new_children); } //Here we must now also disconnect all connected children. These have been //accessed by the parent program and so it is not our responsibility to //keep track of them. Why did we keep them in a list in the first place? //Well, things like UDP, all data comes in on the listener, not on a //socket dedicated to the other end, so we need to have a list of all //who have connected, so we know who to send the data to/ scan=sock->connected_children; while (scan) { if (scan->parent==sock) scan->parent=NULL; scan=scan->connected_child_next; if (scan==sock->connected_children) scan=NULL; } //If we have a parent, then unlink ourselves from the parent, so that //this socket is no longer in contention for any data received by the //parent socket, if it is UDP if (sock->parent) { if (sock->new_child_next) { if (sock->parent->new_children==sock) sock->parent->new_children=sock->new_child_next; if (sock->parent->new_children==sock) sock->parent->new_children=NULL; } if (sock->connected_child_next) { if (sock->parent->connected_children==sock) sock->parent->connected_children=sock->connected_child_next; if (sock->parent->connected_children==sock) sock->parent->connected_children=NULL; } } //Unlink ourselves from the list of sockets connected to the same //parent, which can be intact even if the parent is gone. if (sock->new_child_next) { sock->new_child_next->new_child_prev=sock->new_child_prev; sock->new_child_prev->new_child_next=sock->new_child_next; } if (sock->connected_child_next) { sock->connected_child_next->connected_child_prev=sock->connected_child_prev; sock->connected_child_prev->connected_child_next=sock->connected_child_next; } //Finally we have done the internal management, we need to actually //destroy the socket! if (sock->fd) { //If we have the socket, kill it if (sock->flags & SOCKET_CONNECTED) //shutdown, if its connected shutdown(sock->fd,0); //Then close the socket close(sock->fd); } //The data socket itself is now disconnected. //On a 2 way UDP, we need to also close the other socket if (sock->udp2w_infd) { //If we have the socket, kill it //shutdown, if its connected shutdown(sock->udp2w_infd,0); //Then close the socket close(sock->udp2w_infd); } //The udp2w_infd socket itself is now disconnected. //On an interrupt docket we have a different one if (sock->interrupt_fd) { //If we have the socket, kill it //shutdown, if its connected shutdown(sock->interrupt_fd,0); //Then close the socket close(sock->interrupt_fd); } //Free the memory used in the transmit and receive queues if (sock->indata) dynstringUninit(sock->indata); if (sock->outdata) dynstringUninit(sock->outdata); //Free the resend data queues, we dont need them any more, any data that //still hasnt made it isnt going to now. while (sock->udp2w_rdata_out) sock->udp2w_rdata_out=socket_rdata_delete(sock->udp2w_rdata_out, sock->udp2w_rdata_out); while (sock->udp2w_rdata_in) sock->udp2w_rdata_in=socket_rdata_delete(sock->udp2w_rdata_in, sock->udp2w_rdata_in); //Free the hostname if (sock->host) free(sock->host); //Free the pathname (applies to unix sockets only) if (sock->path) { if (sock->flags & SOCKET_LISTENER) unlink(sock->path); free(sock->path); } //Free the socket data, we are done free(sock); return; } //Create the listener socket for a unix connection socketbuf *socket_create_unix_wait(const char *path,int wait) { int fd; socketbuf *returnval; struct sockaddr_un sa; int dummy,selectnum; fd_set writer; #ifndef FIONBIO # ifdef O_NONBLOCK int flags; # endif #endif //We must specify a path in the filesystem, that is where the socket lives. //Without it, no way to create it. if (!path || !*path) return 0; //create the sockets file descriptor fd=socket(PF_UNIX,SOCK_STREAM,0); if (fd<1) { //Socket creation failed. return 0; } memset(&sa,0,sizeof(struct sockaddr_in)); //Set the fd as a UNIX socket sa.sun_family = AF_UNIX; strcpy(sa.sun_path,path); //Set non-blocking, so we can check for a data without freezing. If we //fail to set non-blocking we must abort, we require it. #ifdef FIONBIO dummy=1; if (ioctl(fd,FIONBIO,&dummy)<0) { close(fd); return 0; } #else # ifdef O_NONBLOCK flags=fcntl(fd,F_GETFL,0); if (flags<0) { close(fd); return 0; } if (fcntl(fd,F_SETFL,flags|O_NONBLOCK)<0) { close(fd); return 0; } # else # error No valid non-blocking method - cannot build; # endif // O_NONBLOCK #endif //FIONBIO //We have the good file descriptor, set it into a socketbuf structure returnval=socket_create(fd); //Note the protocol returnval->protocol=SOCKET_UNIX; //And store the path returnval->path=(char *)malloc(strlen(path)+1); strcpy(returnval->path,path); //Up to now this has all been preparation, now we actually connect to the //socket if (connect(fd,(struct sockaddr *)&sa,sizeof(sa))==0) { //Connect was successful, we can finish this here returnval->flags |= SOCKET_CONNECTED; returnval->connect_time=time(NULL); return returnval; } //The connection is 'in progress' if (errno==EINPROGRESS) { //Connect was possibly OK, but we havent finished, come back //and check later with select returnval->flags|=SOCKET_CONNECTING; if (!wait) { //We were called with the option NOT to wait for it to connect, so //we return here. It is now the responsibility of the caller to //process this socket occasionally and see if it has now connected //or if the connection failed. return returnval; } else { //We were asked to keep waiting for the socket to connect while (returnval->flags & SOCKET_CONNECTING) { //To test if we have connected yet, we select on the socket, //to see if its writer returns FD_ZERO(&writer); FD_SET(returnval->fd,&writer); //We need to wait, as long as it takes, so we set no timeout selectnum=select(FD_SETSIZE,0,&writer,0,NULL); //The select failed, this means an error, we couldnt connect if (selectnum<0) { socket_destroy(returnval); return 0; } if (selectnum>0) { //At least one socket (it has to be us) returned data if (FD_ISSET(returnval->fd,&writer)) { //We have connected returnval->flags &=~ SOCKET_CONNECTING; returnval->flags |= SOCKET_CONNECTED; returnval->connect_time=time(NULL); return returnval; } } } } } //It was an error, and a bad one, close this socket_destroy(returnval); return 0; } //Create a wakeup socket socketbuf *socket_create_interrupt(void) { int fd[2]; socketbuf *returnval; int dummy; #ifndef FIONBIO # ifdef O_NONBLOCK int flags; # endif #endif //create the sockets file descriptor if (pipe(fd)==-1) return 0; //Set non-blocking, so we can check for a data without freezing. If we //fail to set non-blocking we must abort, we require it. #ifdef FIONBIO dummy=1; if (ioctl(fd[0],FIONBIO,&dummy)<0) { close(fd[0]); close(fd[1]); return 0; } dummy=1; if (ioctl(fd[1],FIONBIO,&dummy)<0) { close(fd[0]); close(fd[1]); return 0; } #else # ifdef O_NONBLOCK flags=fcntl(fd[0],F_GETFL,0); if (flags[0]<0) { close(fd[0]); close(fd[1]); return 0; } if (fcntl(fd[0],F_SETFL,flags|O_NONBLOCK)<0) { close(fd[0]); close(fd[1]); return 0; } flags=fcntl(fd[1],F_GETFL,0); if (flags[1]<0) { close(fd[0]); close(fd[1]); return 0; } if (fcntl(fd[1],F_SETFL,flags|O_NONBLOCK)<0) { close(fd[0]); close(fd[1]); return 0; } # else # error No valid non-blocking method - cannot build; # endif // O_NONBLOCK #endif //FIONBIO //We have the good file descriptor, set it into a socketbuf structure returnval=socket_create(fd[0]); returnval->interrupt_fd=fd[1]; //Note the protocol returnval->protocol=SOCKET_INTERRUPT; returnval->flags |= SOCKET_CONNECTED; returnval->connect_time=time(NULL); return returnval; } int socket_interrupt(socketbuf *sock) { if (sock->protocol==SOCKET_INTERRUPT) { write(sock->interrupt_fd,"0",1); sock->bytes_out++; } return 0; } //Create a TCPIP connection to a remote socket socketbuf *socket_create_inet_tcp_wait(const char *host,int port,int wait) { int fd; socketbuf *returnval; struct sockaddr_in sa; int dummy,selectnum; struct in_addr inet_address; struct hostent *hp; fd_set writer; struct sockaddr_in peername; socklen_t peersize; #ifndef FIONBIO # ifdef O_NONBLOCK int flags; # endif #endif //We need the hostname, where will we connect without one if (!host || !*host) return 0; //Create the socket fd=socket(AF_INET,SOCK_STREAM,0); if (fd<1) { //Basic socket connection failed, this really shouldnt happen return 0; } memset(&sa,0,sizeof(struct sockaddr_in)); //Find the hostname hp=gethostbyname(host); if (!hp) //We cant resolve the hostname inet_address.s_addr=-1; else //We have the hostname memcpy((char *)&inet_address,hp->h_addr,sizeof(struct in_addr)); //The hostname was unresolvable, we cant connect to it if (inet_address.s_addr==-1) { close(fd); return 0; } //Set the socket data sa.sin_family=AF_INET; sa.sin_port=htons(port); sa.sin_addr=inet_address; //Set reuseaddr dummy=1; setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&dummy,sizeof(dummy)); //Set non-blocking, so we can check for a data without freezing #ifdef FIONBIO dummy=1; if (ioctl(fd,FIONBIO,&dummy)<0) { close(fd); return 0; } #else # ifdef O_NONBLOCK flags=fcntl(fd,F_GETFL,0); if (flags<0) { close(fd); return 0; } if (fcntl(fd,F_SETFL,flags|O_NONBLOCK)<0) { close(fd); return 0; } # else # error No valid non-blocking method - cannot build; # endif // O_NONBLOCK #endif //FIONBIO //We have a valid socket, now we wrap a socketbuf around it returnval=socket_create(fd); //Note the protocol returnval->protocol=SOCKET_TCP; //Note the hostname and the portnumber in the structure returnval->host=(char *)malloc(strlen(host)+1); strcpy(returnval->host,host); returnval->port=port; //Now try and actually connect to the remote address if (connect(fd,(struct sockaddr *)&sa,sizeof(sa))==0) { //Connect was successful, we can finish this here returnval->flags |= SOCKET_CONNECTED; returnval->connect_time=time(NULL); return returnval; } //We have an in-progress connection if (errno==EINPROGRESS) { //Connect was possibly OK, but we havent finished, come back //and check later with select returnval->flags|=SOCKET_CONNECTING; if (!wait) { //The caller requested we do not wait for the connection to finish, //it will now be the callers responsibility to check this using //process_socket return returnval; } else { //We have been requested to keep on waiting for the connection while (returnval->flags & SOCKET_CONNECTING) { //We do this by selecting on the socket, see what the //writer returns FD_ZERO(&writer); FD_SET(returnval->fd,&writer); //Wait forever if needbe selectnum=select(FD_SETSIZE,0,&writer,0,NULL); if (selectnum<0) { //There was an error on the select, this means the connection //has definitely died. socket_destroy(returnval); return 0; } if (selectnum>0) { if (FD_ISSET(returnval->fd,&writer)) { //We have a writer, but is it ok or has it failed //to connect, check with getpeername() peersize=sizeof(struct sockaddr_in); if (!getpeername(returnval->fd, (struct sockaddr *)&peername, &peersize)) { //Connected ok! returnval->flags &=~ SOCKET_CONNECTING; returnval->flags |= SOCKET_CONNECTED; returnval->connect_time=time(NULL); return returnval; } else { //Connection failed socket_destroy(returnval); return 0; } } } } } } //It was an error, and a bad one, close this socket_destroy(returnval); return 0; } //Create a UDP socket. Actually this never connects so the //wait parameter is ignored. It just sets up a route where data can be thrown //to. With UDP you dont know if it has reached its target or not. socketbuf *socket_create_inet_udp_wait(const char *host,int port,int wait) { int fd,dummy; socketbuf *returnval; struct in_addr inet_address; struct hostent *hp; #ifndef FIONBIO # ifdef O_NONBLOCK int flags; # endif #endif //We need to know where to connect to. if (!host || !*host) return 0; //Create the socket fd=socket(PF_INET,SOCK_DGRAM,IPPROTO_IP); if (fd<1) return 0; //Now create the data structure around the socket returnval=socket_create(fd); memset(&returnval->udp_sa,0,sizeof(struct sockaddr_in)); //Lookup the hostname we are sending to hp=gethostbyname(host); if (!hp) inet_address.s_addr=-1; else memcpy((char *)&inet_address,hp->h_addr,sizeof(struct in_addr)); if (inet_address.s_addr==-1) { //We couldnt resolve the address, destroy the socket socket_destroy(returnval); close(fd); return 0; } //Save the data for later use in the datastruct returnval->udp_sa.sin_family=AF_INET; returnval->udp_sa.sin_port=htons(port); returnval->udp_sa.sin_addr.s_addr=inet_address.s_addr; //Note the protocol returnval->protocol=SOCKET_UDP; //Save the text representation of the address returnval->host=(char *)malloc(strlen(host)+1); strcpy(returnval->host,host); returnval->port=port; //Set non-blocking, so we can check for a data without freezing #ifdef FIONBIO dummy=1; if (ioctl(fd,FIONBIO,&dummy)<0) { close(fd); return 0; } #else # ifdef O_NONBLOCK flags=fcntl(fd,F_GETFL,0); if (flags<0) { close(fd); return 0; } if (fcntl(fd,F_SETFL,flags|O_NONBLOCK)<0) { close(fd); return 0; } # else # error No valid non-blocking method - cannot build; # endif // O_NONBLOCK #endif //FIONBIO //While we technically havent connected, we are ready to send data, and thats //what is important returnval->flags |= SOCKET_CONNECTED; returnval->connect_time=time(NULL); return returnval; } //Test to see of a socket is connected int socket_connected(socketbuf *sock) { if (sock->flags & SOCKET_DEAD) //A dead socket is never connected return 0; if (sock->flags & SOCKET_CONNECTED) //It has connected return 1; return 0; } //Test to see if a socket is dead int socket_dead(socketbuf *sock) { if (sock->flags & SOCKET_DEAD) //It is {:-( return 1; //Its alive! yay! return 0; } //This function drops a set length of data from the socket This is handy //For it we have already peeked it, so we HAVE the data, we dont want to //reallocate. Or if we have a set of data we KNOW is useless void socket_indata_drop(socketbuf *sock,int len) { //memmove freaks out at a zero length memory move if (len==0) return; //Decrease the recorded amount of data stored sock->indata->len-=len; if (sock->indata->len<1) { sock->indata->len=0; return; } //move the later data to the start of the buffer memmove(sock->indata->buf,sock->indata->buf+len,sock->indata->len); return; } //This function drops a set length of data from the socket OUTBUFFER //This is dangerous and is only an internal function, dont let the end user //do it or the whole socket could break, especially in UDP static void socket_outdata_drop(socketbuf *sock,int len) { //memmove freaks out at a zero length memory move if (len==0) return; //Decriment the recorded amount of data sock->outdata->len-=len; if (sock->outdata->len<1) { sock->outdata->len=0; return; } //Move the rest to the start memmove(sock->outdata->buf,sock->outdata->buf+len,sock->outdata->len); return; } //Free a UDP data packet Fairly obvious int socket_udp_data_free(socket_udp_data *data) { if (data->data) free(data->data); free(data); return 1; } //A 2 way UDP socket has received some data on its return socket static socket_udp_data *socket_udp2way_indata_action(socketbuf *sock,int pull) { socket_udp_data *returnval; socket_intchar len; int datalen; //All data must be at least 4 bytes - this is the length of the data in the //packet if (sock->indata->len<4) return NULL; //get the length of the data memcpy(len.c,sock->indata->buf,4); datalen=len.i; //The packet isnt big enough to hold all the data we expected - this is a //corrupted packet, ABORT! if (datalen+4 > sock->indata->len) return NULL; //Create an internal UDP packet to handle the data we have received returnval=(socket_udp_data *)calloc(1,sizeof(socket_udp_data)); //Allocate enough buffer for the incoming data returnval->data=(char *)malloc(datalen); memcpy(returnval->data,sock->indata->buf+4,datalen); returnval->length=datalen; //If we are deleting the data - then do so if (pull) socket_indata_drop(sock,datalen+4); //return the UDP data block return returnval; } //Receive a packet on a basic UDP socket static socket_udp_data *socket_udp_indata_action(socketbuf *sock,int pull) { socket_udp_data *returnval; socket_intchar len; int sa_len; int datalen; //We need to have at least 4 bytes as the length of the data in the packet if (sock->indata->len<4) return NULL; //If this is a 2 way UDP socket, process it using 2 way UDP handlers if (sock->udp2w) return socket_udp2way_indata_action(sock,pull); //Note the length of the sa structure - this is written wholesale //into the buffer, this is actually OK memcpy(len.c,sock->indata->buf,4); sa_len=len.i; //Check we have enough space if (sa_len+8 > sock->indata->len) return NULL; //Find the length of the data now. memcpy(len.c,sock->indata->buf+4+sa_len,4); datalen=len.i; //Check we have the whole data packet if (sa_len+datalen+8 > sock->indata->len) //We dont, its corrupt return NULL; //Allocate a data structure for the packet returnval=(socket_udp_data *)calloc(1,sizeof(socket_udp_data)); //Store the sa in the data structure. memcpy(&returnval->sa,sock->indata->buf+4,sa_len); //And the data itself returnval->data=(char *)malloc(datalen); memcpy(returnval->data,sock->indata->buf+8+sa_len,datalen); returnval->length=datalen; //If we are pulling instead of just looking, delete the data from the buffer if (pull) socket_indata_drop(sock,8+sa_len+datalen); //Return the UDP data packet return returnval; } //Wrapper function for the user to pull UDP data from the buffer socket_udp_data *socket_udp_indata_pull(socketbuf *sock) { return socket_udp_indata_action(sock,1); } //Wrapper function for the user to look at UDP data without removing it //from the buffer socket_udp_data *socket_udp_indata_view(socketbuf *sock) { return socket_udp_indata_action(sock,0); } //This is a user function to pull data from any non-UDP socket char *socket_indata_pull(socketbuf *sock,int len) { char *returnval; //Ensure we dont overrun if (len > sock->indata->len) len=sock->indata->len; //Allocate the return buffer returnval=(char *)calloc(1,len+1); //copy the data memcpy(returnval,sock->indata->buf,len); //Drop the data from the buffer socket_indata_drop(sock,len); return returnval; } //Allows the user to view the buffer const char *socket_indata_view(socketbuf *sock) { //Just return the buffer. It is returned const so the user cant mess //it up return (char *)sock->indata->buf; } //Find the length of the incoming data size_t socket_indata_length(socketbuf *sock) { return sock->indata->len; } size_t socket_outdata_length(socketbuf *sock) { //find the length of data still to send return sock->outdata->len; } //Read a unix listener socket. Not a user function, this is an internal //function filtered down to when we know what kind of //socket we have. static int socket_read_listener_unix(socketbuf *sock) { socketbuf *newsock; socklen_t socklen; struct sockaddr_un sa; int fd,dummy=0; struct linger lingerval; #ifndef FIONBIO int flags; #endif //The length of the data passed into accept socklen=(socklen_t)sizeof(sa); //Accept the new connection on this socket fd = accept(sock->fd,(struct sockaddr *) &sa, &socklen); if (fd<1) { //The connection was bad, forget it return 0; } //Set non-blocking on the new socket #ifdef FIONBIO dummy=1; if (ioctl(fd,FIONBIO,&dummy)<0) { shutdown(fd,2); close(fd); return 0; } #else # ifdef O_NONBLOCK flags=fcntl(fd,F_GETFL,0); if (flags < 0) { shutdown(fd,2); close(fd); return 0; } else if (fcntl(fd,F_SETFL,flags|O_NONBLOCK) < 0) { shutdown(fd,2); close(fd); return 0; } # else # error no valid non-blocking method # endif #endif /*FIONBIO*/ //We have a new non-blocking socket dummy=1; //Set linger on this, to make sure all data possible is sent when the //socket closes lingerval.l_onoff=0; lingerval.l_linger=0; setsockopt(fd,SOL_SOCKET,SO_LINGER,(char *)&lingerval, sizeof(struct linger)); //Create the socketbuf to hold the fd newsock=socket_create(fd); newsock->protocol=SOCKET_UNIX; newsock->path=(char *)malloc(strlen(sock->path)+1); strcpy(newsock->path,sock->path); //This socket is automatically connected (thats what we've been doing) newsock->flags |= (SOCKET_CONNECTED|SOCKET_INCOMING); //Set the mode to be the same as the socket that accepts (mode is things like //sequential data and the like... newsock->mode=sock->mode; //Set the parent. newsock->parent=sock; //This is a new child, it is NOT acknowledged by the parent, so we simply //put it into a queue waiting for the calling process to acknowledge we //exist if (sock->new_children) { newsock->new_child_next=sock->new_children; newsock->new_child_prev=newsock->new_child_next->new_child_prev; newsock->new_child_next->new_child_prev=newsock; newsock->new_child_prev->new_child_next=newsock; } else { newsock->new_child_next=newsock; newsock->new_child_prev=newsock; sock->new_children=newsock; } newsock->connect_time=time(NULL); #ifdef SOCK_SSL if (sock->encrypted) { socket_set_server_key(newsock,sock->server_key_file); socket_set_server_cert(newsock,sock->server_cert_file); socket_set_encrypted(newsock); } #endif return 1; } //Some data has been received on the UDP socket. As UDP doesnt have connections //it just gets data thrown at it, this is unlike other listeners, as we //dont just create a new socket here, we have to process the data we receive static int socket_read_listener_inet_udp(socketbuf *sock,int failkill) { int chars_left,chars_read,total_read; void *buf; char quickbuf[1024]; struct sockaddr_in sa; socket_intchar len; size_t sa_len; //Check how much data is there to read #ifdef FIONREAD if (ioctl(sock->fd,FIONREAD,&chars_left)== -1) #else # ifdef I_NREAD if (ioctl(sock->fd,I_NREAD,&chars_left)== -1) # else # error no valid read length method # endif #endif { if (failkill) { //The socket had no data, but it was supposed to, that means its //dead sock->flags|=SOCKET_DEAD; } return 0; } /*Linkdeath*/ if (!chars_left) { if (failkill) { sock->flags|=SOCKET_DEAD; } return 0; } //The buffer to store the data in. This is allocated statically as it gets //used and reused and there is NO point in creating it time and time //again **change** It wasnt threadsafe - oops if (chars_left < 1024) buf=quickbuf; else buf=malloc(chars_left); total_read=0; //Loop while there is data to read while (chars_left>0) { sa_len=sizeof(struct sockaddr); //Actually perfrorm the read from the UDP socket chars_read=recvfrom(sock->fd, buf, chars_left, 0, (struct sockaddr *)&sa, &sa_len); if (chars_read==-1) { if (errno!=EAGAIN) /*An EAGAIN simply means that it wasnt quite ready so try again later.*/ { //There was an error on the read, dead socket sock->flags|=SOCKET_DEAD; } if (buf!=quickbuf) free(buf); return 0; } if (chars_read==0) { //No chars were read, so nothing was ready, try again next time if (buf!=quickbuf) free(buf); return 0; } //Note that the socket received data, this is to stop it timing out, //as UDP sockets are stateless sock->udp2w_lastmsg=time(NULL); #ifdef DEBUG //if we are in debug mode, run that now if (sock->debug) socket_data_debug(sock,(char *)buf,chars_read,0); #endif //We are a 2 way UDP socket, process the data via the UDP2W data handler if (sock->udp2w) socket_udp2way_listener_data_process(sock, &sa,sa_len, (signed char *)buf,chars_read); else { //We are a one way UDP socket //Add the sa to the datastream len.i=sa_len; dynstringRawappend(sock->indata,len.c,4); dynstringRawappend(sock->indata,(char *)&sa,sa_len); //Then the data len.i=chars_read; dynstringRawappend(sock->indata,len.c,4); dynstringRawappend(sock->indata,(char *)buf,chars_read); } //Note how many chars have been read, and loop back to see if we have //another packets worth of data to read chars_left-=chars_read; sock->bytes_in+=chars_read; total_read+=chars_read; } if (buf!=quickbuf) free(buf); //Try again for more packets, but bear in mind it is OK if there are none, so //we set the failkill parameter to 0 socket_read_listener_inet_udp(sock,0); return total_read; } //Read the listener of a TCPIP socket static int socket_read_listener_inet_tcp(socketbuf *sock) { socketbuf *newsock; socklen_t socklen; struct sockaddr_in sa; int fd,dummy=0; struct linger lingerval; #ifndef FIONBIO int flags; #endif //The length of the data passed into accept socklen=(socklen_t)sizeof(sa); //Get the incoming socket fd = accept(sock->fd,(struct sockaddr *) &sa, &socklen); if (fd<1) { //It was a bad socket, drop it return 0; } //Set it to be non-blocking #ifdef FIONBIO dummy=1; if (ioctl(fd,FIONBIO,&dummy)<0) { shutdown(fd,2); close(fd); return 0; } #else # ifdef O_NONBLOCK flags=fcntl(fd,F_GETFL,0); if (flags < 0) { shutdown(fd,2); close(fd); return 0; } else if (fcntl(fd,F_SETFL,flags|O_NONBLOCK) < 0) { shutdown(fd,2); close(fd); return 0; } # else # error no valid non-blocking method # endif #endif /*FIONBIO*/ //Set linger so that the socket will send all its data when it close()s lingerval.l_onoff=0; lingerval.l_linger=0; setsockopt(fd,SOL_SOCKET,SO_LINGER,(char *)&lingerval, sizeof(struct linger)); //Create the socketbuf to hold the socket newsock=socket_create(fd); newsock->protocol=SOCKET_TCP; newsock->port=ntohs(sa.sin_port); newsock->host=(char *)malloc(strlen(inet_ntoa(sa.sin_addr))+1); strcpy(newsock->host,inet_ntoa(sa.sin_addr)); //This is a connected socket so note it as such newsock->flags |= (SOCKET_CONNECTED|SOCKET_INCOMING); newsock->mode=sock->mode; //Link this into the parent so that the calling program can //actually get hold of this socket newsock->parent=sock; if (sock->new_children) { newsock->new_child_next=sock->new_children; newsock->new_child_prev=newsock->new_child_next->new_child_prev; newsock->new_child_next->new_child_prev=newsock; newsock->new_child_prev->new_child_next=newsock; } else { newsock->new_child_next=newsock; newsock->new_child_prev=newsock; sock->new_children=newsock; } newsock->connect_time=time(NULL); #ifdef SOCK_SSL if (sock->encrypted) { socket_set_encrypted(newsock); } #endif return 1; } //Generic function to wrap all listener read functions. It simply //Looks at the protocol and calls the appropriate function static int socket_read_listener(socketbuf *sock) { switch (sock->protocol) { case SOCKET_TCP: return socket_read_listener_inet_tcp(sock); break; case SOCKET_UDP: return socket_read_listener_inet_udp(sock,1); break; case SOCKET_UNIX: return socket_read_listener_unix(sock); break; case SOCKET_INTERRUPT: return 0; break; } //Couldnt find a listener handler - erm, that cant happen! return -1; } //Read a 2 way UDP socket. This will be the return socket on the client, //as the outbound is read on the listener. Technicallt this is also a //listener but it can only belong to one socketbuf so we can skip a load //of the ownership tests that happen lower down the line static int socket_udp2way_read(socketbuf *sock,int failkill) { int chars_left,chars_read,total_read; void *buf=0; char quickbuf[1024]; struct sockaddr_in sa; size_t sa_len; //Check how much data is there to read #ifdef FIONREAD if (ioctl(sock->udp2w_infd,FIONREAD,&chars_left)== -1) #else # ifdef I_NREAD if (ioctl(sock->udp2w_infd,I_NREAD,&chars_left)== -1) # else # error no valid read length method # endif #endif { if (failkill) { //Kill the socket, there is no data when we expected there would be sock->flags|=SOCKET_DEAD; } return 0; } /*Linkdeath*/ if (!chars_left) { if (failkill) { sock->flags|=SOCKET_DEAD; } return 0; } //The buffer to store the data in. This is allocated statically as it gets //used and reused and there is NO point in creating it time and time //again if (chars_left<1024) buf=quickbuf; else buf=malloc(chars_left+1); total_read=0; //Loop while there is data to read while (chars_left>0) { sa_len=sizeof(struct sockaddr); //Actually perfrorm the read from the UDP socket chars_read=recvfrom(sock->udp2w_infd, buf, chars_left, 0, (struct sockaddr *)&sa, &sa_len); if (chars_read==-1) { if (errno!=EAGAIN) /*An EAGAIN simply means that it wasnt quite ready so try again later.*/ { //There was an error on the read, dead socket sock->flags|=SOCKET_DEAD; } if (buf!=quickbuf) free(buf); return 0; } if (chars_read==0) { //No chars were read, so nothing was ready, try again next time if (buf!=quickbuf) free(buf); return 0; } //Note that the socket received data, this is to stop it timing out, //as UDP sockets are stateless sock->udp2w_lastmsg=time(NULL); #ifdef DEBUG //if we are in debug mode, run that now if (sock->debug) socket_data_debug(sock,(char *)buf,chars_read,0); #endif //We ARE a 2 way UDP socket reader, pass this data off to that //handler socket_udp2way_reader_data_process(sock,(signed char *)buf,chars_read); //Note how many chars have been read, and loop back to see if we have //another packets worth of data to read chars_left-=chars_read; sock->bytes_in+=chars_read; total_read+=chars_read; } if (buf!=quickbuf) free(buf); //Try again for more packets, but bear in mind it is OK if there are none, so //we set the failkill parameter to 0 socket_udp2way_read(sock,0); return total_read; } //This is the generic function called to read data from the socket into the //socket buffer. This is not called by the user. The user just looks at the //buffer. This is called fro any type of socket, and the ones that this is not //appropriate for it just hands off to other functions. This is THE base read //functionf or ANY socket static int socket_read(socketbuf *sock) { int chars_left,chars_read,total_read; void *buf; char quickbuf[1024]; //Its a listener, read it differently using accepts if (sock->flags & SOCKET_LISTENER) return socket_read_listener(sock); //Its a UDP socket, all readable UDP sockets are listeners, you cant read //an outbound UDP socket if (sock->protocol==SOCKET_UDP) return 0; //Check how much data there is coming in #ifdef FIONREAD if (ioctl(sock->fd,FIONREAD,&chars_left)== -1) #else # ifdef I_NREAD if (ioctl(sock->fd,I_NREAD,&chars_left)== -1) # else # error no valid read length method # endif #endif { //The ioctl failed, this is a dead-socket case sock->flags|=SOCKET_DEAD; return 0; } if (!chars_left) { /*Linkdeath*/ sock->flags|=SOCKET_DEAD; return 0; } //The buffer to store the data in. This is allocated statically as it gets //used and reused and there is NO point in creating it time and time //again if (chars_left < 1024) buf=quickbuf; else buf=malloc(chars_left); total_read=0; //Keep on looping till all data has been read while (chars_left>0) { //actually read the data from the socket #ifdef SOCK_SSL if (sock->encrypted==1) chars_read=SSL_read(sock->ssl,buf,chars_left); else #endif chars_read=read(sock->fd,buf,chars_left); if (chars_read==-1) { //there was an error if (errno!=EAGAIN) //EAGAIN isnt bad, it just means try later { //Anything else is bad, the socket is dead sock->flags|=SOCKET_DEAD; } if (buf!=quickbuf) free(buf); return 0; } if (chars_read==0) { //No data was read, it shouldnt happen, if it does, then return from //here. if (buf!=quickbuf) free(buf); return 0; } #ifdef DEBUG //If we are in debug mode do that now if (sock->debug) socket_data_debug(sock,(char *)buf,chars_read,0); #endif //Add the read data into the indata buffer if (sock->protocol!=SOCKET_INTERRUPT) dynstringRawappend(sock->indata,(char *)buf,chars_read); chars_left-=chars_read; sock->bytes_in+=chars_read; total_read+=chars_read; } if (buf!=quickbuf) free(buf); return total_read; } //This function actually writes data to the socket. This is NEVER called by //the user, as the socket could be in any state, and calling from the user //would just break everything. This is called for stream sockets but not //for datagram sockets like UDP static int socket_process_write_stream(socketbuf *sock) { int written; //Perform the write. Try and write as much as we can, as fast as we can written=write(sock->fd,sock->outdata->buf,sock->outdata->len); if (written==-1) { //The write had an error if (errno!=EAGAIN) /*EAGAIN simply means that the write buffer is full, try again later, no problem*/ { //Any other error is fatal sock->flags |= SOCKET_DEAD; } } else if (written > 0) { #ifdef DEBUG //In debug mode, run the debug function if (sock->debug) socket_data_debug(sock,(char *)sock->outdata->buf,written,1); #endif //Drop the written data from the buffer socket_outdata_drop(sock,written); } //Return the number of bytes written, in case they are needed return written; } //This function actually writes data to the socket. This is NEVER called by //the user, as the socket could be in any state, and calling from the user //would just break everything. This is called for datagram sockets but not //for stream sockets like TCP or UNIX static int socket_process_write_dgram(socketbuf *sock) { int written; socket_intchar towrite; //The buffer contains one int of length data and then lots of data to //indicate a packet that should be sent all at once if (sock->outdata->len<4) return 0; //This is the length memcpy(towrite.c,sock->outdata->buf,4); //check we have enough data in the buffer to send it all if (sock->outdata->len<4+towrite.i) return 0; //We have enough, send the data. DO NOT send the initial length header, //it will get included in the receive data anyway, so we dont have to send //it twice written=sendto(sock->fd, sock->outdata->buf+4,towrite.i, MSG_DONTWAIT, (struct sockaddr *)&sock->udp_sa, sizeof(struct sockaddr_in)); if (written==-1) //There was an error { if (errno==EMSGSIZE) { //Data too big, nothing we can do, drop the packet socket_outdata_drop(sock,towrite.i+4); return 0; } else if (errno!=EAGAIN) //If the error was EAGAIN just try later { //The error was something fatal sock->flags |= SOCKET_DEAD; return 0; } } else if (written > 0) { //There was data sent #ifdef DEBUG //If we are in debug mode, handle that if (sock->debug) socket_data_debug(sock,(char *)sock->outdata->buf+4,written,1); #endif //Drop the data from the buffer socket_outdata_drop(sock,towrite.i+4); //Recurse so we send as much as we can now till its empty or we error written += socket_process_write_dgram(sock); } return written; } //This is the generic function to handle writes for ALL sockets static int socket_process_write(socketbuf *sock) { //Only if we are connected and we have something to send if (socket_connected(sock) && sock->outdata && sock->outdata->len>0) { #ifdef SOCK_SSL if (sock->encrypted) return SSL_write(sock->ssl,sock->outdata->buf,sock->outdata->len); else #endif { if (sock->protocol==SOCKET_UDP) return socket_process_write_dgram(sock); else return socket_process_write_stream(sock); } } return 0; } //2 way UDP sockets will ping each other to keep the socket alive. They ping //every 10 seconds. If the sockets go 60 seconds with no ping, then the //socket is considered dead. static int process_pings(socketbuf *sock) { socket_intchar val; int written=0; char buf[8]; time_t this_second; //Only ping 2 way UDP sockets if (!sock->udp2w) return 0; //Cant ping from a listener, a listener is inbound if (sock->flags & SOCKET_LISTENER) return 0; //Note the time this_second=time(NULL); //Check we need to send a ping if (sock->udp2w_nextping < this_second) { sock->udp2w_nextping = this_second+10; //Create the ping packet val.i=htonl(SOCKET_UDP2W_PROTOCOL_PING); memcpy(buf,val.c,4); val.i=htonl(sock->udp2w_port); memcpy(buf+4,val.c,4); //Actually send the ping written=sendto(sock->fd, buf,8, MSG_DONTWAIT, (struct sockaddr *)&sock->udp_sa, sizeof(struct sockaddr_in)); if (written==-1) { if (errno!=EAGAIN) { //Note the socket as dead if we cant send it sock->flags |= SOCKET_DEAD; return 0; } } } //Now we look at if its expired, over 60 seconds since any communication if (sock->flags & SOCKET_CONNECTING) { //Or a much smaller 8 seconds if we are trying to connect if (this_second>sock->udp2w_lastmsg+8) { sock->flags |= SOCKET_DEAD; } } else { if (this_second>sock->udp2w_lastmsg+60) { sock->flags |= SOCKET_DEAD; } } return written; } //This function handles reliable UDP resending packets. UDP does not //guarentee transmission, so when we send a reliable packet, we get a repsonse //from the other end. When that response comes through we can assume the //packet is ok. Until then, we keep resending it on a time that is based on //the average round trip packet time. This allows for congested networks static int process_resends(socketbuf *sock) { struct timeval time_now,target_time; long long us; socket_udp_rdata *scan; int newlen; socket_intchar udplen,udpdata; //Only do this for 2 way UDP sockets if (!sock->udp2w) return 0; //If there are no outbound packets to confirm, nothing to do if (!sock->udp2w_routpacket) return 0; //Now we need to find the exact time, as well as find which ones need //resending gettimeofday(&time_now,NULL); //Find how old a packet needs to be us=sock->udp2w_averound/5; //Twice as long as average for a resend,/10*2 = /5 target_time.tv_sec=time_now.tv_sec-(us/1000000); target_time.tv_usec=time_now.tv_usec-(us%1000000); if (target_time.tv_usec<0) { target_time.tv_usec+=1000000; target_time.tv_sec--; } scan=sock->udp2w_rdata_out; while (scan) { //Loop through checking each packet if (target_time.tv_sec > scan->sendtime.tv_sec || (target_time.tv_sec == scan->sendtime.tv_sec && target_time.tv_usec > scan->sendtime.tv_usec)) { //This packet needs resending //Find the length the packet needs to be newlen=scan->length; newlen+=8; if (sock->udp2w_infd) newlen+=4; //Set this length into the buffer udplen.i=newlen; dynstringRawappend(sock->outdata,udplen.c,4); //Send the protocol udpdata.i=htonl(SOCKET_UDP2W_PROTOCOL_RDATA); dynstringRawappend(sock->outdata,udpdata.c,4); //Send the port if (sock->udp2w_infd) { udpdata.i=htonl(sock->udp2w_port); dynstringRawappend(sock->outdata,udpdata.c,4); } //Send the packet number udpdata.i=htonl(scan->packetnum); dynstringRawappend(sock->outdata,udpdata.c,4); //Send the data dynstringRawappend(sock->outdata,scan->data,scan->length); //note the new send time scan->sendtime.tv_sec=time_now.tv_sec; scan->sendtime.tv_usec=time_now.tv_usec; } //Next packet scan=scan->next; if (scan==sock->udp2w_rdata_out) scan=NULL; } return 0; } //This is the main function called to process user sockets. It handles //calls to both input and output as well as processing incoming sockets //and noting dead sockets as being dead. This is a program-called //function and should be called often. //Actual data is NOT returned from this function, this function simply //calls appropriate subfunctions which update the internal buffers of //sockets. It is the calling programs job to process this data. int socket_process_sockets(socket_processlist *list,long int timeout) { socket_processlist *scan; socketbuf *sock; fd_set readers,writers; struct timeval select_timeout; int count,selectnum; scan=list; //Loop through each socket in the list we have been handed while (scan) { sock=scan->sock; if (sock->udp2w) { //If the socket is a 2 way UDP socket, process resends and pings process_resends(sock); process_pings(sock); } //Now process outbound writes (that will include any resends that have //just been created #ifdef SOCK_SSL if (sock->encrypted>1) socket_process_ssl(sock); else #endif socket_process_write(sock); scan=scan->next; if (scan==list) scan=NULL; } count=0; FD_ZERO(&readers); FD_ZERO(&writers); scan=list; //Loop through all sockets again while (scan) { sock=scan->sock; //If the socket is alive if ( #ifdef SOCK_SSL sock->encrypted<2 && #endif !(sock->flags & SOCKET_DEAD)) { if (sock->flags & SOCKET_CONNECTING) { //This is a socket in the connecting state. See if it has now //connected if (sock->udp2w) { //A connecting 2 way socket is one we need to send a //connection message to again socket_udp2way_connectmessage(sock); if (sock->udp2w_infd) { //Now set its reader socket to look for a response FD_SET(sock->udp2w_infd,&readers); count++; } } else { //This socket should be set as a writer, as this will change //when a stream socket connection state changes FD_SET(sock->fd,&writers); count++; } } else if (sock->flags & SOCKET_CONNECTED) { //This socket is alredy connected if (sock->udp2w_infd) { //If tehre is a UDP reading socket, we must use that to read FD_SET(sock->udp2w_infd,&readers); count++; } else { //Set the main socket as a reader FD_SET(sock->fd,&readers); count++; } } } scan=scan->next; if (scan==list) scan=NULL; } if (!count) //No valid sockets were ready to read, no point in reading them return 0; //Set the timeout to be as requested by the caller select_timeout.tv_sec=timeout/1000000; select_timeout.tv_usec=timeout%1000000; //Now actually run the select selectnum=select(FD_SETSIZE,&readers,&writers,0,&select_timeout); if (selectnum<1) //Select was an error, or had no returns, we have nothing new to do now return 0; //We have a result //Loop through all sockets see what we can see scan=list; while (scan) { sock=scan->sock; if ( #ifdef SOCK_SSL sock->encrypted<2 && #endif !(sock->flags & SOCKET_DEAD)) { if (sock->flags & SOCKET_CONNECTING) { //A connecting socket if (sock->udp2w_infd) { //Its a 2 way UDP - if it had any data if (FD_ISSET(sock->udp2w_infd,&readers)) //Then send this to be processed. This will handle the //connection data if that is what is received socket_udp2way_read(sock,1); } else { //Nothing here for a UDP socket if (sock->protocol!=SOCKET_UDP) { //If it has a writer, we simply assume it is done and //the first write will fail. Not very efficient but //it works if (FD_ISSET(sock->fd,&writers)) { sock->flags &=~ SOCKET_CONNECTING; sock->flags |= SOCKET_CONNECTED; sock->flags |= SOCKET_DELAYED_NOW_CONNECTED; sock->connect_time=time(NULL); } } } } else if (sock->flags & SOCKET_CONNECTED) { //This is a connected socket, handle it if (sock->udp2w_infd) { //2 way UDP socket reader if (FD_ISSET(sock->udp2w_infd,&readers)) //Handle its special data socket_udp2way_read(sock,1); } else { if (FD_ISSET(sock->fd,&readers)) { //Any other socket, read it using the generic read function socket_read(sock); } } } } scan=scan->next; if (scan==list) scan=NULL; } //We're done, return how many sockets were affected return count; } //This is a wrapper function for processing one single socket. It makes it //into a socketlist of one entry, and sends it to the previous //function for handling. int socket_process(socketbuf *sock,long int timeout) { socket_processlist listofone; listofone.next=&listofone; listofone.prev=&listofone; listofone.sock=sock; return socket_process_sockets(&listofone,timeout); } //Wrapper function to create a unix socket. It is assumed that wait is the //required functionality socketbuf *socket_create_unix(const char *path) { return socket_create_unix_wait(path,1); } //Wrapper function to create a TCPIP socket. It is assumed that wait is the //required functionality socketbuf *socket_create_inet_tcp(const char *host,int port) { return socket_create_inet_tcp_wait(host,port,1); } //Create a tcpip socket on a specific IP address socketbuf *socket_create_inet_tcp_listener_on_ip(const char *localip,int port) { struct sockaddr_in sa; int dummy=0; char hostname[HOST_NAME_MAX+1]; struct hostent *hp; int fd; socketbuf *sock; struct in_addr inet_address; struct linger lingerval; #ifndef FIONBIO #ifdef O_NONBLOCK int flags; #endif #endif //set the hostname. If this is passed in, use that, otherwise use gethostname memset(&sa,0,sizeof(struct sockaddr_in)); if (localip) strcpy(hostname,localip); else gethostname(hostname,HOST_NAME_MAX); //Simply gethostbyname which handles all kinds of addresses hp=gethostbyname(hostname); if (!hp) //We couldnt resolve the host fail return 0; if (localip) { //Se specifically requested an IP address, so we use it, thus restricting //to just one interface. If we didnt specify the address then we skip //this section which in effect means that the socket will bind to all //IP addresses on the system memcpy((char *)&inet_address,hp->h_addr,sizeof(struct in_addr)); if (inet_address.s_addr!=-1) sa.sin_addr.s_addr=inet_address.s_addr; } sa.sin_family=hp->h_addrtype; sa.sin_port = htons(port); //Create the socket fd = socket(AF_INET,SOCK_STREAM,0); if (fd < 0) { //We couldnt create the socket! return 0; } dummy=1; //Set REUSEADDR so that if the system goes down it can go right //back up again. Otherwise it will block until all data is processed setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&dummy,sizeof(dummy)); //Linger so that data is sent when the socket closes lingerval.l_onoff=0; lingerval.l_linger=0; setsockopt(fd,SOL_SOCKET,SO_LINGER,(char *)&lingerval, sizeof(struct linger)); //set non-blocking #ifdef FIONBIO dummy=1; if (ioctl(fd,FIONBIO,&dummy)<0) { close(fd); return 0; } #else # ifdef O_NONBLOCK flags=fcntl(fd,F_GETFL,0); if (flags < 0) { close(fd); return 0; } else if (fcntl(fd,F_SETFL,flags|O_NONBLOCK) < 0) { close(fd); return 0; } # else # error no valid non-blocking method # endif #endif /*FIONBIO*/ //Now bind the socket to the port if (bind(fd,(struct sockaddr *)&sa,sizeof(sa))<0) { //We failed, maybe something else is already bound, maybe something //else, regardless, we're stuffed shutdown(fd,2); close(fd); return 0; } //Listen with the maximum number - this means we can have as many incoming //connections as the kernel is configured to handle (on the machine that //builds of course, it wont magically change itself from machine to machine) if (listen(fd,SOMAXCONN)<0) { shutdown(fd,2); close(fd); return 0; } //Finally create the socket datastruct to hold the socket sock=socket_create(fd); sock->protocol=SOCKET_TCP; sock->port=port; sock->flags |= (SOCKET_CONNECTED|SOCKET_LISTENER); sock->connect_time=time(NULL); return sock; } //Create a listener on ALL sockets socketbuf *socket_create_inet_tcp_listener(int port) { return socket_create_inet_tcp_listener_on_ip(NULL,port); } //Create a UDP listener socketbuf *socket_create_inet_udp_listener_on_ip(const char *localip,int port) { struct sockaddr_in sa; int dummy=0; char hostname[HOST_NAME_MAX+1]; struct hostent *hp; int fd; socketbuf *sock; struct in_addr inet_address; struct linger lingerval; #ifndef FIONBIO #ifdef O_NONBLOCK int flags; #endif #endif memset(&sa,0,sizeof(struct sockaddr_in)); //set the hostname. If this is passed in, use that, otherwise use gethostname if (localip) strcpy(hostname,localip); else gethostname(hostname,HOST_NAME_MAX); //Simply gethostbyname which handles all kinds of addresses hp=gethostbyname(hostname); if (!hp) //We couldnt resolve the host fail return 0; if (localip) { //We specifically requested an IP address, so we use it, thus restricting //to just one interface. If we didnt specify the address then we skip //this section which in effect means that the socket will bind to all //IP addresses on the system memcpy((char *)&inet_address,hp->h_addr,sizeof(struct in_addr)); if (inet_address.s_addr!=-1) sa.sin_addr=inet_address; } sa.sin_family=hp->h_addrtype; sa.sin_port = htons(port); //Create the socket fd = socket(PF_INET,SOCK_DGRAM,IPPROTO_IP); if (fd < 0) { //We couldnt create the socket! return 0; } lingerval.l_onoff=0; lingerval.l_linger=0; setsockopt(fd,SOL_SOCKET,SO_LINGER,(char *)&lingerval, sizeof(struct linger)); //Set non-blocking #ifdef FIONBIO dummy=1; if (ioctl(fd,FIONBIO,&dummy)<0) { close(fd); return 0; } #else # ifdef O_NONBLOCK flags=fcntl(fd,F_GETFL,0); if (flags < 0) { close(fd); return 0; } else if (fcntl(fd,F_SETFL,flags|O_NONBLOCK) < 0) { close(fd); return 0; } # else # error no valid non-blocking method # endif #endif /*FIONBIO*/ //Bind to the port if (bind(fd,(struct sockaddr *)&sa,sizeof(sa))<0) { //We failed, maybe something else is already bound, maybe something //else, regardless, we're stuffed shutdown(fd,2); close(fd); return 0; } //Finally create the socket datastruct to hold the socket sock=socket_create(fd); sock->protocol=SOCKET_UDP; sock->port=port; sock->flags |= (SOCKET_CONNECTED|SOCKET_LISTENER); sock->connect_time=time(NULL); return sock; } //A wrapper function to bind a UDP listener on all interfaces socketbuf *socket_create_inet_udp_listener(int port) { return socket_create_inet_udp_listener_on_ip(NULL,port); } //Create a unix socket listener. socketbuf *socket_create_unix_listener(const char *path) { int fd,dummy; socketbuf *sock; struct sockaddr_un sa; struct linger lingerval; //Create the socket fd = socket(PF_UNIX,SOCK_STREAM,0); if (fd < 1) //Socket creation failed return 0; //Set the socket types sa.sun_family = AF_UNIX; strcpy(sa.sun_path,path); //Set this to linger so any data being processed will be finished lingerval.l_onoff=0; lingerval.l_linger=0; setsockopt(fd,SOL_SOCKET,SO_LINGER,(char *)&lingerval, sizeof(struct linger)); //Set nonblocking #ifdef FIONBIO dummy=1; if (ioctl(fd,FIONBIO,&dummy)<0) { close(fd); return 0; } #else # ifdef O_NONBLOCK flags=fcntl(fd,F_GETFL,0); if (flags < 0) { close(fd); return 0; } else if (fcntl(fd,F_SETFL,flags|O_NONBLOCK) < 0) { close(fd); return 0; } # else # error no valid non-blocking method # endif #endif /*FIONBIO*/ //Now bind to the location if (bind(fd,(struct sockaddr *)&sa,sizeof(sa)) < 0) { //We failed. Maybe the file is already there... close(fd); return 0; } //Listen with the maximum number - this means we can have as many incoming //connections as the kernel is configured to handle (on the machine that //builds of course, it wont magically change itself from machine to machine) if (listen(fd,SOMAXCONN) < 0) { shutdown(fd,2); close(fd); unlink(path); return 0; } //Finally create the socket datastruct to hold the socket sock=socket_create(fd); sock->protocol=SOCKET_UNIX; sock->path=(char *)malloc(strlen(path)+1); strcpy(sock->path,path); sock->flags |= (SOCKET_CONNECTED|SOCKET_LISTENER); sock->connect_time=time(NULL); return sock; } //This is the function used by the calling program to see if any new //connections have come in on a listener socket socketbuf *socket_new(socketbuf *parent) { socketbuf *returnval; //Destroy any sockets that have died in the connection process. This doesnt //get them all, just the first ones, until the one at the front is a live. //This assumes that this function is called often, and so dead connections //are cleaned up regularly. while (parent->new_children && socket_dead(parent->new_children)) { returnval=parent->new_children; //Unlink the dead socket parent->new_children=parent->new_children->new_child_next; if (parent->new_children==returnval) { parent->new_children=NULL; returnval->new_child_next=NULL; returnval->new_child_prev=NULL; } else { returnval->new_child_next->new_child_prev=returnval->new_child_prev; returnval->new_child_prev->new_child_next=returnval->new_child_next; } //destroy it socket_destroy(returnval); } //Now look for new sockets if (parent->new_children) { returnval=parent->new_children; //Unlink the first socket from the list of new connections parent->new_children=parent->new_children->new_child_next; if (parent->new_children==returnval) { parent->new_children=NULL; returnval->new_child_next=NULL; returnval->new_child_prev=NULL; } else { returnval->new_child_next->new_child_prev=returnval->new_child_prev; returnval->new_child_prev->new_child_next=returnval->new_child_next; } //Now link it in to the list of connected children if (parent->connected_children) { returnval->connected_child_next=parent->connected_children; returnval->connected_child_prev= parent->connected_children->connected_child_prev; returnval->connected_child_prev->connected_child_next=returnval; returnval->connected_child_next->connected_child_prev=returnval; } else { parent->connected_children=returnval; returnval->connected_child_next=returnval; returnval->connected_child_prev=returnval; } //Return the new socket return returnval; } //No new connection return NULL; } //If the socket has just connected (fairly useless, legacy now) int socket_just_connected(socketbuf *sock) { if (sock->flags & SOCKET_DELAYED_NOW_CONNECTED) { sock->flags &=~ SOCKET_DELAYED_NOW_CONNECTED; return 1; } return 0; } //Return the portnumber int socket_get_port(socketbuf *sock) { return sock->port; } #ifdef DEBUG //Set debug mode on or off void socket_debug_off(socketbuf *sock) { sock->debug=0; } void socket_debug_on(socketbuf *sock) { sock->debug=1; } #endif //Return the time the socket connected time_t socket_connecttime(socketbuf *sock) { return sock->connect_time; } //Set a flag into the sockets mode. The only flag right now is sequential //and only applies to 2 way UDP sockets int socket_mode_set(socketbuf *sock,unsigned int mode) { sock->mode|=mode; return 1; } //Remove a flag from a socket int socket_mode_unset(socketbuf *sock,unsigned int mode) { sock->mode&=~mode; return 1; } //Get the sockets mode unsigned int socket_mode_get(socketbuf *sock) { return sock->mode; } const char *socket_host_get(socketbuf *sock) { return sock->host; } #ifdef SOCK_SSL void socket_set_encrypted(socketbuf *sock) { static int ssl_initialised=0; if (!ssl_initialised) { ssl_initialised=1; SSL_library_init(); SSL_load_error_strings(); } sock->encrypted=2; if (sock->flags & SOCKET_LISTENER) socket_set_listener_encrypted(sock); else if (sock->flags & SOCKET_INCOMING) socket_set_server_encrypted(sock); else socket_set_client_encrypted(sock); } void socket_set_server_key(socketbuf *sock,const char *keyfile) { sock->server_key_file=(char *)malloc(strlen(keyfile)+1); strcpy(sock->server_key_file,keyfile); } void socket_set_server_cert(socketbuf *sock,const char *certfile) { sock->server_cert_file=(char *)malloc(strlen(certfile)+1); strcpy(sock->server_cert_file,certfile); } void socket_set_client_ca(socketbuf *sock,const char *cafile) { sock->client_ca_file=(char *)malloc(strlen(cafile)+1); strcpy(sock->client_ca_file,cafile); } #endif //SOCK_SSL //This moves the buffers from one socket to another, MOVING it, not //copying it. This is not a simple task as it needs to take into //account all buffers in the UDP resend queue to! void socket_relocate_data(socketbuf *from,socketbuf *to) { socket_udp_rdata *scan,*target; //Transfer data in the resend queue to the new out queue. Do this first so it //goes back out in order while (from->udp2w_rdata_out) { scan=from->udp2w_rdata_out; target=scan; while (scan) { if (scan->packetnum < target->packetnum) target=scan; scan=scan->next; if (scan==from->udp2w_rdata_out) scan=NULL; } //Add this data to the out queue socket_write_reliable(to, target->data,target->length); //Now unlink that target from->udp2w_rdata_out=socket_rdata_delete(from->udp2w_rdata_out,target); } //Transfer the old outqueue to the new outqueue dynstringRawappend(to->outdata,(char *)(from->outdata->buf),from->outdata->len); from->outdata->len=0; //Transfer any unread inqueue to the new inqueue dynstringRawappend(to->indata,(char *)(from->indata->buf),from->indata->len); from->indata->len=0; //We're done return; } /**************************************************************************** ** Extention for 2-way and reliable UDP ** ** This is NOT generally compatable, you need to run this socket code ** ** at both ends ** ****************************************************************************/ //Send the connection message to a remote listener. This initialises the //session int socket_udp2way_connectmessage(socketbuf *sock) { int written; int datalen; socket_intchar intval; char buf[HOST_NAME_MAX+60+1+12]; //Now we construct new data to send //Data is as follows: //4 bytes: Protocol //4 bytes: Local portnumber //4 bytes: The length of the unique identifier string // : The unique identifier string // intval.i=htonl(SOCKET_UDP2W_PROTOCOL_CONNECTION); memcpy(buf,intval.c,4); intval.i=htonl(sock->udp2w_port); memcpy(buf+4,intval.c,4); datalen=strlen(sock->udp2w_unique); intval.i=htonl(datalen); memcpy(buf+8,intval.c,4); memcpy(buf+12,sock->udp2w_unique,datalen); //Send the data to the socket written=sendto(sock->fd, buf,12+datalen, MSG_DONTWAIT, (struct sockaddr *)&sock->udp_sa, sizeof(struct sockaddr_in)); if (written==-1) { if (errno!=EAGAIN) { //If the error is not EAGAIN, its dead sock->flags |= SOCKET_DEAD; return 0; } } //Return the number of bytes sent return written; } //This is sent as a reply, the connectmessage has been received, now we need to //acknowledge it static int socket_udp2way_connectmessage_reply(socketbuf *sock) { int written; socket_intchar val; char buf[4]; //Now we construct new data to send //4 bytes : protocol val.i=htonl(SOCKET_UDP2W_PROTOCOL_CONNECTION); memcpy(buf,val.c,4); //Send the data written=sendto(sock->fd, buf,4, MSG_DONTWAIT, (struct sockaddr *)&sock->udp_sa, sizeof(struct sockaddr_in)); if (written==-1) { if (errno!=EAGAIN) { //This is a fatal error, kill the socket sock->flags |= SOCKET_DEAD; return 0; } } return written; } //This function creates a 2 way UDP socket connection to a remote host socketbuf *socket_create_inet_udp2way_wait(const char *host,int port,int wait) { socketbuf *sock,*insock; int inport; struct timeval time_now; char hostname[HOST_NAME_MAX+1]; //Simply - we create a socket outbound sock=socket_create_inet_udp_wait(host,port,wait); if (!sock) return 0; //Now create a listener, NOT on the same port but on a port that is //as close as we can make it. We dont do it on the same port as it is //possible that in a failover condition, the main socket may be bound //later, causing inability to failover servers insock=NULL; inport=port; while (!insock) { inport++; //Create a listener on the new socket insock=socket_create_inet_udp_listener(inport); } //We now have 2 socketbufs, but we really only want one - lets take the //actual inbound socket and put it in the first sockets data, then kill //the second set of data sock->udp2w_infd=insock->fd; sock->udp2w_port=inport; sock->udp2w=1; sock->udp2w_averound=2500000; /*Set it for a sloooooow network, it will modify itself if the network shows it is faster*/ sock->udp2w_lastmsg=time(NULL); insock->fd=0; //Get rid of the unused listener data struct socket_destroy(insock); sock->flags|=SOCKET_CONNECTING; sock->flags&=~SOCKET_CONNECTED; //Send the init data //We CANNOT wait for the response, or it will never get there if the //client and server run on the same thread //Now we set a unique value, as we use UDP, so the other side knows WHO //is connecting gethostname(hostname,HOST_NAME_MAX); gettimeofday(&time_now,NULL); //Create a unique name for this client. This will be unique anywhere unless //you have 2 connections on the same machine in the same microsecond. Pretty //fullproof I reckon sprintf(sock->udp2w_unique,"%s-%ld.%ld",hostname, time_now.tv_sec,time_now.tv_usec); //Send the connect protocol message to the remote server socket_udp2way_connectmessage(sock); return sock; } //Create the 2 way listener on a specific IP address socketbuf *socket_create_inet_udp2way_listener_on_ip(const char *localip, int port) { socketbuf *sock; //Create the basic UDP listener sock=socket_create_inet_udp_listener_on_ip(localip,port); //All we do extra is the 2 way UDP specific values if (sock) { sock->udp2w=1; sock->udp2w_averound=2500000; sock->udp2w_lastmsg=time(NULL); } return sock; } //Wrapper function, to set a 2 way UDP listener bound to all interfaces socketbuf *socket_create_inet_udp2way_listener(int port) { return socket_create_inet_udp2way_listener_on_ip(NULL,port); } //This function takes a bit of explaining. //UDP always sends data to the 'listener' socket, not to a socket specific to //the user. This means that all data comes in to the one socket and then needs //to be associated with a socket for THAT user //So, each packet contains the IP address and the portnumber of the sender //which allows unique identification. This function looks at all sockets //that are children of the listener, and finds the one that matches the host //and the portnumber of the sender. static socketbuf *socket_get_child_socketbuf(socketbuf *sock, char *host,int port) { socketbuf *scan; scan=sock->new_children; while (scan) { if (!strcmp(scan->host,host) && scan->port==port && !socket_dead(scan)) return scan; scan=scan->new_child_next; if (scan==sock->new_children) scan=NULL; } scan=sock->connected_children; while (scan) { if (!strcmp(scan->host,host) && scan->port==port && !socket_dead(scan)) return scan; scan=scan->connected_child_next; if (scan==sock->connected_children) scan=NULL; } return NULL; } //This works in the same way as above, but instead of using the //hostname it uses the sockaddr_in function as its host comparison. It //works in the same way but is slightly quicker as it uses an integer //== operation instead of a strcmp static socketbuf *socket_get_child_socketbuf_sa(socketbuf *sock, struct sockaddr_in *sa, int port) { socketbuf *scan; scan=sock->new_children; while (scan) { if (scan->udp_sa.sin_addr.s_addr==sa->sin_addr.s_addr && scan->port==port && !socket_dead(scan)) return scan; scan=scan->new_child_next; if (scan==sock->new_children) scan=NULL; } scan=sock->connected_children; while (scan) { if (scan->udp_sa.sin_addr.s_addr==sa->sin_addr.s_addr && scan->port==port && !socket_dead(scan)) return scan; scan=scan->connected_child_next; if (scan==sock->connected_children) scan=NULL; } return NULL; } //This function is called when a 2 way UDP connection is received. This //means that we need to find out if we are already connected, and then //connect back to them if we arent. We must also allow for the fact that //someone may reconnect when we THINK they are already connected static socketbuf *socket_udp2way_listener_create_connection(socketbuf *sock, struct sockaddr_in *sa, size_t sa_len, int port, char *unique) { int fd,dummy; socketbuf *returnval,*oldreturnval; char host[20]; #ifndef FIONBIO # ifdef O_NONBLOCK int flags; # endif #endif //Create an outgoing socket back to the originator //Find their IP address inet_ntop(AF_INET,(void *)(&sa->sin_addr),host,19); //Find if anyone else is connected to this listener from that port returnval=socket_get_child_socketbuf(sock,host,port); //Note if we have no match already connected, this whole loop will not //start oldreturnval=0; while (returnval && returnval!=oldreturnval) { //We loop here onthe highly unlikely chance we already have 2 //connections from the same port. This is impossible but just in case, //its a negligable overhead to be sure oldreturnval=returnval; /*First, check if we are already connected to THIS one*/ if (returnval->udp2w_unique && strcmp(returnval->udp2w_unique,unique)) { //This is a different one, mark THAT one as dead, cos we cant //have 2 sockets coming from the same place, its impossible. The old //one must be dead returnval->flags |= SOCKET_DEAD; } returnval=socket_get_child_socketbuf(sock,host,port); } //We have no match, so we create a new outbound. NOTE: this means if the same //connection was made more than once, the socket is not duplicated if (!returnval) { //Create the socket fd=socket(PF_INET,SOCK_DGRAM,IPPROTO_IP); if (fd<1) //No socket, no way to procede return 0; //Create the socketbuf around the fd returnval=socket_create(fd); //Set the udp_sa so we have an identifier for the other end memset(&returnval->udp_sa,0,sizeof(struct sockaddr_in)); //Set the destination returnval->udp_sa.sin_family=AF_INET; returnval->udp_sa.sin_port=htons(port); returnval->udp_sa.sin_addr.s_addr=sa->sin_addr.s_addr; //Set the 2 way UDP stuff returnval->protocol=SOCKET_UDP; returnval->udp2w=1; returnval->udp2w_averound=2500000; returnval->udp2w_lastmsg=time(NULL); strcpy(returnval->udp2w_unique,unique); returnval->mode=sock->mode; //Record the hostname too returnval->host=(char *)malloc(strlen(host)+1); strcpy(returnval->host,host); returnval->port=port; //Set non-blocking, so we can check for a data without freezing #ifdef FIONBIO dummy=1; if (ioctl(fd,FIONBIO,&dummy)<0) { close(fd); return 0; } #else # ifdef O_NONBLOCK flags=fcntl(fd,F_GETFL,0); if (flags<0) { close(fd); return 0; } if (fcntl(fd,F_SETFL,flags|O_NONBLOCK)<0) { close(fd); return 0; } # else # error No valid non-blocking method - cannot build; # endif // O_NONBLOCK #endif //FIONBIO //Set the flags to connected returnval->flags |= (SOCKET_CONNECTED|SOCKET_INCOMING); returnval->parent=sock; //Link this in to the new children list as it needs to be acknowledged //by the calling program if (sock->new_children) { returnval->new_child_next=sock->new_children; returnval->new_child_prev=returnval->new_child_next->new_child_prev; returnval->new_child_next->new_child_prev=returnval; returnval->new_child_prev->new_child_next=returnval; } else { returnval->new_child_next=returnval; returnval->new_child_prev=returnval; sock->new_children=returnval; } returnval->connect_time=time(NULL); } //Send the reply to acknowledge the connection socket_udp2way_connectmessage_reply(returnval); return returnval; } //This function acknowledges the sending of a reliable data packet. This will //tell the sender that the packet has been accepted and can now be dropped. //If the sender does not receive this by the time the packet resend comes //around, the packet will be resent. static int socket_acknowledge_listener_udp_rpacket(socketbuf *sock, int packetnumber) { int written; socket_intchar intval; char buf[8]; //Now we construct new data to send //4 bytes: Protocol //4 bytes: Packet number intval.i=htonl(SOCKET_UDP2W_PROTOCOL_RCONFIRM); memcpy(buf,intval.c,4); intval.i=htonl(packetnumber); memcpy(buf+4,intval.c,4); //Send to the socket written=sendto(sock->fd, buf,8, MSG_DONTWAIT, (struct sockaddr *)&sock->udp_sa, sizeof(struct sockaddr_in)); if (written==-1) { if (errno!=EAGAIN) { //If the send fails, the socket dies sock->flags |= SOCKET_DEAD; return 0; } } return written; } //This function handles all incoming data sent to a listener socket //from a client. int socket_udp2way_listener_data_process(socketbuf *sock, struct sockaddr_in *sa, size_t sa_len, signed char *buf,int datalen) { socket_intchar len,val; socket_udp_rdata *oldpacket,*packet; socketbuf *client; int type,port,packetnumber,uniquelen; char unique[HOST_NAME_MAX+60+1]; struct timeval time_now; //There must always be at least 4 bytes, that is a protocol header if (datalen<4) return 0; memcpy(val.c,buf,4); type=ntohl(val.i); //We have the protocol if (type==SOCKET_UDP2W_PROTOCOL_CONNECTION) { //New connection messages need 12 bytes minimum //4 Bytes : Protocol //4 Bytes : Port number //4 Bytes : Length of the unique identifier // : Unique identifier if (datalen<12) return 0; memcpy(val.c,buf+4,4); //Now get the unique connection ID that we have memcpy(len.c,buf+8,4); uniquelen=ntohl(len.i); memcpy(unique,buf+12,uniquelen); unique[uniquelen]=0; //Now call the creat connection function to handle this message socket_udp2way_listener_create_connection(sock,sa,sa_len,ntohl(val.i), unique); return 1; } if (type==SOCKET_UDP2W_PROTOCOL_DATA ) { //This is user data, it is NOT reliable so we just take it and use //it // 4 bytes : protocol // 4 bytes : originating port // : data //This doesnt go on the listeners inbound, it goes on the clients //Get the port as the next byte memcpy(val.c,buf+4,4); port=ntohl(val.i); //Locate the client from the ones connected to this listener client=socket_get_child_socketbuf_sa(sock,sa,port); if (client) { //Note that this client has received a message - helps timeouts client->udp2w_lastmsg=time(NULL); //Store the data in this clients incoming data stream len.i=datalen-8; dynstringRawappend(client->indata,len.c,4); dynstringRawappend(client->indata,(char *)buf+8,datalen-8); } return 1; } if (type==SOCKET_UDP2W_PROTOCOL_RDATA ) { //This is a RELIABLE data packet and requires handling specially // 4 bytes : protocol // 4 bytes : originating port // 4 bytes : packet number // : data //This doesnt go on the listeners inbound, it goes on the clients if (datalen<8) return 0; //Get the port as the next byte memcpy(val.c,buf+4,4); port=ntohl(val.i); //Locate the client associated with this message client=socket_get_child_socketbuf_sa(sock,sa,port); if (client) { //Note that this client has received a message - helps timeouts client->udp2w_lastmsg=time(NULL); //get the packet number memcpy(val.c,buf+8,4); packetnumber=ntohl(val.i); //The packet number is important. The packets may need to be //stored in sequence. It may also be a packet we have had before, //as the acknowledgement does not always make it back. //We have in the socketbuf the next packet number we are expecting, //all packets earlier than this have been processed and forgotten if (packetnumber==client->udp2w_rinpacket) { client->udp2w_rinpacket++; //Its the correct next packet - we can just send it to the buffer len.i=datalen-12; dynstringRawappend(client->indata,len.c,4); dynstringRawappend(client->indata,(char *)buf+12, datalen-12); } else if (packetnumberudp2w_rinpacket) { //We've already got this one, ignore it } else if (socket_rdata_locate_packetnum(client->udp2w_rdata_in, packetnumber)) { //This packet is one we have received and wating to be processed } else { //This is one we dont have yet, and we also dont have its //predecessor, //There are 2 ways to handle this: // 1) Sequential mode: // We add it onto a queue and wait for the previous ones // 2) Non-sequential mode: // We deal with it now, but add it to the list anyway, so // we know its been dealt with. if (!(client->mode & SOCKET_MODE_UDP2W_SEQUENTIAL)) { //We store the packet, we note that it HAS been sent, so we //can switch between sequential and non-sequential modes //without losing track of the packets we've already processed client->udp2w_rdata_in=rdata_allocate(client->udp2w_rdata_in, packetnumber, (char *)(buf+12), datalen-12,1); //We arent sequential, so we just send it to the out buffer len.i=datalen-12; dynstringRawappend(client->indata,len.c,4); dynstringRawappend(client->indata,(char *)buf+12, datalen-12); } else //We are sequential, so all we do is add it to the list for //later handling client->udp2w_rdata_in=rdata_allocate(client->udp2w_rdata_in, packetnumber, (char *)(buf+12), datalen-12,0); } //we may have now got a series of packets we can send, or at least //get rid of. So, we test this. //Check the next accepted packet is not on the received list oldpacket=socket_rdata_locate_packetnum(client->udp2w_rdata_in, client->udp2w_rinpacket); while (oldpacket) { if (oldpacket->sent) { //We are sequential, so this hasnt been sent yet len.i=oldpacket->length; dynstringRawappend(client->indata,len.c,4); dynstringRawappend(client->indata,oldpacket->data, oldpacket->length); } //Now its 'in the past' delete it client->udp2w_rdata_in= socket_rdata_delete(client->udp2w_rdata_in, oldpacket); //Incriment the packet number client->udp2w_rinpacket++; //try the next! oldpacket=socket_rdata_locate_packetnum(client->udp2w_rdata_in, client->udp2w_rinpacket); } //acknowledge the packet we have just received socket_acknowledge_listener_udp_rpacket(client,packetnumber); } return 1; } if (type==SOCKET_UDP2W_PROTOCOL_RCONFIRM ) { //This is the confirmation of a packet we sent in reliable mode // 4 bytes : protocol // 4 bytes : priginating port // 4 bytes : packet number //This doesnt confirm on the listeners port, but on the clients if (datalen<8) return 0; //Get the port as the next byte memcpy(val.c,buf+4,4); port=ntohl(val.i); //Locate the client associated with this client=socket_get_child_socketbuf_sa(sock,sa,port); if (client) { //Record their link is active client->udp2w_lastmsg=time(NULL); //Comes with a packet number memcpy(val.c,buf+8,4); packetnumber=ntohl(val.i); //Locate this packet in the list of packets we are remembering to //resend packet=socket_rdata_locate_packetnum(client->udp2w_rdata_out, packetnumber); if (packet) { //rebalance the timings for knowing when to resend client->udp2w_averound=(long long)(client->udp2w_averound*0.9); gettimeofday(&time_now,NULL); client->udp2w_averound+= ((time_now.tv_sec-packet->sendtime.tv_sec)*1000000); client->udp2w_averound+= (time_now.tv_usec-packet->sendtime.tv_usec); //We've not already been told of the receipt, so delete it client->udp2w_rdata_out= socket_rdata_delete(client->udp2w_rdata_out, packet); } } return 1; } if (type==SOCKET_UDP2W_PROTOCOL_PING) { //This is a ping packet, low level 'keep the socket alive' protocol // 4 bytes : protocol // 4 bytes : originating portnumber if (datalen<8) return 0; //Get the port as the next byte memcpy(val.c,buf+4,4); port=ntohl(val.i); //Find the correct client client=socket_get_child_socketbuf_sa(sock,sa,port); if (client) { //Note we have received something client->udp2w_lastmsg=time(NULL); } return 1; } return 1; } //This function acknowledges the sending of a reliable data packet. This will //tell the sender that the packet has been accepted and can now be dropped. //If the sender does not receive this by the time the packet resend comes //around, the packet will be resent. static int socket_acknowledge_reader_udp_rpacket(socketbuf *sock,int packetnumber) { int written; socket_intchar intval; char buf[12]; //Now we construct new data to send //4 bytes: Protocol //4 bytes: Our portnumber //4 bytes: Packet number intval.i=htonl(SOCKET_UDP2W_PROTOCOL_RCONFIRM); memcpy(buf,intval.c,4); intval.i=htonl(sock->udp2w_port); memcpy(buf+4,intval.c,4); intval.i=htonl(packetnumber); memcpy(buf+8,intval.c,4); //Send to the socket written=sendto(sock->fd, buf,12, MSG_DONTWAIT, (struct sockaddr *)&sock->udp_sa, sizeof(struct sockaddr_in)); if (written==-1) { if (errno!=EAGAIN) { //If the send fails, the socket dies sock->flags |= SOCKET_DEAD; return 0; } } return written; } //This is VERY similar to the listener reading, except as the data can ONLY //come from the other end of THIS socket (we are the client) then we dont //need the portnumber int socket_udp2way_reader_data_process(socketbuf *sock, signed char *buf,int datalen) { socket_intchar len,val; int type; socket_udp_rdata *packet,*oldpacket; int packetnumber; struct timeval time_now; //There must always be at least 4 bytes, that is a protocol header if (datalen<4) return 0; memcpy(val.c,buf,4); type=ntohl(val.i); //We have the protocol if (type==SOCKET_UDP2W_PROTOCOL_CONNECTION) { //The server has acknowledged our connection, no more needed, we are //connected sock->flags&=~SOCKET_CONNECTING; sock->flags|=SOCKET_CONNECTED; return 1; } if (type==SOCKET_UDP2W_PROTOCOL_DATA ) { //This is user data, it is NOT reliable so we just take it and use //it //Add it to the users data buffer len.i=datalen-4; dynstringRawappend(sock->indata,len.c,4); dynstringRawappend(sock->indata,(char *)buf+4,datalen-4); return 1; } if (type==SOCKET_UDP2W_PROTOCOL_RDATA ) { //This is a RELIABLE data packet and requires handling specially // 4 bytes : protocol // 4 bytes : packet number // : data //Comes with a packet number memcpy(val.c,buf+4,4); packetnumber=ntohl(val.i); //The packet number is important. The packets may need to be //stored in sequence. It may also be a packet we have had before, //as the acknowledgement does not always make it back. //We have in the socketbuf the next packet number we are expecting, //all packets earlier than this have been processed and forgotten if (packetnumber==sock->udp2w_rinpacket) { //Its the correct next packet - we can just send it to the buffer sock->udp2w_rinpacket++; len.i=datalen-8; dynstringRawappend(sock->indata,len.c,4); dynstringRawappend(sock->indata,(char *)buf+8,datalen-8); } else if (packetnumberudp2w_rinpacket) { //We've already got this one, do nothing } else if (socket_rdata_locate_packetnum(sock->udp2w_rdata_in, packetnumber)) { //This is one we already have in the queue - do nothing } else { //This is one we dont have yet, and we also dont have its //predecessor, //There are 2 ways to handle this: // 1) Sequential mode: // We add it onto a queue and wait for the previous ones // 2) Non-sequential mode: // We deal with it now, but add it to the list anyway, so // we know its been dealt with. if (!(sock->mode & SOCKET_MODE_UDP2W_SEQUENTIAL)) { //We store the packet, we note that it HAS been sent, so we //can switch between sequential and non-sequential modes //without losing track of the packets we've already processed sock->udp2w_rdata_in=rdata_allocate(sock->udp2w_rdata_in, packetnumber, (char *)(buf+8), datalen-8,1); //We arent sequential, so we just send it to the out buffer len.i=datalen-8; dynstringRawappend(sock->indata,len.c,4); dynstringRawappend(sock->indata,(char *)buf+8,datalen-8); } else //We are sequential, so all we do is add it to the list for //later handling sock->udp2w_rdata_in=rdata_allocate(sock->udp2w_rdata_in, packetnumber, (char *)(buf+8), datalen-8,0); } //we may have now got a series of packets we can send, or at least //get rid of. So, we test this. //Check the next accepted packet is not on the received list oldpacket=socket_rdata_locate_packetnum(sock->udp2w_rdata_in, sock->udp2w_rinpacket); while (oldpacket) { if (!oldpacket->sent) { //We are sequential, so this hasnt been sent yet len.i=oldpacket->length; dynstringRawappend(sock->indata,len.c,4); dynstringRawappend(sock->indata,oldpacket->data, oldpacket->length); } //Now its 'in the past' delete it sock->udp2w_rdata_in=socket_rdata_delete(sock->udp2w_rdata_in, oldpacket); //Incriment the packet number sock->udp2w_rinpacket++; //try the next! oldpacket=socket_rdata_locate_packetnum(sock->udp2w_rdata_in, sock->udp2w_rinpacket); } //acknowledge the packet we have just received socket_acknowledge_reader_udp_rpacket(sock,packetnumber); return 1; } if (type==SOCKET_UDP2W_PROTOCOL_RCONFIRM ) { //This is the confirmation of a packet we sent in reliable mode // 4 bytes : protocol // 4 bytes : packet number //Comes with a packet number memcpy(val.c,buf+4,4); packetnumber=ntohl(val.i); //Locate this packet in the list of packets we are remembering to //resend packet=socket_rdata_locate_packetnum(sock->udp2w_rdata_out, packetnumber); if (packet) { //rebalance the timings, so we know better when to resend sock->udp2w_averound=(long long)(sock->udp2w_averound*0.9); gettimeofday(&time_now,NULL); sock->udp2w_averound+= ((time_now.tv_sec-packet->sendtime.tv_sec)*1000000); sock->udp2w_averound+=(time_now.tv_usec-packet->sendtime.tv_usec); //We've not already been told of the receipt, so delete it sock->udp2w_rdata_out=socket_rdata_delete(sock->udp2w_rdata_out, packet); } return 1; } if (type==SOCKET_UDP2W_PROTOCOL_PING) { //This has already done its job by making something happen on the link return 1; } return 1; } pong2-0.1.3/src/grapple/grapple_client_internal.h0000644000175000001440000000177310473646146016756 00000000000000/* Grapple - A fully featured network layer with a simple interface Copyright (C) 2006 Michael Simms This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Michael Simms michael@linuxgamepublishing.com */ #ifndef GRAPPLE_CLIENT_INTERNAL_H #define GRAPPLE_CLIENT_INTERNAL_H #include "grapple_structs.h" #endif pong2-0.1.3/src/Server.cpp0000644000175000001440000001764011102253271012220 00000000000000#include #include #include "Server.hpp" #include "Client.hpp" #include "Buffer.hpp" Server::Server(void *surf, const Configuration& conf) : Framework(surf, conf, UNINITIALIZED), ballouttimer(-1), ballspeed(6.0) { ball.push_back(Ball(this)); player.push_back(new Player(this, "Mr. Wand", BACK, field.getLength()/2.0f)); // Mr. Wand is cheating! player[0]->setSize(3.5, 3.5); // ***************** player[0]->run(); resetScore(); output.addMessage(Interface::WAITING_FOR_OPPONENT); server = initNetwork(conf.version, conf.playername, conf.port); loopback = Client::initNetwork(conf.version, "localhost", conf.port, conf.playername); if (server == -1 || loopback == -1) shutdown(); loop(); } Server::~Server() { grapple_server_destroy(server); exit(0); } grapple_server Server::initNetwork(const std::string& version, const std::string& name, const unsigned short port) { grapple_server server = grapple_server_init("Pong2", version.c_str()); grapple_server_sequential_set(server, GRAPPLE_NONSEQUENTIAL); grapple_server_port_set(server, port); grapple_server_protocol_set(server, GRAPPLE_PROTOCOL_UDP); grapple_server_maxusers_set(server, 2); grapple_server_session_set(server, name.c_str()); grapple_server_start(server); //grapple_server_autoping(server, 5.0); grapple_error error = grapple_server_error_get(server); if (error != GRAPPLE_NO_ERROR) { std::cerr << "Error starting the client: " << grapple_error_text(error) << std::endl; return -1; } return server; } void Server::movePaddle(double x, double y, unsigned int time) { if (state == UNINITIALIZED) return; // we move it ourselves.. the client will report it to the server Player* player = peer[localid].player; player->move(x, y, time); if (state == RUNNING) { Vec2f pos = player->getPosition(); Buffer sbuf(PADDLEPOSITION); sbuf.pushId(localid); sbuf.pushDouble(pos.y); sbuf.pushDouble(pos.x); sendPacket(sbuf, false); } } void Server::updateGame(int ticks) { if (paused == 0) { ball[0].move(ticks); if (state == RUNNING) { Buffer sbuf(BALLPOSITION); const Vec3f& pos = ball[0].getPosition(); sbuf.pushDouble(pos.x); sbuf.pushDouble(pos.y); sbuf.pushDouble(pos.z); sendPacket(sbuf, false); } } } void Server::resetScore() { round = 0; score[0] = score[1] = 0; output.updateRound(0); output.updateScore(FRONT, 0); output.updateScore(BACK, 0); } void Server::doScore(Side side) { if (ballouttimer == -1) { // we didn't process it already if (side == BACK) { score[0]++; output.updateScore(FRONT, score[0]); output.addMessage(Interface::FLASH_YOU_WIN); } else { score[1]++; output.updateScore(BACK, score[1]); output.addMessage(Interface::FLASH_YOU_LOST); } if (state == RUNNING) { Buffer sbuf(SCORE); sbuf.pushSide(side); if (side == BACK) sbuf.pushInt(score[0]); else sbuf.pushInt(score[1]); sendPacket(sbuf, true); } output.updateRound(++round); if (state == RUNNING) { Buffer sbuf(ROUND); sbuf.pushInt(round); sendPacket(sbuf, true); } ballouttimer = addTimer(1000, BALLOUT, this); ball[0].shrink(1000); } } void Server::serveBall() { output.removeMessage(Interface::YOU_SERVE); peer[localid].player->detachBall(ballspeed); } void Server::action(Event event) { if (event == BALLOUT) { std::cout << "********************************************" << std::endl; /* Mr. Wand isn't as good in serving as he is in bouncing the ball So as long the game is not running yet, it's always the user who serves */ if ((state == RUNNING)&&((int)floor(round / 5.0) % 2 == 0)) { Buffer sbuf(SERVE_BALL); for (std::map::iterator i = peer.begin(); i != peer.end(); ++i) { if ((*i).second.player->getSide() == BACK) { sbuf.pushId((*i).first); (*i).second.player->attachBall(&ball[0]); break; } } sendPacket(sbuf, true); } else { output.addMessage(Interface::YOU_SERVE); peer[localid].player->attachBall(&ball[0]); if (state == RUNNING) { Buffer sbuf(SERVE_BALL); sbuf.pushId(localid); sendPacket(sbuf, true); } } removeTimer(ballouttimer); ballouttimer = -1; } } // the client sends the ping void Server::ping() {} void Server::doNetworking() { grapple_message *message; while (grapple_server_messages_waiting(server)) { message = grapple_server_message_pull(server); switch (message->type) { case GRAPPLE_MSG_NEW_USER: peer[message->NEW_USER.id] = Peer(grapple_server_client_address_get(server, message->NEW_USER.id)); std::cerr << "client connected from " << peer[message->NEW_USER.id].name << std::endl; break; case GRAPPLE_MSG_USER_NAME: peer[message->USER_NAME.id].name = message->USER_NAME.name; break; case GRAPPLE_MSG_USER_MSG: { grapple_user id = message->USER_MSG.id; Buffer buf((char*)message->USER_MSG.data, message->USER_MSG.length); switch (buf.getType()) { case READY: peer[id].ready = true; if (peer.size() > 1) { bool ready = true; for (std::map::iterator i = peer.begin(); i != peer.end(); ++i) { if (!(*i).second.ready) { ready = false; break; } } if (ready) startGame(); } break; case PADDLEMOVE: { unsigned int time = buf.popInt(); peer[id].player->move(buf.popDouble(), buf.popDouble(), time); Vec2f pos = peer[id].player->getPosition(); Buffer sbuf(PADDLEPOSITION); sbuf.pushId(id); sbuf.pushDouble(pos.y); sbuf.pushDouble(pos.x); sendPacket(sbuf, false); } break; case SERVE_BALL: peer[id].player->detachBall(ballspeed); break; case PAUSE_REQUEST: togglePause(true, true); std::cout << "Player " << peer[id].name << " paused the game." << std::endl; break; case RESUME_REQUEST: togglePause(false, true); std::cout << "Player " << peer[id].name << " resumed the game." << std::endl; break; } break; } case GRAPPLE_MSG_USER_DISCONNECTED: std::cout << "Player " << peer[message->USER_DISCONNECTED.id].name << " disconnected!" << std::endl; shutdown(); break; } grapple_message_dispose(message); } while (grapple_client_messages_waiting(loopback)) { message=grapple_client_message_pull(loopback); switch (message->type) { case GRAPPLE_MSG_NEW_USER_ME: { localid = message->NEW_USER.id; peer[localid].player = new Player(this, peer[localid].name, FRONT, field.getLength()/2.0f); player.push_back(peer[localid].player); peer[localid].player->attachBall(&ball[0]); output.addMessage(Interface::YOU_SERVE); peer[localid].ready = true; state = WAITING; } break; } grapple_message_dispose(message); } } void Server::startGame() { output.removeMessage(Interface::WAITING_FOR_OPPONENT); resetScore(); // it could be we are serving at this moment output.removeMessage(Interface::YOU_SERVE); player[0]->detachBall(0.0); // create new players delete player[0]; delete player[1]; player.clear(); for (std::map::iterator i = peer.begin(); i != peer.end(); ++i) { Side side = (i->first == localid ? FRONT : BACK); i->second.player = new Player(this, i->second.name, side, field.getLength()/2.0f); player.push_back(i->second.player); i->second.player->run(); } // now we are up & .. state = RUNNING; sendSimplePacket(READY); // reset ball in a cool way output.addMessage(Interface::FLASH_GAME_STARTED); ballouttimer = addTimer(10, BALLOUT, this); // tell pause state if (paused) sendSimplePacket(PAUSE_REQUEST); else sendSimplePacket(RESUME_REQUEST); // tell our initial position Vec2f pos = peer[localid].player->getPosition(); Buffer sbuf(PADDLEPOSITION); sbuf.pushId(localid); sbuf.pushDouble(pos.y); sbuf.pushDouble(pos.x); sendPacket(sbuf, false); } void Server::sendPacket(Buffer& data, bool reliable) { grapple_server_send(server, GRAPPLE_EVERYONE, reliable * GRAPPLE_RELIABLE, data.getData(), data.getSize()); } pong2-0.1.3/src/Player.hpp0000644000175000001440000001026710473646146012232 00000000000000#ifndef PLAYER_H #define PLAYER_H #include #include "stuff.hpp" #include "Ball.hpp" #include "grapple/grapple.h" class Framework; //! Player with paddle /* Describes a player with name and score in the game, who controls a paddle, which is also fully included into this class. */ class Player : EventReceiver { public: //! The constructor /*! \param control the game's Framework (ie Server or Client) object \param nick the player's name \param where wether the paddle is in the FRONT or in the BACK \param z the absolute Z coordinate of the paddle; normally half of the field width */ Player(Framework* control, const std::string& nick, Side where, double z); //! The destructor ~Player(); //! create necessary timer(s) /*! does what can't be done while the object is on the stack */ void run(); //! returns the player name inline const std::string& getName() { return name; } //! returns FRONT or BACK inline Side getSide() { return side; } //! returns the actual position on the X and Y axis inline Vec2f getPosition() { return Vec2f(position.x, position.y); } inline grapple_user getID() { return id; } //! set a new name inline void setName(const std::string& nick) { name = nick; } //! set the paddle size /*! used to let Mr. Wand cheat \param w width of the paddle \param h height of the paddle */ void setSize(double w, double h); //! set the paddle position /*! On the Client side the paddle doesn't move itself. \param x position coordinate \param y position coordinate */ void setPosition(double x, double y); //! move as desired by the user /*! This will test for barrieres and also against the maximum allowed speed of the paddle \param x relative desired X movement \param y relative desired Y movement \param time actual timestamp in ticks (ms) for speed calculations */ void move(double x, double y, unsigned int time); //! draw the paddle using GL functions void draw(); //! test for collisions of a ball against the paddle /*! \param bposition the position to test for \param bspeed the speed of the ball flying \param radius the ball's radius \result pointer to a Collision structure which provides the according data, NULL if there was no collision */ Collision* detectCol(const Vec3f& bposition, const Vec3f& bspeed, double radius); //! process a timer triggered event /*! \param event the event descriptor */ void action(Event event); //! attach a Ball to the paddle /*! The ball is attached and moves along with the paddle until the player decides to release it. The paddle will tell the Ball to set it's position whenever it moves. The Ball's speed vector is set to 0, 0, 0 to prevent it from moving itself. \param ball pointer to the ball to attach */ void attachBall(Ball* ball); //! release any attached Ball /*! The ball will be released giving it new speed values determined by the paddle's own speed. \param zSpeed the Z axis speed to give to the ball on detaching */ void detachBall(double zSpeed); private: //! "slow down" the paddle /*! As the paddle isn't really moved with a speed (so the paddle doesn't have to slow down first when the user changes the movement direction) there is a speed value calculated from the last move. This value is the maximum of the stored speed and the new speed. Using a timer which cales decelerate(), the stored speed falls down continuously. */ void decelerate(); //! the maximum possible paddle movement speed double maxspeed; //! pointer to the game's Framework (ie Server or Client) object Framework* framework; //! player nickname std::string name; //! wether the paddle is in the FRONT or in the BACK Side side; //! the position; saving both the dynamic X, Y coords and the predefined Z coord Vec3f position; //! speed, reasonably only X and Y Vec2f speed; //! width and height of the paddle double width, height; //! how thick the paddle is (bending) double thickness; //! timer used to decelerate int deceltimer; //! GL displaylist descriptor int displist; //! pointer to a Ball object ready to serve, if there is none, NULL Ball* attachedBall; //! timestamp in ticks of the last movement unsigned int lastmove; grapple_user id; }; #endif pong2-0.1.3/src/Field.hpp0000644000175000001440000000310010473646146012005 00000000000000#ifndef FIELD_H #define FIELD_H #include "stuff.hpp" #include class Framework; //! The playing field. /*! Holds the fields constraints, calculates Collisions and wether the ball is inside or not. Provides a function to render the walls. */ class Field { public: //! The constructor /*! \param control the game's Framework (ie Server or Client) object */ Field(Framework *control); //! test for collisions of a ball against the field walls /*! \param position the position to test for \param speed the speed of the ball flying \param radius the ball's radius \result pointer to a Collision structure which provides the according data, NULL if there was no collision */ Collision* detectCol(const Vec3f& position, const Vec3f& speed, double radius); //! test wether the ball is inside of the field /*! called by the global collision detector to become aware of a score \param z the ball's position on the Z axis \result FRONT or BACK if the ball is outside, otherwise NONE */ Side zOutside(double z); //! draw the field using GL void draw(); //! return a field's constraint inline double getWidth() { return width; } //! return a field's constraint inline double getHeight() { return height; } //! return a field's constraint inline double getLength() { return length; } private: //! pointer to the game's Framework (ie Server or Client) object Framework *framework; //! descriptor of the walls' texture GLuint wallTexture; //! descriptor of the GL display list int displist; //! constraint of the field double width, height, length; }; #endif pong2-0.1.3/src/Makefile.am0000644000175000001440000000062610473646146012317 00000000000000SUBDIRS = grapple bin_PROGRAMS = pong2 pong2_DEPENDENCIES = grapple/libgrapple.a pong2_LDADD = \ $(top_srcdir)/src/grapple/libgrapple.a \ @LIBS@ pong2_SOURCES = \ main.cpp stuff.hpp Framework.cpp Framework.hpp \ Server.cpp Server.hpp \ Client.cpp Client.hpp \ Field.cpp Field.hpp \ Ball.cpp Ball.hpp \ Player.cpp Player.hpp \ Camera.cpp Camera.hpp \ Interface.cpp Interface.hpp \ Buffer.cpp Buffer.hpp pong2-0.1.3/src/Interface.hpp0000644000175000001440000000726410474143514012671 00000000000000#ifndef INTERFACE_H #define INTERFACE_H #include "stuff.hpp" #include #include #include #include #include class Framework; //! mainly responsible for text output (HUD) /*! This class is to provide a user interface, mainly a HUD. It shows some stuff, like a background picture and text messages with some effects. It builds up it's own textured bitmap font for that. */ class Interface : public EventReceiver { public: //! unique shown messages enum Message { //! player has to serve the ball YOU_SERVE, //! Server hasn't got any client yet WAITING_FOR_OPPONENT, //! Client tries to connect CONNECTING, //! the game has started (successful connection) FLASH_GAME_STARTED, //! the actual player missed a score FLASH_YOU_LOST, //! the actual player scores FLASH_YOU_WIN }; //! The constructor /*! \param control the game's Framework (ie Server or Client) object */ Interface(Framework* control); //! The destructor ~Interface(); //! toggle wether the "PAUSED" message is shown inline void togglePaused(bool p) { paused = p; }; //! update the shown round number /*! \param r the actual game round */ void updateRound(int r); //! update the shown ping time /*! \param ping latest ping measurement */ void updatePing(double ping); //! update the shown fps /*! \param frames recently achieved Frames Per Second */ void updateFPS(double frames); void updateScore(Side side, int points); //! add a Message to be shown /*! \param msg the Message type */ void addMessage(Message msg); //! removes a message which should not be shown anymore, if it was before /*! \param msg the Message type */ void removeMessage(Message msg); //! process a timer triggered event /*! \param event the event descriptor */ void action(Event event); //! draw the background /*! \param cruel wether or not to use cruel stuff to make it look nice for PAUSED mode */ void drawBackground(bool cruel); //! draw the FPS counter and ping time onto the screen void drawFPS(); //! draw the round number onto the screen void drawRound(); //! draw the player scores onto the screen void drawScore(); //! draw every active Message onto the screen /*! Also draws the PAUSED string if paused. */ void drawMessages(); private: //! a single character in our font struct Char { //! the bitmap; char bitmap[8][8]; //! the width of this character (height is static) int width; } character[96]; //! build up the font void createFont(); //! initialise for overlay drawing void beginDraw(); //! deinitialise overlay drawing void endDraw(); //! helper function to print text /*! \param text the text to be written, only to contain chars ranging from 32 to 127 */ void drawText(const std::string& text); //! calculate the width including spacing of the given text /*! \param text the text to be written, only to contain chars ranging from 32 to 127 */ double textWidth(const std::string& text); //! pointer to the game's Framework (ie Server or Client) object Framework *framework; //! pointer to the first of the GL display lists created per character int fontlist; //! descriptors for various used textures on the font GLuint charTexture[5]; //! descriptor for the texture used in the background GLuint backTexture; //! descriptor for the timer used for flashing of messages int flashtimer; //! actual alpha value of a flashing message double flashalpha; //! wether or not we're paused bool paused; //! actual round string std::string roundnum; //! actual ping string std::string ping; //! actual fps string std::string fps; //! scores to be shown std::string score[2]; //! list of active messages std::list message; }; #endif pong2-0.1.3/data/0000777000175000001440000000000011103714317010450 500000000000000pong2-0.1.3/data/q4.png0000644000175000001440000000035610473646150011432 00000000000000‰PNG  IHDR:˜ ½bKGDÿ‡̀¿ pHYs  œtIMEÖ"™¾©̣IDATÓU±mĂ@Äx§ư§Ë*¡c ;EØ‘`¾Ó¦W{5m¬:‘&îȪ@’Nϲ’¦sœ%€¤×£ïCé}]Ï&:¾î×£ÈđđĂçA¶ÜWB8S÷ܼXr¦ÛUö€É;´e M=Ó6€ƒ.Ơ$ ªnƒ*́äàverâ"¼IEND®B`‚pong2-0.1.3/data/q5.png0000644000175000001440000000035710473646150011434 00000000000000‰PNG  IHDR:˜ ½bKGDÿ‡̀¿ pHYs  œtIMEÖ"éÔ]}€IDATÓE1NAÄf IDATxÚƯ]½¯%W‘¯:§ïÅ?ư)mDi»¡èµTư91ÿÛ?ÿ`A@À‚85?–Z¦Ÿ#bEnü£?₫(ÿ/~ñ‹]µÏ+¯¼‚jKÊüñÇ¡øùË—Cù\˜˜I¾ñ_ˆhuIiÖ/"’ofåíK¢™~Ú#öi×Ơ¿¢¼=̣·~ØŒÄ#ebñ1Ë8ûB}ä*dbàKEá$û×Å¿«ö™ÎȇP>D­”*ÿÇLDXkqµW_ˆ¨”"íâcukÿ9å)+6{ä¼5Cơ¯§”2kÓ§eC(~`–a~Öü}̉y@j'fn µ¿&FD(®̣z’ư–Ëăß[ûXḤHB>Ạ̈y`¢†ˆ¥ÈkbfFÄ̉ßÜ4ö“„AḌ lH8oÿií‡Ö­íÁóÖÖ¿.Ϭ}ưÖ׉  ‚Rª₫‚ZëĐÚ̀M÷ ä{°­[k~µèưê?đÅlÖ¿º¼Ÿâ}ùóÖ_?É¡1W̉₫2ü7"b&ûíÄP¨@®Œ€€€ËPh$àÆÛaüûi+ï«Ư6BùÜg(ZăZeQ4 ¢”–¢³ÉÎ÷ơRÊáp(¥ Ă0ăùä(…-tùÀµV‰̃>° WÑúWÄs^₫–xBñËÂFæZiâFµÄC­ÇÖH7 _.¹™ÊP¸1 €Ø³_₫—¹oVÄ¿«öÉ·h>¶zÓÉ`n†áf[?´µ—//S$¼đ vl¤óB“EÔz(¥Jw}¿D{̣ä‰ü—L”³›}ÖÚÇ£üäÁƒv¦fœ×oå/Ö¿.½n©_₫Çok!ưû±Ö0ÈA´kL„~Z$ó3scëåPäpËăß[ûÜR^6Ï̀‡Ûăæó Ó;áiµĐÚäP  ïTp¶AÇñÁƒ̉5m̃Ñ Ÿ“•Öl­+? Ắ3Ïꟕ¿X4hư±øOoD7µÀQÎL˜ bƠuQAÔægà̃ÊP `ë'¡v6zïÛç)å%­í®íiùđ̀ø£ù<5·yăR*b•¢Xë@$Ÿ“}¿[ḳ ¥gûóZû ₫|ˆd¯#¡Ë` Ø>ƒ¯_Ê/©ÿ.ñH1‹GY¿„2ÀHt(ư8s$’±Ÿun.ˆ@zêVÄŕCH̉ûÙ( ¬‹Gíóộă8ZåóaYü±|d²ó¬ç•"× P˜›œºZ@Ö:vª5;¯=o ßYgGÂ~cdøiåÏë¿K<ö‚}<̣ίo¿¬|31Ûè'yïïĐm–§SNkȨQ¿h P`]üûiŸÛËKŸ±á|ÅûæóàwĈÀ/÷›¤ÚA6ùû9ÿ va1ËfÿüÔṽ@₫^đ–ú£ñXư>˜ó3³‹_AVµư‚Æl÷́–@vi,ÈŸ)ÆÓưdâhü{kŸg–·{âYXœo±|¬´\ ë…=ø­§¶Pfcƒß‚̀₫̀²y:2—Å@)³o¸º½₫h<ç½ëü…Í.°Cñ[ö  u<;iIÔẻ”ưSóăé¹R_Ø9i(₫ƯµÏ‚̣6iX¢‡âåóàqB³ ²m2 _!s‘̣3üÉlIw±đ9₫ä¼ơo©]<ËŸ#´́m-_²¿œ•LíÉ,³DÇ Ùu˜Nó_!÷Ä /$ë¢Pü{kŸ…å}‡ ÅÍçAç¦rV5YG”muñ¡ß₫i/"œnypvÏ¿¼₫»ÇsË ^±v?À ºC×z̃¼úbf €̣Œ`.Æ¿·öY^̃o–ÇÍçá/ù?ňCK×:vB~b³ 3}ï{o…đâ/¿ürÿưùçŸû¡èö†¡—”ơƠWCø̣÷̃{/ÆøƠ¯d@—`»¶A¿)åÉ̀ỵ̈ÑŒĐ{BA¬Xj‘Ú7€ ¯~'¿‡Ùdàûß}÷ƯPư=Zỵ̈x~ưëϘ ç·Ë‡̃¶ẹ@ç·t.“°ÆđâQü÷ ¼ø®øäö|:2ÁYö“’ ́0ÿÚ+$ûí ́ˆÿ̀Oˆç¹fœ—÷ºl.Ôè¬Ç§ÆîVàÅCøïå÷Æ754(2×ÓÛ_‰§éiµïXÆ3³Mó¾f¿À¡÷†ïÏæ'Äó‹̃yuhâ,*¹#`9"æ“!}¦È­‚­×àÅ—ă¿×•ßß 1#3(ëÅÏÂUE Àü¡Ô"=NÏ…Ưo vȸ?!’ yëÛ_†rdžaB4€€̉cd-ä&)=ưp5^<„ÿ^Q~'|Ö»^F¬6(ê¹ñ́¶XX`Ôi¤‚e:* æ¯÷‰ïÏæ',ÏE@"—R=ˆZ?’Ï:˱À¡IybÂ!8u©ơĐÚÑ•^‰GÏÆ‹ï‹o ´Üˆµµ"óP‡RF¹̉·S2d•ß±Đ¥@Jç‚R:ÀñưÙü„èû-lÔÖ3cĂt€T>È€Å̀­‘€%:Jn¸ÇÇ÷́g€âÅ÷Ă7h2ÑK<Ô„ ÓN™̣dPa+•¸̃Ôr(t$É“‹WÇ…÷•ÍOXđ]ˆ́²‘$™e4'j₫¤‡™ë §>ï^|o|VÔè[yrZĂ€íÂèH·̉vïÏæ',âcôÎfc<Œă“Ûø̉lñÄ̀ăøX7 ƒ́üzC¼øEü÷†å“ø·—Ư ̣»ưdĐû9=g„5²>Poj¿v7ÄÑx®ƒï¿ ?aIü‘|O/¿QdjäZaB'|€~ĐÚqn ?ÍL²9±ôVxñ[đß›”Oâ<»¼[ ‘bBAi1¬q°alŒÜH–ûåPŒ)V„F¾Rü{kÏ`>¸µz?¼)eÖKaÅgơöô·6ÖzĐ‘`” ·H[áÅoÁoR~s¾Á’̣v½%‹S£¿óQ÷ÄEđpv fß4îwÀÂ@Ư°œÙ(»"₫kâû—óÖÅ{>ÈI½"¢Ù†o"’1]ÎZå¹® !§§̀Tëà@¬đ‰*g«2“o‹₫{«̣̣ ––×ËÂ₫bmµC¨–bˆè~¢”AöcPî—_4’ÜÈZh]ü×Ä÷/ä'¬A>óŸ Aå‰R*³Ü‘1":¨“O£ĂOÛư€œÂ–Íñâ3ü÷æå7áÊë ‡êP–r6*3@cF€¢K¦ư]Ô0a zO\NaÑø³ø«ø ËăçƒƯYa)Ơ­̃ ̣#¼®&ȬÁ²_eDOđÖ̉ ?m¿u[¼¸Çg”¿#ß T̃ö34¨¤> #CVA¤ª'sôá_îÈ䨀ëâOÂ÷¯à'ÄÚ3̀ SD´ß£bGƒf¹ˆ_g&9OUl]Å'•_Í7ˆ–?QE¼xNjx!V9 ‹ˆè9F•#¶C|´₫Íù$³WàĐÍÎI /Ä̀ƒƒ‰ÎkG”¿ûçU,c^üœú°mùu|ƒhyĂÚN Û³@̀ÅÔđ†ư<ïÀ@y—ø¯ƒï_^ÿ¶|×P×ư—߀Œ?̉†×_"zêŸ|̣¯!¼øgŸ}*ÿ­o}+„/ă7Bø̣>ú(ªgâ'|úèÑd`¬ÄZüÓ¾‘kß×̃ymâ1Rw&ˆây’ÿú0ôyó›ß„Ê¿ưöÛ©úư³¡ưÙíùé§¡÷ơơ¯¿ Ù₫Q¼ø®đåÙzö¶¾ˆïŸ81¦ÁÊ >¹LṼ¶ß¬ædâïÓëæ¤ú¬Æ‹ï_©zö̀Åm…EŸđßoÙÏn¿ktÑ:ygFˆó¢åq6E¿?Zœï‘́°/¾7|yª}c®Ê÷zU¤fÀi½èëû‚²ñzNÙo›àT>ƒ5~’~´₫¸?ĂUü ®¿7|y–½ˆÿ .U®o›^“I@Ô Ê—F´t ùcª‰@p >ƒ.Í“ôû×Ơz_é₫WÀ÷ï _*ßôªËTOÄ!Fp̃¯“€ä7 Ø  ¡ï†ûö M€¹l>ƒNÓï‡Ôö¿’?Àđư;Á—‡Ëë>SØM­‡RD#Ïđˆx:â€Ê ƒ¹c̀üó²ù ~yÁ¯XWÿºxRü®‰ïß¾<\~²~a…†gº 0ŒĐ·çÈg8ÿÚ¶ư£ơÇßW²?À†zđIø̣mư ÂzöîĐˆ¬ÜÔÚSùF+€:ú­·ÿƒÚ÷¦ ‘ïŸpÊ®ỂïÏă{\Ă¶Đƒ₫©gßNùùP -æ`íh{ÁÆæ‘áư:`(X°“†®Đ>~ñ£ß®?ô¾®ä°‰üæø̣<¿‚?Á]‡5f„6"T^Úư€»£€ˆƯ4A·èÛL÷OđÙœ¡ß¿®₫Èûº?ÀVzđâËSư –ăÑ=!¦zv…^~™SFß%;‡˜*ÓŒŒ  \„¥ú'̀Îôû×ÔđgÈöØ\~|y_AXÏ^•ƪÓÊ«bÂûû@²ßÈđOtăÖđ¶nŸ;ë÷ç̣=̉ư2ôàïˆ/Oơ+ăÑƠ .@åLî‰'j<ƒB'Eh̉“o.ƒ×ñîèđ,ü}nư+̣'”Ïå”=pAO]n<Æh >Ûc9V”&¼Ö¯ —èÇû§2âŸfj½+çåítËaæ$û{ÓÏbø!gºKđô³uóö™­Ḷ꾯h>‡ựôà×á˯éW°HÏ^³ß°ŸçƯ´5‰¹g¿­|ÎØ6 ǴÊ₫ Ûê÷gó= Ûà?ˆáÅ=`u ^üư÷ßá¿…°¼ü›o¾ç÷¿ÿ}ˆŸđö7¾€ÿúÇ¿NJ Æ Æ~jL1y€™?úÏŸá­·b~̣y—×ơgøæ7¿'êÏđĂ₫Ä„Íå¸S™UÿiK£U₫Ùxñl¼~¶¾~ÔÀpÎÓxïC:Í₫n™É¯¸?CßC{º́· D™»ø`Ïí·ÿ{Àë¯'à‡̣°mnc¨Œ́)r6ÊîT~E¶?C>߃TĐôÄÓo ĐA÷ˆy?@ ÏíÈ{À믋g9?!́Đ˜‘»0®"”ifگߟíÏÍ÷ëtú(b'+yËsÉç•₫ËñܳËsÇ믋g9?!ê 7d„Œ¥ªjˆ> Ù?b®Ă¯€kù3lÎ÷S áÄ´6Ö¢gOØP̃g€¸?†đÙ²¼₫ºxü„¨?€đ2q£V¡22 €;"ç|€l~Å=ç{4?´®"ñ 6Û1(¯đ(!|¶‡ :…ü„¨?€Ü ¬Boj=Ôvlàî†¯Ă¯¸¿|cd˜ ñ8ÂáĐưÄ ĂO>ẉX‚Ï}=w¼₫]âYÂOˆúÀh/íI{üûÎ÷°‘Z_@ ·ñâ₫ÂsÏ®E ^]<Ëù QCÿ÷¾‘ưDøÁ& q~E¶?C¶Ÿ€u0=·lăx´EYáĂsÏ¢ÏЧÏ'×€Nư¨ó„Ö—F¨ß\…_÷ÚŸ¬CÊv¢ ĂA–6ăµd@·xVø@P¯¶̉ƒß¯÷xnç'„ưœ<:3wkx&nǾ'î8ä«ñ+²ựü$“uzi3>€́†å¦~̉ ú`¿¡ü&xư\}ư¨?± Ÿ(xQWk]ZîȮƯÈögÈóđ¢…èNu™™ld—µPØ`{[=ø;âơ£ñ„ù q€~hö0}œ(J¸}»ŸĂ•ưïIư}k—4ˆ‡a™BxñÍơàï„×ÏÖ×úxQÄ“mº¤> É=q7ŒIæW\ÍŸ!ÉO@³¿\8̉;2¹đ•÷°ÂVè÷o®§úôÙñ,׿7ĐÛB€ ôæ?· ¢¯¢ßÿ\ü6ñĐïQEÿ/Sa /´?Àr<÷đúÙúúô˜¨0—81k¾€ôkê÷gû3dø ¸́‡Ùæ{Ñû@Øॗ₫;„ÿùϯ?|ø0T₫¥—^Jç•W^ Ơÿê‹/úáß3ƒ«̃ÑûÉáѧŸMĂ¿²úf¡ a÷Ά¨ÂçŸ*Ơă÷ƯwSù¿ûƯïBñíko„ø-a€+àųù¹ơ+ב&ñsÇpW`Æ4®ăüºùÇ ²"“ưvÈ7ˆÆâ·¬ñ¸^<‰]¿-rlg[q®÷oæf[a¡½#œø Xö_Á`o|ƒ|€¿e¥?@6^<^¿Ê=^xợê`ÙOvÖX| û&˜'>€¸t4(Ă =₫ëø'äñ V|̃¿e½?@*^<]#*ˆ2 D‚ÿñçBvM¦â}Ư i¤‚Å.cd3 Ú‰&Eë°O¾A„ă·́Ôà—g®N¨ t7¬rÿĐúU`ωZª!áØ È$@˜ë°C¾Aüóø-ûơ¸¯å™AmÂQÖ¡/ ƒ°aÚÙiƒ±½ô&ëŸzSË¡Đ‘h$¿‰^¡Ç5ÿ„T¾übü–]ûÜÇ̣˜GÅ>µ@zư²ƠÓ»CQĂíơ×ZựzÖd‰ßÈú@½©].×¹gS‰éñ_Ç?!o?ÊoÙ̀`C¼x*à ₫lë{æ¦|éƒqÂø¾иœ?À¡t±h́dN‚°B¶B6ß è?ă·lé„ßX¿?¹~»퓪—¾].…HúƒÊưĂtF̀ Jd(C¿ VDÊ?„kú'dđ Bñ‡ø-ûdàÅ·å¤×ï „{W\û?aĂOÙ?a?Ï»L>1eˆéñ_ß?a[¾A<₫¿eøÓŸ> é©¿óÎwBǿsà̃íøïG…đå|đA*~=Zÿ›/¾:¼tFª₫©gùơ÷^÷°gÿ€y˜H:7~ë¹zÿ3Ûæ|ƒW_}5¿đ=–×ÿë_́Æôi!TÊà™bº¢a¿oX¤§Åg¯Ă‡ôă³ơé£ơO·3$ºN–ưÓF OyÀgÿ>ñ÷©~ ñúÉ¥ñü‘Yö÷cĐú |ù:¼₫r|y6~=T¿H ÛøW¸f¿«`"Yf“§noøûƠ|ƒ4º£̃áÊK¨³ß"G¥"ÓS_‡/âơ£ø̣lüụ́ú™¹‰è•H?(/Ăv–ư†‹†“E€hA8-Äíẉè»Âß§ú-ÄëïäÖưÎA–C^!½ß„ôÔWăË×á¿—ă˳ñëKëg.*M&Sj! §>¡å@ ï "\¡SaD!ư1±3üưËĂÖ₫:F"Ëy¿]·ÑÑÓoaU<¥€±^Ô£ĐØ]lˆQ"¢zêø̣ÄúÙ¥hÎƯÔzSëăÖŒ±Ç~Đo đSoj½©íq“¼7¼Äư ²ñ÷«ó²üÉ}LïĂĐó™¨y<ö„Z®§~ßñåÙơgå¿ÇÛêçåÇ/Ç{„¿¿K>äøđ)ƒÆñÉm|€¨zT¯}^|y6~ưbứơN˜›ămrfœ­¼0fn<ùÔç ±'üư¾A?€±Yô|¿å«ÖAƠlf‹ơÔ¯ŒÿÎđÈ­ÿô„ÇøÇÖ 9y,0uh¢¹©?À±êv6º7üưËoî༼:ù½”„S ë€̃ùCTO=ª×~w¼₫j|y6~ưbưf*} "Vă(À4kPpÿNô+I07&$é ŒưlÔàĐ»Âßß‘o°­?€—G`£¿‘,ïuüa9í¢zêQ½ö»ăơï‚/ÏÆ¯_¨_Ư1@ù~fh* íåѧSNœÊwSøÖ¥¡M}oøû»ó ¶ơP_V† Ư,Ÿ¸”*_bÓ3DơÔ£zíëđßâ˳ñëóúƯƯæ `ØGíÊ] ;ÄLWz…Ưnoøûuåóüœæ*¤Í«EôÛy9ư(CTO=Cï.é÷oˆ/ÏÆ¯ŸÔ¯Í7±+Î6½R¡œ“z¸¹C̀EPôÎđ÷+ʧú8¬st3ÁK¬^hˆê©'éư/Ñï¿ ¾<¿î„•&ܽ¹'nơÔQoRƒ›ư ¹'n x!Yí ¿oçà@œå̉°/Ä̀CTO=Oïÿixư­đåÙøơé–G!Ÿ³Ô7D+îÊ´oÏÙ0FëIåÁ<üưƯùËă_R¿-ˆÂJ̣ÍOˆeøîwßñƯÅCº}î ·“øƒïÊ·7ô,¾[¹6_ñÅ!ü÷{ï½*ÿ₫ûï‡đưÑụ́³ŸUT̀Â:C@¿¸Ă?¼èía<3Ø@ưºè“O>Iơ7˜MÅÏ|¿âW°¼~À^̉~øa¨üŸÿüiˆßRôØÜ{ü´§s`oø̣lưûåơƒú\äWL„cE²ú˜YØ©¡€ßô£¡{íŸü~£ü–A ‘J#¢Û8ƒ‰J;é¸}á˳ơïĂñœê>t8èư[ö³ă¿[{Ë=€ßÉM ÷Ư?Áæ¼ß¿Å°@}IÔơhú¹̉ä$c̣‰{Ă—gë߯ˆ§1×Rú!Ḯ\Hùv4É=› ̃ÔpÊ₫N¿ç₫ >…’̣!Äo8t·l#8jûhó̉Đû²½ă˳ơïŸ]?³¨!âH„J“7𠻀aAá¼ÓH¢Î7̉P@đwàŸ0ÛÑn₫~£ü–AUA'tQY\Í~rx!Ú!¾<›Ÿª¿©újN”ZET²_å₫'‹$àv@D‚pè»aVCÛÜwÿÚIz¿1~KçØ§üÇáđB)ÑEû}â˳ù úƯ< rÿpSë¡”#ÑHij³ º<;ă7>@÷ ́&b pÿưfÙå,ȇ¿e‚CË̃LƯáåy‰xpgI;Å—oÂO¸…?¨ßic5f¹–₫Đ[So‚Í÷®Ÿo6ê|€̉;#tJ€ Üwÿ^₫¾–çC”ß̉áЦzk8 ×íFÄ¢pèâË·â'T§:Ơ¦nŒ0è¢̉f0đÄG~Eü{óO8¿Ø<Bü–Áe1¼„]((J¢÷sˆÙ!¾<[ÿ~i<*ˆr~ØcwdrO<ÉÅ1˜@ô„%=Y§é2 ̃wÿ„8¾?–Q~Ëàfç”…MWºGørHÖ¿¿¿̃‚•Kú Cºè"¸ˆsF˜dE¿U¸÷₫ Ñö\•?Ëù-ĂL%âxzbØưÂ>ñåỤ̂Îù‹â×́·ï/È xŸ¯zn(`“€yÆÜoÿ„h{Æó'Äo¾ụ̈‹S "–Z·%8AÅ}úé§!<ú÷¿ÿư[ốóôû¿¾<‡†Ê¿óÚkÅ1!ưNÀQ×Á÷g̣bü¹ &eÊ@)Ư5¾”"Rç&WÀÓgëß§ăÑÅ#^Sˆ âAwĂ ïw€9â~¶S'x\…ë¡¶c“Ô·^qÿ„ÔöL'Êoô\[#¬u0èÜ8>Ö¼g?\§ŸG'fĐc~y đÂ0˜;ÆÜ?'b tä@÷0Ơhºª?@v{æÅå·LêĐßx<>W<}²₫}:Ư« 2Û­ø₫v?·UUÿ„Œö̀'Êofx̀l”"+ØâϲñôÙúưçˆÜù²ơT/fr₫j­~ù ĂJüå‰S†2C^É?!ߟO”ß2Øé¾<ĐÚqnŒJ£ÆóvT® ÇŸïŸ½­ÍùÆ6Ux÷n0葵 ÀnèHơ¦;QFt²́lô ü‡l|2Ÿ!Æoô·6ÖzĐ‘££Fư%³ÆÊÂÓ'ë÷{@eßÀ.Ä( ê¥¯åA-̃“ä TE¦CA‹d‡KĐsđOÈÀ÷gÆă· j+Ù˜©ÖÁ#Ø1W…i/3y6>[¿ÿ<{6æ¸ûBt*•vjh|€> ¨1  ÿ ÏïÀ~vuÿ„ |*Ÿ!ÄotP—[ô€,¢VƯ°^¡%ăé“ơû}kfđ d Ùod; ÂSƯ8‚˜  ú7îx¾ÊkŸT|~<1~Ë`Ù/ûƯÙÚN^¥Hưx>ß •o`Ùo©_Ô!¦¿Nw\-û;̉)¤Û¯–'±̀öÉÆ÷gÇå· ưÅœL <£ZO¹xúlư₫t¾M£gÊÜ’ưU;I‡Iö¼Ü₫4Yc>5û7lŸl|ÿuâYÎo }Î@”¿YÏô.ƒÅ·ÅÓgë÷§ó ܨ ̃6 tXQ ÎϳºT(ÂԮ-¾ÿ ñ„ø-ÿt_Ru¨Á÷IEND®B`‚pong2-0.1.3/data/background.png0000644000175000001440000326132010473646150013230 00000000000000‰PNG  IHDRđ¼Ô pHYs]Eđ€IDATxÚ́ưklÉ’%†™ùÈ̀ó¨sëVOwÏ¢(Nƒé7đÇÏ'êëŒH¢Ù́æô}UƠydFF́í¦î¾l™¹GÁ@ÀPÚuqndÄ̃¾ưaeËÍƯơø¿₫"bf"bb"¢ª"¢¢í›öaü£¯v³6ÁÍí~Um…˜ß́¯w·?{ tO«[ø̉̀dü7*ïßă3ebêO˜˜=m'QÙ÷}ß÷jµ=UkEM̀¬}̃Ơ 6Ñ₫:«–~Âăh -üoÑ¢ªEª-¥ø÷ư§RÚÍ[Ù´¨ö{JDÓ%Ú®hô¤zÿˆ‰IµÚ?ÔjbµV³ñ¯Ç÷fvÔĂ¿´~sµÚ>ÖM¶›ưíéå·‡i¬Y»ªˆéj÷Ïí‚D_£í.ÏQ¬zï© ª™Ë­ÑƯ½·‹B\›duơŸMÚoºơe+RJ)[ÙÚ—[ÙNåT´œ¶ÓV¶.ºµqßÊÖ₫ןOåÔd£ ̉$-]¢Úºø ±­ßĐđe··æđ¿ùO¤˜[Ê1|~Ûxº/—ܤ^DZC0ˆ\®¢?•RúS¥kJë‡₫/tG•Û8Zï*Öï¡/Y¢Ø²©d‰â/Ù‚ucenCp5mjº&"¬wø¾©•I×Đ®Y¤›]Ó›¬Êx…ø»zT«Çqµÿ¯={Ô£Y€^Œ2dz¢̉zrÛ¶&°ÍdÁ„v“B-…Í9́¨µÇQ[e©±Á°Ă5$µƠ¡×<k1¾ñÁÅ0j÷-fÖDßtQ²Ô¿‘\[r)MûR7MWíúÛÔß4·ù&œMÙ¡Ålê»̀£VBrH²Ê¦l¶oøÜÍ21pŒé°Êeص^I;\?₫deäFơW zzzúñÇß¿{y½üåÏyyya“ Z)e+§ít:ÎçóÖzTƯ¦5¯ éjZ׌vµÊB•”QDÜÅCx£’ !(F#½p̉kè#îï}̉Æ¿”ÖiM)ö}ß½kÇPçö́Ó»§ÿÓù_¶íÿ÷ÿûŸÿüçă8س'ÓÁ:ØÚ²DPèóÿ3wÅ`(f̣°€cé©&u¡ÏÙ¿©ơo2ÔLf ~Ï0lóB²çÛ¸NÛiÛ6‘æ=·²mÛÇZéBëX¼ÛS ¿£ªEq÷­Ă)dăoæ˜üID:m(?~üx:®×ëóós‡²4Ư1‰4ƠhM^Ú ºFQÿ‡¾’k—û‚ơŸêơç7=eShdÿ‘E½Ñ¡½úö½úƯo~ËOÿÿK ĂçùWU=NÛ¶ñ÷ªúđđđđđĐăÿ<¯ÿ0ÙøÏ¸¡ÿ?|EKơŸØjưç{ưR˜ÿÓ5Ê#̃DÓHjB(N®Ü‹¡Pço«Ê¢½Q:Jó:Ï—R¬¶ï=6˜Rnø:–₫O{ưç)̀™A½ó«eăÿq×SÄÈqơo(̣·Ö¦k†ú`µæÔ¢“í´G#aIIs̃f ]œ¹ü³q¦!”́€`לBÀyF"uS»M%̀9ôZ™?˜ DDÔ>”R6Ù̀ucÔÇÛ₫ÚöytC'PG@ßíÖgt]ë“Æˆ)}^B­Öº•­•Ó¿́Zµª¢¦V­6JDªT5ơ₫1iínM¡ëƒHmñ6Qà!Hlh‘RkÅ-Ujk8Úë­ơ‹”*µư‹—)­Së7k âΓ½ç´ư‹×i§y–‰yk"°á ̉TÀ\¸¨Ơ(Ö¥Â6^7 ùØ.xÊ´{;-jƯ¼w®WªlçíÇföüí~±<”Ÿ~ÿS)åó¯Ÿ÷Û̃Aÿ7i+[ï–¨¡DÎÅ¢!5Ô¿÷  ƯîcÖ_ä Z]û̉O]Vǧ‹wAÎûSƒ4‚ /¹"§EG%3•b"EL¬³¼³ñ7ë±ÖÄĸ°e®Lÿ³]QÙC¦ ­ 2¦à v MÈä )i–̀‚‹É£Áà/Í}Y2đ£ư=`ô#±j°Ó̀~52đ¯Đ_q†À¤–¦Éd×ẹ[vaÜKáA4V¬qó̀w²˜X‘̉_¤oŒ`Ñ^cQ/<22él5œ›ĂơÏ‘ÆM0ÁÈXŸ #ÑOJÚîI#øQ{ê L° ÿëQk­ûmg¥à~Ăçy23ÑÿVmđæ HÍ 8±ü‹o%,?¾QiĂsy–{đÄÜám¢ÍÅa“đíºí·oß¾ÏçëơÚghJó¹>=8&ĐW=heSaö¹Àº,LJœ™ï¾½UOÁ|¡gX‰‚h°übä_H€ul1IBQmíô₫¶N§­l(¤Ă•2¦̣9nfo,T†çâ‚*™€¡sƒ9èæûY< ăƯÖ©'/%Sé¹*L¹™Â„^Ó5¼÷¤¢çÓù¯₫Å_ƯöÛׯ_¿}ûÆœ§uÈpdÑ} °K’ÀD¶+ÏZ+³DJ…!¿‚;¨?6Cs7Đju»Ưö}oP)UïË!M4yÜKÍ-Àë¬? ôă m•Z´twhV¥ê˜P†”½µ®«VK)́ S%S÷Î C"™&‘qÆ–ú=à3×% N³&^µ:܆ˆ´n1±6 Öà ܦª¦½ëÚˆc‡qçHˆÇN̉¥₫!Hç¢eÇ_â FÙVÀø¸@’ÇÀ^kƠú«V1)VªÖbÅéSØPÖK¥”Ÿ₫ê§óùüúúz»Ư`>Ø&ضmHh‘†¶àSÄú6OÍ=ÉóªR†ºÎr~LªˆŒœÅx[2Ù½&¬zBOXÊG M·EU½mÈtâô„r!GS­+æÉÁÖ ï¹̀€‰ø¥ü¹ U«ăA3t~eº:2AÀ¨A¯cóÁêf¶̉K›È‘åñ‹‚ÉôA.püçµÍä 7&Ͷ„1ik7(ư‘@‘LÙ2]›` ÔÉ eDĂH5])8¾Ơ(á)Ê›üƯkIm›b!¸f̉4NGxBú¨ª¢‡qJÆ0’ Zx–zÔoÏÏ·ưv½\÷}÷̃£hN@:3©’Đ›UH¡¯ƒ&àƯ:Ü„dƹ¾@ ̉]È+ơ§„Đ¿ƠCT<³LZzIFÿV÷àvûăÿ¸mÛơzínb  dûp·:X€Ñp·[¡®‰ºiî‡÷=Ë Ÿfäy[đ¬eÛ6-ºï{ë¤nmf¿cì¨aIKز}Óó‹C ÿV1-=7›b²²û( Ù€&vHC Ơ“½K‘"ÎƠB>gë$ŸCHîÛœ±Öºôz»ê®Çq¸€Á` ÓÍ$I>©êétúôéS›NúöüÍÇ›Œ»d7‘iûGj¾!¹[XÛh¨œSäbs™¬Ư«h±â ¿vèoz’´qL¬Dÿ§ˆÈÅÔâjáC̣;- ¨V‹ù-'0{Ç}ÎDWi <´Z¢4ñÓà­-Fe\ª)÷ |ø¾¡ü63 %à'ºm=”„c̣ ³ăOG÷ø°iß¾’Ƀç7eƒ•^‘6±OæXŸíi1@o{5)²×ươöºéÖ8₫L¶ÿ5•^V±oˆˆ3Í̀¾ÏÅƯ¨¢¢e+­Ú ¾Ñ§xÄaḱî.¯UYŒ0JïU~…H._®»Ía·=!¤t†2÷ª÷̃è“0ƒ×à8Q¹#™Æ#ç}¯µ’<}úUß|\–¼yÊæƯe ́-ÙóÀ†"ÎOSáS—~÷ c±’äàz(€`‘“zö₫zCº•ˆüBë»wν=MU9sD„&Öa-Ç‹¥ù§·{|„:xơƯ25~¡¾ơ°ëë¾ßưpzh)ü»Fÿ 8k+´![ÆÁ4I™‡ß`Ó]¤S”Êâ'™n]Ü0ZƯÀYÇ™ffvŒ«"í1LÓ/©vØ~́2˜₫đ¶ưÛâºTçD|ƒIV¢mI†è̀H%å¸oÛv>ŸK)­Qñ‰5MU]ø…èA½•#Ûṿü~–1¬̉iësÜ(ƠyŒ%8!í‘Óét~8‹Èëơµîµ9w…Éq;”8w,HœvƯn7Q8c唤’;iîæÔîhËhÂp²IzÓ üÉ=ƒ‰N™ \ú|ç›{±èoÈ™eM¦óÍ ×†Œ¯æÅô’ôo"›ñSWK÷ÙR}°pÙW0Kœ—€6"3e5…‰aă'H 2eÍ”A—ªh‘RµvôcºW7‡ ¢R¬˜Z±R¥rDNφ~Ó à÷=i™%–æ¤Ë`n)rS›ªju_eu“RJî HWÑ> ¥JƯ÷ưUzЦ†ªƠ}ßùå—LJ§k£ÿƠ’aê/Ao+¼×™‚ ,TcÂô}ê"₫óáü`f¼ª"Á¾›½ưÍow-»g†4ˆ6ÚƒEJ"Æd ‘?Ü“UpÆoyÄéD;¸¥Ưm wN•{S!3CŸ‹e®W‚_ÈAȨ¶Ơ!]́çÆ¤Vj…ߦ ›¸çĐ½ôd€u«H@î3û…5ú¿"z‹ }VYß6Sø“́ƯªvfO€>đ¬ßk;79Ñ™!ô¥Ô—@K‰¶YÊ>k₫ (pp¦"<1H₫ëØC'Í5TOD̉N¨6׳ƒăJ(Ù:˜Æ=Kp‚ŸŒ~Đí³@܇¿i-Èv‘₫KŸ~ïôí́CÿH₫iHÉ´ưqç!s0CÚØz’¶5`kÑ×VêQ¥uđưuk!"­¥¯Ç ÊÇ}íÖIDƯ¿¤¥À¢¢̉å7¸ÛĐ¿/ü%Ư¹ÿ1¤â>Ÿ’}NT›Î?~‘ăóqƯ¯,/yZ)†a@8f /œ(’ă8–ø§“₫ÛX/cQŒ”­“˜́·ưùùùt>9o§₫*gÜ… 0ætVÀơđ– Æ}”X|@¶2’Ttb†̣<¦z—ï,© ’+¸&ƯOLtɸ>µDóÎ^O†ÚFmW)RÜ,U”8#Öz¿çô«X5+₫+(̃6l ¶19̃±KµZjŸ)‹đ}­¤E!6éÉư â fDyŒàúLÙˆª¹½½o¥§uºN6â¿¥9µ§PƠĂŸ:ˆ ?¶Ñ>Đ6Ä•âŸuđCå~èĂ· ™D¼{Åsr—bË‹:u+ɤD'Ưô¿µ·j•*=¨ơ€u¦GMzÈ.‡[ÙLû—¯¯¯ÿ¿₫=vR$jO?èåƠ´‹–ơM¼Ç¤˜c/È9Oß;¥Lw¥\j4¶låt>©h=j_(B“¶ Oä?§uü“O$Đ3›xtµË̀¸X6VùËÆ¤ƠÉ !–€ä Î&3OÔŸ̃Û®”‡Ăöguä̃X4,ˆ4hkâºư©Æ:¾£Y1ùƒínu¦NFađ[VG*#!{F`.”ÿ#”µF0,«©^̣°¨ƒoôdÂbÛç²=™̣pfÛ›Íî<íÀÓ DµI3À½« é… 6¿̣8p(Œ°CÚI#cVYXÊÀH$=Ön*YUm¬®ñ¶· Eë„+„¹>æ zFv(¢Ñ ­ÚN?µïX…MtrœLȘÁ¸q 8p[kEœÍw€̉&Kí¶ZkÛö§E¾ç^ueaÅqè?ÔÙF¬`c›>~+EÀø¦É,o$ùEËĂùáñé±% ¶äå Ø8I£22ņ%pdÁ¸(–UhhÏĂ1̣ H†Ô˜÷_z̃ÿùtæ„x¿™6¤BÍƯú̀Ö;™ú˜>÷øøøĂ?˜Ùóóó^öî GQ<;*"IB˜£Àcíóщ6¿{êâ™?¢ă•dR̀̀ºĂ₫üëçÓéôz}í`ÎD”­`há*²£C¢T!–¡nPÔ­!¥”y ††¸Ô„äĂ₫öo₫öo₫æoDäOúÓ₫ù¬°É)b̀èvdF qB*!.{v+=^rÓ3H2îŒ$ˆE1Ó^‡PoV,ø!Ur¼Î.[½­́I%©9C·i]„‹„ºâ·̉ÏÖ₫̣ƒµ%₫̀J‹hƒt%¥aöÈF€ă: 3₫Ô±#„yq?ïJŒ´́:ø§ÿyKn̉£0™ÆÈ¯È'îÜç‡)æwW"=>‡ÅăñMv;le{x|x||´‘°”¸Œç"Áa–mu³Z·Ûí¨¾€Bµ°ù¼ÛD䀄œ…K4e₫œN§Fü÷‰£È'ô AÇœ̉ˆ{]#^ đĂ(§}®V½ú¼Æ(f—9Ê·€ÄRÈ0ƠûsDª¸™ÑßV¤úX[_¿ÓÅăÔêôüü¬EëQeNO?ưƠï___¿}ûv¹\¸yĐ×|«àÈ8éùâN§ßøR½3·x#³”{ y.đ— 3›3¼á́7P•ư4~m°>!Ñöo#àmdf7¢°^‘́æDă¿uÇÚ÷{r´Ç1zk‘oă£ư³Ơ;Q5̀ú1«:éHA?‡Èø ´…܆˩¦>‚Œ¦•jk?}ǴD³Sd„ÇC™â܇$cÁơ®ÖV‰‰‰Ê¿ûá‡?́×ư—_~é đ™ô­8;¨/'ÿÈŨM¶0‘€Ê´Ç³8²̉Ờ¿k¿î"Â3! ']ê"́ÀN"‡8Àc}œ«̉ˉ™6¹ÚX±M>ă-Ă5iͶm[ÙôUÛæ¡iC`äM‰[Û+~)„{wuúx;FÏBvIª—Æ̃1xèü~›û…Q}êÿ§§§÷ăÓû§¯_¾~ụ̀eÄ%N›9 Z̉đa20â½~3bå³ú'ͲNUÊưiO‡ô*ï̃¿ûƯï~§ªÏßă¢ÓƒBS+œÉ™ˆ-Í“h “À,Ôí ¾m-D±&wưN™xpÆpÓằ ®Ú˜T[ñ.H XLÓÉZ ̉¸{%« í§aø€₫LVeΗ£ÜNĂ˜ŸJ H%ôúoÂÜàè¹ÿqù/ïß?4ÔW‚¦950V HTŸy4êºí¡uÖTâªÓ9rX¹.9Œxµv$È=É J@3iÉô¥»;ú/Ú÷]N~₫‚=úX´¸$«×*?‡"£bNǼr¹üú˯Víº_yàøÈæ¹–&.Y{|D¦(Î₫ˆsÿœmr%"§Fùß®7à+RÿåßüË—×—?üñ——KÑ!%÷Á,ë E±Ñ,₫Ơ\åÙK̉dgÂÆ© Q@™#a÷ă&4-ïù ˆØ2C%â2,-îÂ8ø¶ß„æCf/Î}%ÉÖÏfwÅâ'Iæi„<2z_TJ-HWă~Ü&Œfö#TÚ¹mé%sùûđ·_÷òâ˜ÅIh÷Lt÷Oă 1Ă  ¨¼ÿ₫¯ÿæ¯øôéOúăׯ_»“"‰¹®Ôûë |¿+•–å±,fs-¬¿:öăơơUµ4†'.f.F.,ü4jÎÔàƯà“†©¥ÊpÛ]©©ä{’₫ÊŸ8”øXL₫Yª‘M¶Î'Ä–fÖT‚­¥‚Wg†}?©6vs.Ùhu q(fèp²Q NX#lƠ¡ Dë'₫{î×8ơu™Xû+‡ô£¥ÙÈüb ¡H^Z´)íGü¿Đ8†_³•& È„ƒëíº·“ÊFÊœ­<#V†ûÎĂ‹'0Ó+¨j˜€¯‚àăA‡|ÚW;13 °¸ơ‰0áâ‚:/£çN¸\.¯¯¯˜MB—†ûAEƯWªµù7 Á₫BƒFÓC#Hé ½E¶RÎç³}z|â ϹĂ&xMç†Üó́Oº9‘±Bú° ă#ñŸĐ67¤OI#™<¼MÓÊ΀.îy)âÎÀ83~È2ѳ‰† :_;Öz6]ơ-N̉µo|¹-Bđ¹EûÆHá‚!¨qCæÀ§·ân6è L¼ö…M´JOÓï‹€é'EĐØ;ưă†FEcÂQÇv›[́KƠKK‚îcGÛü¥ |/ºnu u†Ä¶íÀªƠÛơ–DââœcŒÎtÆ¥lF«>Đ‚("ăÎ1ÖƠêûïÿ‹ÿâ¿xy~ù·ÿößÇѾw–{ÅÚX-`ÚÓ{”Œ~ïYwvø̀ị́˜g²2܇naÍ» 39œ„ĂăJV/'ÚEïo¡Ñ Ơ‹<3SÀ®Ëœ}i¤ju¿íµÔă8¤Í'XèŸ0ÉÉo´P~"áf ‹æyÇ9ÓÁi‘‹]N‡&úßË$Tqe[ç5.6À³|•Rß¿ÿáÇëơUTêQ=b́³̀ÂÙ₫¿/ 0×£qX—¹Úđá,¡{µÈ}Äqùå—ă8̀äë×/̃íăN˜}¶'áÏ%«g€UYHfLñ÷¢¨§h¡o·““2‚Wô Aˆy_Åí³ÏÿÚÎí…^căsṇ‚nZ†®ÙÍ”,äµcMÚ×ç§8`¢íƒvÀDLJbs»Ưn·›LW÷†Ä€äp=æđ°^»¦ÄÜzi Jâ„aåü@ ]­:–ûn§vPy)œiƒWă¤m¤²Ñơ¼€ 1̀2-ĐèŒ$r|,tè4êF<Û™p‹?‚‡H5ÀGă¥Đ¯¾²Ü€¶́U*UÇÔtß÷_~₫å¨G‹`06¬ù }ÆC¦$Z[Ô^­¡ùlA\'£K—;=½±}ÿăï|z|zyyùËÏAœ±—D™Go øîû₫ˆçOMz¢4W›j¡s¤3ˆ¨?ă9Ë„Nè[µ­ÎHùhE¹§y4³U\…J“:UËâIĐGÀ6Ô‰ŃÖKđ““1EÚiPl ˆ̉ø©"E@¢UÑóéüđøPJyy~9êÑ»×¼ên’÷wû㱤lj7iÙÊöđđ`f××+#¿`€0µ'¡đdư“ưíá"7ñ‹-§ÿ¨ÇÏ¿üü‡?ü¡ÏY„1³qJÀ }a€(D‹M¿+KŒØ=’ÄÊv Eq§Î_°€Tøè‡Ͱ·öÛ°B̉º¥hÁâ¶Œ3µ™P3”. v®¥™›Äͽ]e*œ„¦c̃ăv½Ơ£/ØC4ƒỚ gZ“h: BQêˆê™wˆÑÚŒ₫a*aÛ ,Å!æJ`¹EoœföíÛ·ú§úóŸÿ|y½4₫²•Ù»Lâ1Çc Ẹ̀F‹8ÜÊ!nÀfCở(˜…ù«———Ûí¦ªmăy£,8‘ fÁÔHö̃ËU#Ù¢…]ẩ4SăJKámïăiêÈ[gY¡ø7%rx2h‹–kwy¿¸„/‹nQäZ ­ă—‰v†"œa÷Ï!Q}çÙÚ÷ư”g¶hÂpgux ĐQ]T:í²Đú̀¦¸ë”vB7ÿi5n<ºÇ#ziS»€’Üz„LÿcoÓ?P¾P̉èYđB\ĐÂ7óÍèÆ¶éb\AJä`ªM«JØk°R§3EÈATDµhß$cĐÿaèTXu•ƠË@̀M‹:¾x€CH5c©·Y ¾'*Ä̉)ê¾C¤0̉c‚íRmt²/†AR̀ °&aôÛơö—¿üe¯ûëå5‘ˆ²ô%d^Ë̃™̀qá|Ï,„Éw/ôcCuÂÀ¤ĐØøL°1ë“Ú ›5@{X}J˜Ù) @¸ÉLÛÖ.b‚U¼đÍ@]Œ´c}-[9ŸÏEËårQÓ¾Ó‹§˜"“¹çYv¹!=ă߀ë=¢`œÔú¢µ-°û=üîhIÇ1Àô!ü`·‰¶Ó§OŸ₫ư₫ïË‘†l–:·2wD+¼t@ÚS?LÑ®̣ÅùKÖä|ǵçöuíªưùO’j[ÙnûM±P¸ñ‹@Ûøh±1íÛ\EûPúQ¹’,HÂS´¼˜D&|ÀÉî¬[R^d4K1KưÏ??Ÿ·s­ơTN=Ë_‰øWlÁÔ´ƯJßû;Æm*Ïüt²ÑIHBp2iœ)Ṃ¯kTͨS9ôzIđ܃q́¥üYh#NG°(₫WTc.RÇx+üt‡ë 5ŸüNwÉ tQ¥ ¦¿…Ë£̣¨øÖ7¹¤)̉˜̃y½^ụ̂2 ÛØà.́¼XG ó †ä%-æz£¯Ôx®‹,<¥qUô¸m;HLçˆkVK[BfQK „= ¡dVÁŸQopO b¤́ü1/6UtA×p*fÛÛmØï_¿̉¢ ̀́¸ÇqV è†̀{[}y¡KËHDDö}o¤»KläêØüI´€àc–¦&–íëßT¬HVŚÁƠÀ6&ôLÔªUk­ưÄ?p@mo3k’. `\»¡n;ÿô¨b₫où?û±sn_|̣WøÓ#§uƒ),3OÙçCĐÏÊi<Ñrœ²j`ç»!đ6æÁ̉FXp"§¶ÏI_E₫hÛaZꌛƒ£Ü§Û̉ôư ,ư»-®cAjZ4†¨=X:¹Ưnû±ëHœÊ¸œC€æ$ !zAµ‡Ï 1VŒuÁƒ£m̀ éÈđk„Eë‡ÅJiÏÆ€Ë륵YŸæ~0®ơ¢…×@\u„<=>mÛv¹\®×k¿sJ!〖Áư®Å)2êj;÷÷å¿ÖYë窪AÿûArm€ôÊGƯhtÉÈ%#xâa "îù*'+fî!ö‰,́<• [ˆœă §E8‘rÁ#˜Íáu6bé6ÂZ6–;Ï1€ƠJ³|€˜™L³U4¡ª²̀›@3”… Úùn#†ƒq> 0gÎçû»øü̃€mP-nĂÍ=zÉrïx#¡v¯•9 WØ%úJÀÄÔ?¾§²zĐØÍEñ¦12vNëˆøÎ$¥:–º!€ôèâ{—#₫¢§Ó©HéÛ¥'Ư”ˆƯ¹ø/6’,Ô&8Æà®¤oä‹Á¯y¦‚á·"̃Ä5´ÏØÿÇWĐđ͇Úúg@́ăNL°6̣~ ‚]€%˜&gÈÑ×0¼f=0ev¹%cDZï{˳HZĐy\©\¡ưñd̀wè_Ç̃G¤>Œv¤­Q$rOÛB“‰D²i₫-‘¹ÉY¨d‹êc“y’³x³ÙïD˜x'·ơ¾ư‹đèˆ9€áÈ¡aéqs¿·ŸïÆ1Á1măñÖ@đ‰ø30ƒ_€ôq§ăPN¤ù́íÊÎk±ăBˆ^LNÛÇhb÷÷đ9­ĂĐ‹7{iÎzµâæ÷“€1b‰&„·Ü¹o.SÇ¡ØÎFÏ >…tÙoª£%́FsúĂŸq@àù4<(dCÜ2† ¦Ùp2uZ›heîûnƠúN&îp(9¤|@g‹‰Èƒúë^¾ ›bÿ~ô‰¨K6Ü^+DÇQk:²ÎT´Øđ±¥5¯öoTªƠëëS™™dø)™‰ñgE&ù³tN§÷ïߟN'Uåí<@²́ü rK<Ç©z:ÎTbÊ¿Z-! x˧†h3ĐZk-}kê–,ÄÁ;ºG­F€‰́W0 Üu¼t’…™mzêr̉¸Û92××ëåơB~ ïQ°|ø~ơ§¿ËÀ{¼̀‹ËY–ˆ#X;}ĂăLLöÇ̣22–Ơ•g½‡›A‚¦(Bhû¹9áfÍ́Nëࢰ“A<î¾SSÍvµ–‹®à’ÙzçN¶IØJà5„½ĂÔ#2)c}r:O´Ep•ú …°À°ưŸoÎåÜq¥ÔTÑz­î•’O‰8,ïÅ«ù{%ơ‰£0{üÅă"SI4ˆ5x…s'‘`Tƒ.«´µ³?C²¦ă$à¾[K%Äù«åÛB–FJÏBă¬Çđơc¿§W#ëB{/ X^w°D˜ôȼÿ;oÈÛÑú³$Q½·̉3₫cæXàDpÈÏÚRmÛÜVß‚iÑÆñj.›ïTÆÊ® œۨ܇æQ\»:¯ ̉>å¡í̃tŒÑ¿ñ Örá,¡k΃”qs§Æđ±q¸QU6.ÎÈ̉ê··XX ºĂ _ꤪôçùáüáÇ?><<,µ ‚— /-́\ÍHgæcB™÷Æ”iø{"ä¿(ư{ï̃áQœ‰°EÎRM²§‰‹%2ưϯ[u]@ÀÿœĂÅr<æN3 f&"Ûi;=œÚ„û¢ơwđ:µ#¬—]Óœ$ëiIZƯ ®–Wß`„cƒ°ÈØâÛ¥9Z„Áô½̉.ùféÖu¬ƯêƯÁ¸qŸn.!¡ń騙 è•ĂJ~dqiđ>Ư§4±ÉÈj8¯oư)†ïè?v©È—Û‡95n„|rø¯€M´3bÍqïmÓÿ¸ö—7ư@äÇD ̃'Ôƒd¥ăÀà̃„@º€Á’›¸ww’Ûà…‡w^[騳`,q“€1}§ÿ±ë'Đ/¹vcëXh¹đ¸_º7ơ$Điarç.H¿˜ûG,¦̀Tµe(¥­ä¼çêcû”.cû`zo{uÇ Ö!"f“Xt¡ï't-¬€`:xÈ£C .!© ¯s•ÄßXg›ü×”êJÔ8(m¯ÑSà/í₫±³¥7:Çh^/ÔAƒỤ̀©€˜‰Ë•Qʆ‚ª8·dÔ.Î!=ŸÏf&UÚF¥!è]°ÿë“ăû72aMô¹J¨Ûh ‘¾tØ7ó\ÈM/¥X‡Ó\y)娇ÂŹ¬jûIDtb"„VÏöö¶r 9<ƒ₫Cr̉L ă4Œxú0ß°`­Ln·Û·oß0()\äaăxƯH<܆Đ_º¡ü̃Û̉§°û>qêÆ `¼HµªUmó9>,#Ăj!ïC00[¥¡³ầ¨¼i eTcúí!=FBWˆc5³}ß÷}ßÊÖM*È^ú3}¶1ơÔª‘LJ #iÛÍ”ĂXU¬¦˜®%¹`i–<–‰=²²«qỤ́],6)fđŸ˜³ÄÅI¿@h©Ÿ:̣©îÍ9(¥¦úSqOtö[®ĂtŸÏçÓéTz½^C™d¯ºS7Ô2́sîñ 1-ª;+­Áw/£µ.6&3ƯÚ™½ÿ¾h¹¾^o×› †̉añ(èLÂÆqcÓX́éÉ5Áî“lZû7td˜RÊâ‚dÚ–ñêÈ÷1Ë âóiĐ½K‡—o;ÁD3$™û™;äh6©-Ht?=‹Ùn]¤ÎXÂĶú»€™œ!®.·í.'±ik3̣½ÚcßÏFÓô­?ëqÔ#œ̃Å^ú@ªƒ‚₫ ª¦đ#‚!^¨ùô¿_áÄí³Læ.›°{Î.c1ïnÁ¶ăá“₫Îư«G\̃Á̉w³í'] ï|>oÛ&"ÖObèTZ{Pç<^đ¸qñ̀$‚Gƒ?ŸÏ>|8ăr¹´í¨§=´kưŒmxlo‚ ƒÖlŒpoÎû‡‡$¸§4m‡:I#uDÇ:§†N”è*…7pZ@K0́1™kđ7²VFßƯeÜM‚SøÈà/Éå\Üà°Ñ®ôSRÄ’pBT…b'ńétúüßÿŸOç₫÷ÿ₫ßư»ÿwKï` Ü \ Œ÷taŸĐäŒç\a1ĆÄV¿ưÛ¿ưđáĂårù§ÿưŸü î¡í6–FhQ©î'`¡¥¯Éú§x@Æfö}p+ṃøµ}EÛå‡YP5÷'y†)@F„&å‰pû¾???·­‡xW¥€JÓvr´f̣Í,j)èöúëb4;„ªµí¯Ÿä²ÑÂ?ëË1i`fRóÑ0gŒØ´mY¤™̃¹´)¹̀yÖ‘>äP†HÂÆ1C{Ưízụ̂åËV¶ư¶óư1Øówè“!\D lB¬ÓµƯ·}o:1Üc´ç#±²ÁMŒû³d,(br¨ă>$±ÜÂÂÈ́Ñ›ƯÆFPÎÖW0d‡‰hă{.f°<¬65Âëа*1J ˆÇ@?¥ ¹ £™»y&„đ\`Đ´˜l`ăÈe°'"Zô¯ÿú¯Ïçó_₫ü—_₫•Æi EÍ 6üT›€uFS2"oW­ơz»ú6 Íưœ¬ßÚ$2¦™ߌ*! ̃ĐiÍV£₫ó¿h“ ưO;÷ÔC‹j”¶ưI¸Gƾæû¾;Ö¡Å3’ ,È>u¬†:@6XVƒÂN= Ơ31FÿíßVí²•G[„Pºßö}ßÛÂ_Giµ§̣{D4ªjn.8̣IơöFQQ‰ưÔi˜ZL°²çNI²4¢8„i-–«nÉ)́Ỏ+"Ùđ́ÍØó§o÷y:ơ…¼Ú7Zí­­N{́.Úf ÚƠ¨¨‹5bvt¡^¶ˆWO»÷! °Ỗ₫đøđñăÇưØÛÿZiíỤ́W$w9¹P\ẉăH_¶i ¬S²-­ăTôÓÓ8×*î uơ!lª̣̃¿Ơ›†í̃Æ’(÷˜w™̀ÔÑá¶bq|$à´8©} pub=  4ÆĐŒ#dđÚÆä@øfº1U)åÓ§>ưø»ëơÚÏt́H:Œ·uWJçÛ ÎÊƠ#:\ WJy||üôéÓù|.ÿ\p°pWµJmGÆ4€^µ.cá¸C;*²@3û.¢caP ₫Ơ§è ¦¡­ Ÿâ ‚É’GÓ{€½̣½¼|«æY>¬Ç|_\: nÉk5#ÂùJ†¯ñú¢̉¦"¥b)Z×§ÆVñMÛÛ2ñZÜ£pŸôÓ@é0: zäè~µĂ d§Ø‘óưđú·Ûí&7Œ)0z̉DVóTÆjIü],ö©’±ÔŸmËúÁV̀U²©Jiħ?û@ÔémLöß¹î₫„@bt ß ¥˜W4ÆSÏƯ{̉±œđ´Xà¾r±íí×׫‰íûîˆ$FÔ©«sï\<O‘p\î²tCF;î¯_¤ZJùøĂOOOÏßƠ_“iºçƯæ̃XF­ a4°+26®ÅS®‹â~3W‡„у³¥‘ !«Dá¿ĂËâ]|[z³f¦°ˆ=Y£¾ñ§r}:ÎGÿÆ,G™4Tî+Nú>Ñ·á3Z7©Ó…¼óOăÈj­ óù¾Ÿoúfÿ¤øàûR ÍÏ;„ÊR&5d›;d;mçÓ¹Zíê) ü+ó§wô1d”l¨ưf¾;~n…Ñ¿ïø©†‘̉á”rWó¤í\†ŒÅ‡2)ÏÎ%æÚăÀ1¹”ä©Éóét:?œu×v4AwÄ4¦]ÓcA·Íyÿ¼@×Ïnk—£†&µÜË‚BtEYƯí₫¬#'¯Ï’aM‚çX³™©ÿ‘R8OƯï§9„£$Ârp î/NÓ2=&'Ùú<‰–~€Ï2LlÚ̃_Uß'u“¥œăOlg¥̀™Q䃛–¼AÿC“; Œïê@€4›‘”)bÖ>±¢‘!#MpTMt¦Q:“‰ûñÿđ¿₫úëË奇ª]äú·5ƯDÿ·™z¶3 syœ6Đû¹ZK@ô™#“ZëÏ?ÿ|»Ư´(̃̃G™·×1‘"Zµ4î¾5°Í ŸđSÀFimrC€ÍLUú†B˜gçu₫¿vÊưPFµÔ°©ñfLô!vÓ †fæ(™"ơÔ¥iB@Ø)FL8ÅẺÅÂÆñaÆ₫}5p­ºQ̉Å8!¸ùmsw¾xLùÛdË8q{2Ùùt~ÿ₫}­ơv½Ơ£¶ÁÍôÿr’7®˜)ºµ˜[Z„c2ÊKÓü:wæ‘ä"f˜ç 0W3gf+ƠiKÉ›{rW`@³¨À2ЦĂBκ›{‰›ñèø¶/Åè›"™g̀§ARt˜¶û¤ø|¯@­^ơ5r?‡w…åkü̃ĪƛX•øA— ̃ˆ¾ƒF­]p«íßÄkEQ+´ÊêĐÚ÷ư—Ÿ~y~₫öí›Ơp2¦mÁz°,½P׈vÎ÷ ¯f‰âÈ025Fg€èØÄ©GƯè?¢_PT°BĂ0v“{e] û(+÷àrJè^0Vñ'ĂSas$ 4káªz'Xµxµ:„M„Ƈ%Gà 2…½Ú-ÿø̣8öquôO{ÿ»”Öù¿1/Ή ĨhèvRYÑ8i„R ºm¬|Êđf°b´–G̉9‹îƠof¬ˆ êø'ª5îë“,c—Øf­G?ăLˆâ¶mm ̉V6Q9́¨G=ö£èVƒywiWÊ^#ÔGªú@$9q06f¿¿=k¯KB˜ÆÑÅLGÖ“·œæö-5 .ZÙi JEd¬ ₫{:-üêƠqB“n=FºFB6ª)pטVẠ̈Ç:I[ í₫̀¸}Xƒ9#C¦”6ƠJ•„¼ô{V ~•»bX?>>¶ÙO0²-̃s-.û²Ưr-zÚN͆ºäÄPuS,;ƒ{!ô<>¥LC8æf2˜…dEvyt@TƯßkÈñ;ï¬ñz"’1åzWOTbưô»O§ÓùÛ·¯ß¾}ë©¢F¾!·»p†̣Td#OàÁPφÉlñư0S ¨¹áẹ¢-tÚñÂÇ ¹rx2Sg­Ÿï©•PJXB3Ó íÃê¿₫á8•ÓívKèÊe,ÆCđ…°Áz̉#´'öA‘39T@`-HÜó"e‘‘FT¨^ÖXaªMm_àE‰aü¨Sªa†ø}·FÏûLJó[‘€øăTÀŒCÏpë÷§Û̉Q ̀`¥Œ₫àë迌ú(‚¡c `î,&¯î Í¡o½±°C’x½^[₫cÍyô¡†©Gmbˆoñ•.«Ëó"›CnÊû×ñĐˆ ­¯´Ñ‘“ƠVưÏç–ÓÎcn˲3úWR7N¯è/ÂëâFL¡À×ëë~́×®¨jÙˆÜö[F°X+)ƒá^!ôOµU*ƒMPá^nKyú\=Ù¿_«ÄÛ8̣ ÚÑ5䀕ǂ‘Å™æOç+…Âo_6¹‹…ÑÁø MwL{K#l81îs;>à^ív ơv½í·Ư½Ơ–ÑTJÁ¬]0qªe+mƒS7hC¤Ùûç!Wqö¿ bÀͱƒ;b < ^™ÇYz²“]æNçư7 qÂǵq—¹´ƒBæ'~æ8p-åwàÂÜĂ<´ˆÛoèLxpÏh¾B4Dùè´hû-•CPâ×-Ï4 X_ }Úºïk«‹f&¹êẸ₫CG) :àJ¦‘‡óĂ»wïÎBMV |a* g¨Ü₫^aè\E]ßù†™nĂç{¤Œ•= »7Í·‘0†«e—"a±%ŃFĬ‘=Ï/Ï—Ë¥Ó̀¨c\s䜄1¢íÿ›…åĂzpGzAMæP-F›'e¡¿o)fúåM»bH#a·dS±o^Æ^¾oƲ\°‰Çq{ÆÜ=:~vñ^«úV{cër|Å̀œ®^Ú¦‰Œ,Oø°‚₫KX†ÏîÔd…™»å¿9å|[ 4Ü齤‰´±Ï©Æ'ú' Æ4Sêùs±,jZê¹ù)́‘·¥71w«¬Sÿs%5ÂDÂ1÷ê€Y8ô/³8NnăØ7k¢Ê0è2±%ƈ₫˜#Ûđ±_;­ưm–|$P„o"Xb±7[×*1ƒ©ª‹åm×>üđĂOOO¹¥2+MBub¥ Fs‚ `yđI%́ø‰I–‘Ú̃*ÙÂ+0â"̉Ó±÷ßđËtÅÄ Öc„j+áïÁ£>8~ÇçId•Qó!T¿Uß»¯¥ºy€pFŸŸNçA?ôvü ïlè½m„¾"˜}Â+{:Ç8û³hi‰æ}=›…öÙäùá‡Ú¦Z_¿~ư¼îçÊaL³DÑ̀À¥"„Jh ¾o}=í¡1”$4y(@ ë̀ZÙÈááÁt́/¤c+O‡Bô%ăpÊv¾̀V6?YÈhÈ+mlD³m̀ĐE!ªç<(YlàNƯ˨=EÂ\x[ăá7?Y,d `/„§’éYÈpwr¶ëdŤڢ‡¶å—›¸ï9‡1Èh- |EWØ×L¾}ûv»Ư^__»™%ÉÑEuß́rny³ÎđFÆ‹#ơVG~?‹%›/±0­đ¼Ç?'i °Ợ–Ü^בû‰Ë®h˜³U—VŸ$–ˆu]¯ñ́è„>mb­¥EEËVTô8$Ë‹×y®U'5ˆ®ëK̀́çè:<”F’BĂ=́CÿDdø …ÛE”Xf+çÈܧ‚# h{„úa™’údV@ÿ]Ø8¢&ôØÙ¹XèØú| n ¤›̉Oü–á4ۦεncí¯Vưösé2:%ƒ9D­Óơ7æä~dR¢<’qècoLĹ®¿m£Éúª>sÈñœ ·Ï9>†§"¡…Q#¿ #ù§/̃©?íè>ÆËá{#Đ[p:me«Ö3nû ë1¼u´é¾«¡ú¯˜g`iá°-誰rFC9–‚´£‡€û}¬è‡J)—ËåùåY‘×Q! ̀œû§4)€¦e'˜?‹ze¸(_—`‘€‡ -‰Ó‚uc0íÂ3°ĂçdÇÖíû‘@Ú5¶_ỄCØtñm´¯?¼…)ñ¸IÎwg<§5p¨†úéc#@$°é&ˆ8«Y1ñâD§ûƒ' ™•–vôÈ„vîo1°ckçư‹ô¨FªˆlÛÖæö}PàíAeD :²TVüƒ(º?y0`‚£*Qưíß₫íûûoŸ̃¿ûûÿåïÿ_ÿăÿøơÛ×¶Vß¿uœ›„4ĂG–ÆèÍô1&OÓmÁ@`ÉY "̀s—0ñ´RͰiư8̃k˜u`±°¤-áƯåớ)ÇddvúYcB–W…÷`mÖægX‹±ÚûVDÚäæívGRmï]79̀%N¬3H£ ë(5=¡rRá»ôYƯdɈ¯x}yˆ‹ă)‡]…i×`vÉ@œèg»Kw½^[gNn%`htFÖËWpn?ÄÆ["ç†2̣[`‚xfª 5t(ƒ– HuÑHZ&6§, ÚâÊ´ÜđÑJë4\IeJs×\ÛPŸÁ«åÊ@Zߺd V›ÍcbĂ­h–d—yz ;S M»r`´<#H ¥¯o^¥Ø±èf%•A’ íƯ>̣­5ÔÈ œKˆ[°JĂjƒ6Ó;IôŸsm(6Hª%•̀2Os\Đ‹ÑTơ¤Ü6₫¯GOư_Rÿ—ÁqÉ÷Rÿ½>f©b©zfîßY%½u&&öíë·×Ëëơzuí0wf¸ "œ-¼NT#!æq/âÀ̉ï¶=¼«GÖ@ăÚ©̀Ư=p N§Óvj»’́Ç~ÜÛ~«Ç89'6€¾º ¸kæuç΃OèßuO!c¼RöÛ‘ Œuñ¸ rmS?:!*ŸĐ?vütôO"ÑH̀FÂơơyT¹ñ¸øÎ̉Æ¡NLK»9c¡!¤Å´¢?Â7gc¹n÷/ïḥ“kî?Èq°Û–W"ĂÆÿÑÂĺ¥ưfæfÁPP†­¼ñ]ÛÍØ{ơĂh/Xæq=ÊoåGvk:$/ÊơÄl†«îú¥”¾©¬-ŸÁÓzßg÷}Æ‘LÈ¡ª₫oÓLJ‡?}úóÓÓiÛúÂè4&›Hâ₫½|èÁSÇÆÂŒítü₫q2ÜŒ“›.{«¶³~«Ô¾X; !m#S¨>B́hÖL$WÆ7–)#xG7 ÎI¼£ÍÓqPÛâ ÷qˆŒ̣—ˆ|©ÅĐ‘ôÎ(Ă”GV&H¢] ‚A‚( 5Eƒ Äî–¹ºêA»Âø¡}“ÂÜæ@yæ2¬oÑáÿ]̃żƯ-‘!^r÷·ˆ+ƯŸ‡₫†‹¡Ơ¢F¿±º̉̉÷]x£s€q w ´×5ơNà{1a}ÆLfeaz‘ĂhfKLG¢đB5b哇̉»ªcc:?!ÙLñ#ƒ 2uLà₫…™lD¹‹!½3ßỘđøĐŸ~½¾¾¾¾†bG$Á_Ê<Ñ3”±7©ô°Đ“ÚÎ?cïNưGtr„ÊÆ÷Ü|ù†h|]0*«̉uy½è+ ˜„j9úơ‘ˆà9P̀Ï rAb³Ù )¥œÊ©ç₫”±iøHhè:^D> Hi{…><<œN'UµjØ‘éØ•¥ ä>„g¬uí#U=³zîđ@ïv¹£ß/½̉]×j/ªŸ H³(­ĐËår-cßv”cyÇ?ûÂÈâɇè̉Væ N‹‡Ô#®fd†v+¶h·/Àå̉ùSŸí#÷l̀·‘2CÛ¢½áÆœ…̣dăLÏĐ}†!ψá&ûưu!HÍL₫ÛÛÛđư8æY&EK ø$-&4m”{zâk̃°L§Ăn[µI;́¨G"ñ*éÈûïªWX;÷ß]í{PÏă jĐH&öË/¿üă?₫ÓëËåן>êÑ•vĐf^»cW×=p°Yï=¹£d‰ÏC[–S[:¶Æê¹†# •M·>™3¶âíÓRk­G9J-m̃ùTN²…ñë̀B²J8‚-F˜Çpư¢¬JưD9=©kîơ\đ%éh°ÿ/\íEe₫z-È} -‘>Ä´R,'¿/Y€d.7”́obî1ôí~BH ou~¦K¦v`R"ôpäà–̣ëư­̣àÑBẀñaø&nÑơO äÚ́5‰–™îB ˜éOàIĂ[,&".ÛÛz4ñ_åTNÛi?ö¼Ëá<(Ôê€fĽ*¿(üIwJœ™ß¸è<›hÊƯåy€ñ]Œ®—Ư¢úôôôôô´ßnƠjg¸c +}œ/sMn´ ơ_Û̀ÿ?xïß fUÿŒÄT@Fÿ«˜;E%c˜mÙ.Ư÷ơeɰ˜Xú'¿4‘\³Ü.Mh–ÛüsKàéÜ¿t[Èé í3xXV{:úºßRé¾₫×£¥o!TO“Ẵr3¬½\̀¢̣̀LÖSö­Ÿ…z)̀ơ{yy‘±NùMïåY‹tRc‡Cf'N<.9mBy¦ÆùÙLÏÈHLƒ÷ÔÇLrœ›¦ÑÈñ ̃‚Ï ˜yJœ¢Qö-b£̀'Ÿ—ç§ÄüKï( ÉÁađ)è“2–»×G‚đ1´´/@.R^^0FĐ—¤y˜Vù€º™*ç(ĂΉ́ß—>uè6dt…°5µ/ZZºN CÛz¼´}h/À"vÈ@3”¯öm'ûƒ¢åøă×/_?~ü°ßöËå•gpÀ ¬'…’ÎÏ\i?3[ ùÖ-‘Â<¿gdÎÜ£Á‹¬ª)ö÷¬¥²t1@gô«Ví炵I§¬[Jb%SÂ÷ñ²•÷¸Ù¡m‹âƒ˜SÁ÷ùóù̉́Ê©@̣(̀HÈïW2µ̀TÙ4RÓŒĂ§!R`ÀI TTB©ÑÇ_S'èØơ_À/pÇÛĐK O%Üïqœ6*Ó, 6“`ˆ̣ x–‚d¦ư5 úƒøà±N@d·IX ›s$̣d8â~hz‚È­ÀĂæ†KăÁ–ƯK ÄN01Dnü ]À:Ơd‰₫QNœ¶mCÜ“Sj9$gè…X¨ǧPŸ÷E\©ÏkßS )€u&)‘’&²¦z/ñJ3Q@_•.Xâ™Ă¼¡_iö IWOΡÈÍÉ Ë![ ¢Ô ]alk­cyé̃³ÿiƒfwܸ†‚ø₫”̉Ă7 €8‚Hb<Úÿâ`Ñzkœ-t 6̣g8R)Ëô—ñ‘4³5Æ= %'£ê‚§}—?,c… ï_̀÷ư”AƯbÉïV¶²ơ­)Tyÿmá¯wƒïr7$ăÖf,ØíÁGkl7X͵÷FØÏƒc?p‚Xu063eÑm5Ç ̣Û¢#U ¶Œ½[ÿ4Q<±ATu×·“‡5!Ñé€Iÿ&m’¥ílÚ¶i 9KP̃éù¸p`ô;VQ難丿8wdBÆÑañ}v»Ï]eʺ/‘ĐEKĐÏzÂûÖÍâV}ØâH?€̀Aø0̀‡ûÊjw$[ør–J ´ï=C¬AÿWđô©!ÓÜÚ—özÀĐÂ#Kü"́¨U©½\.û¾›Ơ¦$~Iµ#ZLƯ©–Ù%ŒóÙ¡tØxL‰½S–3‚ñYƒđR(¼¯0?~¡Ç„íë«Ûéí`“mÛJí̉u'¢#±x₫,{5Mù$ ΨfeÚ5E…[sA0ĐD¢W—ăq²Ëü®EsơÜJĐ(?lk‹Q±l.5;H†Ô®³u&ee”î]x̀x ¤³„ª™8”ɺ‘F'ÂEE¥jäÅ*CÎy±¯Ă À¾ÀĐ|à}ææ¡œÍW@·º» ÅÁ SŒ'È QÚ+”ÎÁxÁkºT° F^ĐiéI® ê*nßđHFKăY8o7®÷º¥wMaÏèÑ)¢ª´ßöưØ]§Ô¥EÈÄå̉FwOçï?œÎ§¯_¾‡OöºDY+ĐÈÔz°:₫uoh#ÍÏ|w ?¦w\æ1÷•âô¨ËfÖÜ„™5üÇø Lj“p&O Îù³£¢ªeë[¶đø8Û~kÿóèb™Á}Wüø0ÛbÓ¿\™ifÀ?q$LRÄ%@¡2ăáÙÛlBgYêOúSlƯ˜ÓÙU*¾{OặE'C³/ë½KJ}:~ÿûß·Œ¯}ß›©ï«±oư4†.CµKI× ơm­-b́âà[Ç/B Ú¾[rf]G'PÁ½7‚„(D«;€̉ék]Œ@µüä ov¢ © r ÅQ¸Ú…­lí₫B‡ „àrôVrcIÖ×—¹zÛ›̣#¡¼4›,ÑôpÍßè†;¡»V6Á¥ß̀Z :W‰ăEn8>àˆ€d8<ÈĐüQ’)¾ \czÊX-R¸íOƒÉÅêXÜnÇ­.6g¥k{¿3Aë8Ûơvéqóˆ,CaÜ™‚äÜ“©—y¸-¤É%³ÀÄ—Ñ8H€=D ÅûQØ2ûÖÁSj¢…0 ïr·:;ÚeÍïç'V›]NîđÑ]!PêĂÙ,̣¿1á0©ù<Ê:¥ÑÏC,QCaL˜{€Öß0q̀±19  Ư¿Y‹ †ơ²Lå@ëăùj;êơcæv±­‹±tèœY¨)’9J%ßQU~üĂ}đ¼•ï7ưÙ¶LwQí4SẠyÏ%1H<¦Ü5JÜœ…%QmÙỜ̃eëTuÛ¶§§§÷̃÷M~uÑ3f?M£6‡F¬J¡µKÅ]™™.«$Û͵Ö×××çççËËKĂ2 `ÉIsẻ÷Üơ6₫o4hÛW₫Øcï3±}+g©°±ˆ̣Cm)‚eƒ́Ñ †O[¬pŒuÓ€Ÿ¶¾Ö[ ƒ…Ú…“₫MÊø2ÅW÷µCïé]ưcSƠ^lñ5Ü(ï=m§§Ç§÷ï̃?<>´–vîÿvk{²…²×ÎÂ*\Ü¥EYÀ×È:úkó )@´~…#|+FÙŒĂ@<¢×ü˜<e}`?‹ÂÁVª́FAŒMeà¶₫>Ñ>¤m´Úf‰™ĂÖƯ î¹êùÊ8l æïEV˜F§2c_Í%°J8ÓĂ1ĂÊ\f$! çÔ`ŸƯdS(Ơ± Ă}ădb7£oæÜ¦.Uñ¶̀Q zUß¾Óùªñ“G£smău3×ŘO¾4_´0N¸[Œă…â¦üÍ÷Oº?ra(gâs*üo<rW8/¬'̣Ràă8êQ´ôÍi7‰¦³áظ!KÉÍà³óCo Đ—°Æ'íXDבµ•Y1§¸ZV¯Íư?X¡9₫f½'dÖ²¡XáÿỒ»}kµD‡¡Q́|wV\₫]XỉăÙÂ₫©¨P™Dí'@“âF•…[å¹³Ù´éĂŒ̃l-êi€tdwtbkxC÷ïE¡sfq]¼È2¤Ë´zḲ\à½N æuRr„Ă19~rùQ:Sƒg˜₫‡œäpz¢ö̃́2iđår¹¶µxF‹̃Åüº|÷̉‘u±yÆÖ˜ÂüöC†³³^pÍwÈ»p„›gl°°\ç‡Ç‡‡Ç‡²•·mǿ§’T,»= ˜Ä{ö¶¡‹ª·­CÍ‘Ñ̃˜¬Đb×öW Ó3ÿ[æM…!̃ï_Ưÿ‚cMÄA¾·ºöM:·ï2À„tÄ£Ï=­c=tµ÷sƠç̣x²pÓÖ~ä™™™xœ úÎÙhœ\³^W¯ÁØi±îÎ)ú&Ù#pDá–¥(®ˆj´wMxvŒj5 ó&6„ÉÄî?¾7Z̀: .›€%ë/ù-íE¨6ö¯´î¹ƠXÅéD'»¥Å*Ï­kOäh©5¼Ø·Ï}zXc¦¯OXăÉ ;Ç:·ô«Öz#, ‹­SÔ‡¬F©¥EÊaH>“½ªÚ?`Đ™T­àm₫x́Ƥ!†Ïe#"BT8 ø¸d6(¯ù†¡ü ?ẩ«®a G.ÀCNú9¦µṼ‰UGEû¦­ж­ô nµlåƯ»wÇ~¼¾¾²7¥©D¢¾¢_TJÓǯ:ö¡rû̉*®n%¸4æµ³ kœæ?ñµ¶¶wqBÈtÅ,¤nÜç|C¸̀©›W2jÁ—$™Äf¾1g—‹âp–Ñ–ÿsỊ̈ë]ô¾Qå ËrMÜd±©·E»̀¬å˜I²–©gS?̣î~M.:3לl LùZYB†>:Ïém1ÁßAơú:– J©GHÑóœh¸c̃ N3¯„{£Ê¨HP¦_4ë[äEeSFù6>Ä*³„̀bĂ`®¥Đ´$ â¢NàÆ©cê-Zªo2sÿÁSp²Œuç,ÖîºYcÀMfú\}“™i ˆ6ú«J@³-₫å}?iăHëÙ«A;úï:Ư;$ùtG–„È×lº=>=ªh;̃å„1ä„ô"ÓgœÎt'FîL2ào¤{˜gl¼Ÿ.:²Yp›ÈjX”‚ /OÛ©lạ̊z¹í·FƯ7Üß6cÅÂH×_JCèºxcû{èäf£dÚ ˆÄØâ…ƒ«ƒR€Zuû1­}2Á©a(¤TÆB¯Đ±_?C _ƒ> J߈)´¦¾ÈŒ'pUtl:®ăp¥ó„¦í¾(‘Ÿ-™6–d’„¼N°køvJ̣V̀jfĐ•ùÀzÀ@₫µ¯ød “÷JiƯj• Z!¥j+ÑØ(V}˜™èÛ¿À§¶}?ÇTTˆS«iÉĐ­7ФZ ÛN—*åù98A·̣EÛ•đ…¾›'“¸ăP0Wv¤á€η°î ûWZHđơ0Cb₫"­qO2D7!œŒ 4F³ö²T„¡ç˜$]chø%hµÅ¾8Z¡­Èo1@;7 Ôb›ƠZ«Sk5±²„¸4Ă$ÖOs3:/Ô%Ϙ€µŸ67Đ”,ëcđm±Ë¡ª«-J̉†’é€i¼8$Ă³°!2hΧ§'Umđ£äÙ:)媆Ũñ ̀8&)Í|NÇMå+@4#T¥U Zr|¯}ă],ú‡¶³5œ¹0‘F¿µ£÷ØÓˆ9HE­ÓâƠsWH”°ÔŸ á·±YæêX®5ßç€Íï\¬óXö}×±î0¨©@’‡@ùQ2…W[d‹=DWˆ“¨/ ÑЇo4‡Ư9Æ—ƒ–đ\›hjÙ­ôx€¹ú¯»†Ú¢]ZFÈ)·IÅ ;¼\a¯T=j8–æ̉’=ϲ¿›ª?,gZ6»ƒ;Ư&úçktè‰Åè3[am—ag—ض°ơvó:6Ù{£¹lû¯n3”¡Är®…Ư5Œ¤MƯƠ£©lóÍ̃j[—Lµ w(íûÙöÊóư%Ûæ?íÿÛ$€Œm³( ơ„%_àû)\ñ;Mf¹] 7°Z½¼\^./û¾Ëu¸éÉußû—®XÂăÁó"—]µMª°ËpÊjœ©,€ ăÀ¯~•MLƯÓ~ƃHøoÂzô₫®›=6‹¾„Û.c³ $âJ¥“ÂÄ­7¿ỗØÙ¨‚ïyÅưĹ f’„^ÂH—J§gœfÑ¢’k[o|sof-¤ŸĐ6†Ç~`Û‰ê¹é̃‘j‚ÆØYÄ ̣øæJ„›yV”o$û ×Ḷ _₫,í®ÍüS˜]a¬@¬[ª[8}Vư†0´O 3(=΍ôS`¥b¥wµÏ»ĂÔ©eF<”„€ôEƯúÿZªƠö̉₫¡ º¬¯ë¯Z›8UơD Î4˜đ=leÜƠQt§ro:Eg ºk¥8Â]Í?mÛfæø%Á»{^½§MË7&¦çwË¢"؃ÜÄtLÈ0XfG=¶ó¶•í¶ßn¯·̃öªm'¨v໌ù%1:2³+Úmh‰°m‹Ê5î ô'#tƯ”ôµ †£}đ/§»çú´W<>>>=>íÇñüüœÇeUó0‚÷%Àm¿í·=Ô­q“¼,,Ñë̀Ü=¹ú¼’÷̣9̀•MîÆ¡.rr„ÁÓỖ¹ca—qWú‰ÉB¹¯_÷Té₫q—´MÈ÷µ²=ö#d±h-#ŸñÓB)VkfØÅ¼ZÉB«¢O§ÓvG;ÍjÙcó•`7:ç·„¬‰‹2ï|éÄ()µí3Ëå5Ă´=â<9öÛUƒ¿‡1,´˜¤—ä‚ )‚íVÚO-ç²çÿ́GgÇü*x:Gÿ‘K¾[[&̣(:pÿñĂrpûK«½\^̉xyà¡wLvü–û'r^<Áø¶K÷4û^4¦ưP˜Ñ3©·|!lºmÛ¶‰ö¤yFÿs£¸æ:rˆüEƠwO Ă4Ă…âvN¶̉tcªÔơŒâ[æY‹ö\‹RÔ5‡¶¶7·=b‡$pc¥̃ûqo{ß&¥»»·¾µ°¤ÿök]ë€wJ“°E½yăç±IĂfœÇ2ƠgæÀBwpÂOYׄ‘ Íâb!®@ë÷[êw«Pî25ÄÓWHEùO ZPÛ² ùûo‚̃„Ñ [’OClX*ĐFN “₫àíLđSÇ ÊÇíJm̀‚aGD.?6ÄÔFv–†r¸— rFÄ%JÆ*‹v,æ₫́€& ‰p_‡B+³j€)oX kĐ'o—À(ꑇ¸|œă#(FÄ[¢̃Û2²Z«n>wyh5©Rµª•1=júă?₫îÓï^_₫̣̣đajÚkPØNÔ(ËĐƒ–xµKơdÆ4J“Â%Ï#¡‹̉LNz:ä…Q—L%ǤL?D˃s₫@ i^¶ïk#Y‘3ÿj¡d/V‚ơ÷wÑĐ·Âû¾ÉCf®Àá ’˜Ư§tø`˘̃I\FÛ›öAV=ÔŸrÜäÆ`>T’uÍ⽤‘åЉÓB8º•+inÆÍqûæ`ơ®.ŸEÊÓÓÓû÷ï÷}ÿüëç5ẵˆ--"aˆ}"—œñªÀOb£ª¹¥ƒu₫«¿ú«̃ùúåøcËîƒ'íésx£ÖÑêhµÅ$î₫&0ôÈG‚xÓNI¦ÈUÀVÔ<ÊqV¤ÛÈà$àE˜!ZFËx †àÑÖ¨}·M;Y;¡ˆơ°ßL›zà¦å¡₫e¬¡aµX£±lRµï]sØÀ¬©X×X³´¤AË…o9¤¥¡ùp)w®ă~tƠÀ$˜9NmO‚î ± n`h—7u»MlIDMAÀß›åác¤êL<·a¬Û ̀QªºâÀ€{‡S.%D€•Ny9¾†9.!DäơO‡&œB…?Ê6”ÜG1ÚSøÎæ¨:Ê—~@i› OúùÁ‰ÆËfè{Œ©MÉ ¼bQóaZ„íçă6ØŒø}œ¨EÁï2NÉÁ~;*´É„•Äă±wï̃ưÍßüÍé|úÇüÇFI¢X¬‹uÓ0Öoô°$îïÁ«†) qḤµlÈ-¡(å!†Hă<²f÷[èÇç£øføª>ZcưxPm¬<î+OâBÛ€¼¥› á鑨Kc<̃ƒà©æẲÙWôi1Î4ÜI›Rÿw‰ƒ[µöÑ(Å_öI€:Ö…[1³í´Oçö%îËđ‚-¢`WEö0À¬ÖÚN¹gtëH1x §4B§²ĂBóíN& ¥NF/ùùÖ PmĂBëḅùƯµÖŸ₫ùËç/û·Z0‘dˆ‘fÓ„₫8öặzá„¶9n@bÉsxÜ^ Y¾#@<#{¬½J_äđ°‹zăAŸÍ¨Ï@I:QC£FÏ'ycÆßp!ÁüFă³‰û'J»Ç¨q@Ä·7`"£]Lư·ifö8vî5 NµA’bm{á̀~´l®×ðܶ+’¼0öuü,°̣Rá¹ƯØTÇRÀ «eë`T²Ñg’[î]oNl.ø˜Ơ—YdIø7‹®?Of5„=ÍÏ>?m§÷ïßÿ₫÷¿÷ô.•ƒ®ÀÖÂE‘±ă{ 6˜~hiưǸƯ…{erh|F>$$ØzPD¢~Œ~ÄÚßU–Ê`'ˆ 6Ù¥”¶ó±̉4Ÿª/?XJchæè,'Êâ¡Ù¢}_2íÎOIÚÉ@°kA*?&àoúOµV«ß¿}ụ̀åạ̊̉)ëßøLÊÙåP%]®ÈZ9;Åá-ÜÓ‚9y4vXøFưË&¦ÑRQ¹;¦Ơx¾®¯×—ËËízm ÅNñí«5¤ZÏf«µ¤ë6-Pê™À#9]\ö»¹‚U9jz»J¸-Ek¸·m»c¿U2÷É›DæÁ̉ºaù ûøfZk½]#sEœZ±OºiÉu¶Å#&vy½|ûöír¹¼-¢ ˜>ÙŸÜáF6Œ—ưư4Hàí†/ fj`âà4g”Fϯ‰;£ßë¡Y¯PVU)©`Í–ùÓ®–tJbWî„íP%[GVåRñx̀4NSzÜI™¾>6iÿĐçÓ˜ZHDîÇ«Û×—ËåŸÿùŸ?₫üụ̈́q°8öƠ‘CÖ@m€qC‘Î!"¦ÖÀŸ˜Tí ÜS̉í jH¤Ùæz®¿öñE˜­<¹£Đ„î,)çÇ9 éq^"Œ}ñÙ6Aư¶m;ŸÎMÉëµZé Qº¨ÄÍgâÓl̉O´µ’Ù«±Ä?5æ¡ásM$m#å“9H$‘¾ n\^/û¾Ÿ¶Óy;[÷´T±›‚ºèç94Û×2ˆÔ)4 $6"⇿±Ñ.Àh#‚ 9<–Í\0##äƒ9’)U/˜9̉‰H%<•$ăÎGÍ£½üâ/z‹Ñƒ;s<@ÉÁÁ„YàV¥ÚMĐrWM–ÄZKlÑ "„ÛºB×SGZV+±đ£Ưfóq*©Ơ[Ù~úé§¶̀åởJóe`ªÁ€Dë7ënª ¥cIÇäèLÉ¥NB1M(̃ —×Ëåơ’ö4c‚̀̀Ún7*.´₫ï¤ơnWÇZĂÙm½²—ËÅMŸ¯âí' l<Ès¾)2gƯîÜèü2ÓÍ Äÿ‰ ‘owOă ¢•¬Kû’‚:Í(ßè’<Œó‘ÆÓŒ´ÄÙ´m\$ÿà”ÙjaïP¹l½ÑÀ  N`L‰ßÆAö¶%bŒu€n[Î’Äf@Å"1T 6ÁÇ= Ï$hüRæ…KvY¢b½Edá[[…ƠwưĂÑFÄ×P‘7Tˆ¹¬âœ'¿VË6„M7 ¦fqÂ(°B¹¸’‹éÿÖL¶̣è»9ªÄÇúKI„XXZ±§ Öªè–h”̉·́æÆ÷‚åK¦¦Öà»: a|‘ÆÍ’Ç•†Áâæ0À)x4geJî½}„§¯û 1;§€óÖDmÄåƒèL[2è"M __^/¯m7±V“ª5L¿â–¬F[û+ƠÓ¦™˜ ̃4Ñö æÎIB̉2*¯¦R¤V?¬ =ÉáAƒË|̣̀1½ nĐ‘JѾÁb\ÁDGD¥pí[ÙŸŸ÷Û̃KVAd⃢4.d2‚l¬&‘à„29:uT†¼\&,W qZ*b¾ä7ÄxÖƒæoÚ7¾sh©mD¬8¾×‘̣ØB…ö«‘ñ0,/‰³jíE‚̉ºdÙC Œ!~4Dn‘Ọ́cQGo;RŒ™©^ƯFîGÚǾB`¦`mh±)‡ ÔLj₫O1@§9Ø¯Đ–k ëƯ^øí³q]…³è¦¹&àl̃̀ÁC±:Ù9̉»}˜/´‚Cú›‡>mí êv•Rpª`è:‚ 8zĐü›)9Çd#ưט£è%ÆG£Oœô|:Ä̀°ÔQ.‹b‹cÙTBÆz–Q ́£Đ„­°éØ4hĐưCN‰Ñ'ÁÎ!ú@3‚.`MTªÛ¨(}\ ¿S„¶'G₫oè»>í %´h!UsỪZÀ-ª+‘h¼Q ûO§ScôYw 9dlf7Ê<´ô`Ëg U³0:>Đƒơđƒm;3ë?!> ¶‘LtA™§ú³ çt/H£^đF ^Úđb̀¸/$LV¬sÎ2v•Éâ XUƯ¶ít:ù†3E‹•¥X¤‡éq]Ѩ .*jÎ1j>§",–sç]6ư[œ¶ÓÓă“v́}Ïi­ZKß®/ ¨ơ(G‹{|W(x—Wú4B­RƯ%â?9uJ"„{½¥Ø—ûç=Yv¨ßÏáAâŒ5 ߢÏơ~á+̣JE^9½+Tu¶N¶nöú{„…wú*YÚyú_—¦xr´È̀'%ü ÂT“ôjæ 4*ưTk}yyià£ßPôééé8ëíŒ_ñFVø¡œăû®a¥¡î³SùS0Éå/_7sX÷L«óÖjë(æÎ&§‘ˆêơYÔ侦¸A[Å  ¿-‡7÷†cökcCT¼ècAeÔn¢|áĂâ+Æö]Æ·®5­²E=ơß(ùçÀ®?µ/µëÛ1K+RĂ3¸”øgüUîûmÛNçS­ơz½¦Í©!r¥”ßÿ₫÷çóùùùù/ù‹Dªe!W«¡÷.lzÜ&otgBŒÑ¿¸¸„À»”̣ôôT?×¹ÿ̉̉₫UDÆnù†Ă ™n î&®Dt"‡§åk ùn‰¥!6±RÊ»§w&vÛo·ë-Ă’Éw8m$Æ©DKëŒó¯@ÿw˜J¾TàN´à¯Biî̉́̃t] ëêh€1|ˆûbĐ©gl¤ˆ¨ÔPT²‰wÚÈpß Üèütœ†àµÖTZûÙçÓé|>Ÿ¶ÓV6É̉Àb —Ä_ÚEkä pèíZë~Ûo×[_›5ªÇû¸±N'×Å™»ôa₫)I£P$ệgˆ™*I_m ·Óöáă‡wïßaL-æóµú¡â¸gø*kéïU¸Â½fQ%o¥9³•»î ½ˆ°Ă6D<¸qê ¿…J‘»ªº¯@†M¿Ù̉‚à]s´Èv5ö^q/*X·‹Ơ-÷nàJ¤˜Ûk4œ-¹ø[ÖVkƠ£K@pǯ¿₫úËÏ¿\¯×N;•Ó_ưƠ_ưôÓOçóyîCx4ËÖ ¢üæ< Ă~¯₫ó@>‘bµ Á]&qQ¡|¢H‚}˜̃¾~ WĂ¾£N70Ë? ~ dl €C“J:ÿÉJúö¥|-kgO¹—ĐÙf}ËH~4¹¼Æ’u¬ưEçKÀÑ́®†QmK)çóyÛ¶äeØ´r>}úôñăÇvụ̂*¥|úôéÇ|ÿ₫ư¢ëxJa 1Êa5bwÂciLÓ`q ÙÎ,MºIṆ̃p~8m§1¥T–¶ Ö8†M»w;âY¿ƒª7vJ£C°ƯPP(àøi}ö=Ûî³åĂklÛöç~øøĂĂĂ7g–„,ÑÀ-áđưT%óÿ-NØ^‰ q”xrie@óJ«£ 9î”D‹ys±hIc˜z`L§(%\­±|Hó½ˆ.ÈÉ|8€¹Q ┵…=àÊṼ¿_÷úíë·zÔ–ñ¥ªµÖ²ÑJßZÛúç>:6VP̣OO‹2ooŸûÂdÎ.§%xô<ú<lSj2ç?Gib$ÔjëÚ4å2b’#ăD UJ%¸‹»:!›†#CaÉîƯóü.äÈ…̉Èå$ׂwɰÀ)!=Ë7đYB0ô˜p`=Ơ˜1Ń‚O§ÓÓÓS­ơr½ä˜%]j2åhĐUz†ÄpR$°™ô%8Y³Ṣ@ñc6gv„ÈqçŒØ·Ñ8ˆ˜³ăåä5ÊZqË̉>”l¿’÷5 ,NBÿü“̉äµwk",¸‡,èÉTÁ«=œ̃=‰È×o_÷Ûî}BwÇx‹†Br±­íˆ¦™¹6¬ ¥î ‚«Yq í¯̉ÖHJú<‡]ˆá¹«ŸüÑÛpđí›æÛNçS‹’ư¸îW¬RĐ15TkIpjX×S܃H ¡ÿăU;́đ¡5k[‚v@…w©â c<bE”£SF ¯×«´ç@‹(U¯RÅVr«c%ơ“ĂÛơöÇ?üqß÷£®ØJ°5Hăˆi}=oÉăe -k¬S ăỹï̃5Mø@ü†ë.Ø]ñ8²¸ ¯ÁVæ¹̣PsW¿æêÄC ˜­́ó¥`Bµ‘& îơ%Då–Úốø2[tfÎÂF-ÇÎù;$‹3Ñ[ö?’ÿ{̣¶ÿ_ºÀ'XAÈ€IDAT(ßÿ43±£—ëE¾ÊËåe?ötcaë{y«Ô#¬N£y»Ư„<”¥´ˆh´5Ị̂r¨YA–̣3#œL&.¦²Œ5¾+°!lmsCîdˆ±ÉØ…iṬưû÷çóùv»½¼¼°dÚH|¯¿¹äy—Áª´-7úíù[? ¥nü‰53aDÅeo­‰løƒö&ưïSƒ¬åŒCl€™5È((.$ọ̈gËbf××kK,n7ô$ñ@“î»…5$2&ụ́qν¦‰&¨:Äl®oè6RáÑüY ÛmÜäLú"ˆ’È1OäJçÙ‘¤€ËÊ2Ñ[˜Ë3ÚƠ1äöĐ̃ jÚO«µjí›ú·~ë@¿ U«X-ùÓ.èư@ë"m¢ù jÏdÿ̀ƯKBđĐ”¼8ÓT»&‹,¢<ç%ăH“÷ïߟN§—ç—}ßQ'ayƒúÛX<çÍ’_É”a45‹0 B„óĂùƯ»w&öíùÛóós*v;m¿ûƯï₫đ‡?8¥D£Ù;ŸhƠ1M—ˆ¥9O¥46Å>¹ªfv½^ûÜú28¤ÉEº)â=>½!>Î(6¸Ă;Iù2]yè'3²D<3Ά?[œÜ8Ư ³g œCèRRÊ S눒ăHÂădßèe€³Ñ³cQÇègK ̣56üp_œö»‹~Ü{l ₫•!0G˜øSÙ~ÄÁ à°üĂ¼DØN@s:úo»₫ïûQÇî?#çø_¿!}K>‘@/—Ëë?¿jÑÛíæEIh÷RÛ_+k”jψ"¨'¸bpüÄ&4ˆÄÄ»EM_ÆwMÙót¤Ä¸àK­²ơÔÿi#ÂÎ"êưoî&J)ïß¿||¼\.-`‘èaÛØ4ûœñìG@2&¶ï{Û‰HEëQF,¡K•¸NÈ9ä’vd V¨(4ÀÊƠ¿d{¨±p:öäÄU\€Q=ÀĐÑĂ¹ó̀œ‹Ô¸¡#í EKß̃¤Đ©®*¾2¸Åvđ=Ÿ>}z÷îƯơvưüëg>ke”ä3­Û [3#(ƯÍ$Ê6ĐÀéä öOÓ$̣|ûöíßưÛ÷îư»¯_¿¶“Y ‹)¥ ĐŒ{®sL‚Qä,/×°úD?T©›n=)ˆb̉~Zg…Á!Uk!A²à‰Âƒ„l¸¶¢0•ÙÊï«j›ưÙ ‘¸C?Iđ Ë †ûRï×m‡˜V]©¬Z#ÚbèŒ ̀&,Q„6\¢&/‚Ï̀èü:VlŒ·PökV»¿GË&Z;0Ă^}5pÛ$A«¯ÀT@Ë@ñ@W‡n{ ¹₫íO–+ÆÓ}|ÉÖø=É đ‚¤¸äËm;ƒ¢~<{‡Ç€zßR̀ẶĐdzKÆWUOÛéññ±ơùùÙƯyÜE;à›™J—àóȃ€ˆ9*Ë ØŸéôÀù|~÷₫½ªÇÑàÅTơáá¡ư‰ÓZ|,«= ï­p̀åă%cEi³LpœH¬¨)˜äX7…Ä ”)̉|¬A;5(ư,×V&ơQ`Éd3kºcYæÁÑ́Y¨êhøâí,JÍ\„S˜Bh4Œù))+Ó¶£n­´ƒ3)»!H ÍÔ9QùXM4¿Ư½†¬ơ®É_O®o+Đ—:–Å›=̉¢x@OœB»Áv„#ŸÀƠZú¿í7lưiñêÔ ¶2ñµUˆFÄT8¸§XEÉ&ÜŸÚÅJÔ{•W°˜ß§Ø;ă'Y ̣x¡(fp«D¾9 J>$k̉¢,üÅüCöàỹV@µlÅÚê5́¨î÷W_®éö¶\¹ÇQ> @\θ“[ }ḾÇ t)pJ‚IÍ̃‰Ôÿ‰ `è̃Q“—CƠå¸ôÜ™Iúëc>„ ›~ª(Nï_6ă"}µPØ'”V¤=<<|üøñă‡ơvWA{©kxpƠ|Âa¤ ́N|0 (A$4/Œ¾-„a+Ûăăă»wï¶mKx"÷ͤCî† ôS[ơÛ—Áp<¾LMÚ"µI€n₫ÀØdøå±>nÈ̉÷$9K¯Œ´öb­÷,Æ -iœ?ˆœßn""ÍÓ7¦-Èy´*P={ì ëGxK"7‘=Ä< má½ÜâF ¶Ôä<&Råv»Íî‡+Ÿ'¸Ä‰Dóå-̃C“­4‚c0|×XÆ+ ¤ªé0¾éB`FÀ|oÏ!Vl)3\HÓåÛ~{~₫öíùÛëơ•g¨Ú+z|ûö-TU£jÜkZ¼7t8§SÇ!È$b́(îF[øÙ€ïÑØùĐŸ?¿ñ̉e“óOsÉ<í°dÁ2$£ºêç…”Î&×îÜ,„ ¨íËgü8 8ơLû\¤0¾w}$‡îưÄ€Ơÿj±Ö¦sâË4ï bµäÔÙÑÓư ̉ü̉Ö‡úßÿª}ăT2üO=Ë?¡TÄe¢¨Gơ‹¶,†ËËËó·ç×××^1dû  ºÜF1ơ)‡Ä.x ăj¨$Ï¡-=ơ³cọ­k±§agiÜRU\Ûÿ·ÿ=~àV‰‘(ÄiV¾À÷¸äF™)aÇR¾̀²Ë)›õƠ÷m=ûRîu9oyCÍuº‡æ³¶mĂ)Ó¨O¢12C×iÆ„ø=°Èø̃¹´XúÙ_Hû=£nIW´w ĐeR×å+1ß ˆ̀©÷˜ÑUS‚tỈ\–‘¨̣‹¼E+đĺ­‰›±ñ ö qEJv"I½5îùé§Ÿ₫îï₫îï₫îïĹ×_Å"PgQQ9?œÿơ¿₫×ïß¿¿Ưn¯¯¯k‰R}÷î]O:¤ƯxJV¾o¼ÿ9¶dÅSØ—Đçô%₫J̉²Î×” ønâ)$ó§†"]˜c₫VàÇUơإ녤ùkÂd¡nđ7o,åÁU@ô8ëëu?ö¹d ›Å°…â,Ă˜m3'̣›ÍQâÎ(Ơ¹!ÿ×̃³ïûơz}¹¼\_¯L–7̀Wk½̃®É³’&µÏ.ÆÉq¢¾i¹$ưÄS" Ip¬ô(Eï³{Rơ4!÷V‘¤„d2hÍa%`$H¦ÿ+**>M=¢nđ‘®2̀d Eë?‹’{bø¡`L̀:i+ÿ™á0—4422²đvÀ¯Q¡’!Æ9Ø£N¾‰GYV—«6}cfí8XiŒ‡½öóT$ă§)1£«›ø¢&'Đ’o¸ÿv»ñÖŸ¾ø—â Q̉ÈA¦¸j(écœ£ÀO­‚<¥À*ïf™­é»;@DzÛåơ»&}Ä—!%ˆ"ë Ơ¤¹AÀ̀M®[{₫³LN‡vúïgư?[ ×̃9½ ÄcG÷}¼nXC÷bV§ 0SWsđ‹G çó0y£»<ÏÀÃ:׈«0÷¹t u½¬¨¿ÂD±>Ii©V‚nA—&Döÿk“[±|-+y? lœüƠ¬'6«i×zíúz½Ưn¢²ïû<“…ᮇ™D=ËJ¦UJÈ'“lG”ö–QZQ‘Æ̃°"¢í·ÚÈƠ₫’1Dâ~te©ŒoTûJß–1ÙÏdÇ9¹¢½{ăxrú«µ’úî=+’Ơ#t£́4T {ùP̉— ¶7‰ ÷Lh{í[ eó·-/Û¸”RÄ|S߯|u2Ñ%g´·”bb¥̉BvZ9¡±˜2n)‡ F¿uNÑÓ餪̃à\F×5kèADÎçs)¥Ÿ^LI‡íœÈÿî¿ûïj­ÿđÿđÇ?üQÈI`-lđ_¥–ZªôeíÙ?æÄ`÷ؾ* ¶„Áà«z!R7ÙàDåöÑ„TÏT¸ˆBBX ¶m{xxđ£Ư%‡Ø'#}z#ï Œ†¥^ºØ¦½Ẻằ69Ó@‰Ó%Ă¼pơ¸ ôÏ)ˆÉ*óÍ)~nó¥m ¹ùÉñ w"ȯªT¨[çY­¡Œ®Di#&×tówÁHºáö!)zR9Z#̃7Û•†ơ-·ÇKÍZnƯKˆ0˜…W0Ö =Ù>˜jq»Ê­ƒÖ»5@wAÎ9@¢¸Ôă7ë¶®}ù₫ƯûÓéty½àôe!$ËSA(|૧”G:Ô²)™-xä{xđÆ…%1mëXà2$fĐª¦#·˜we^²›/ơă> \µÖ–ù³ï;̉~üC<ØŒ̉k¹;”Ö/‰˜.€gÇäj›́ nc3…qdLÙvoº?2T›Z'èÉY²¨ ÿ"ºx‚S̉·PˆO—o÷©f|ˆÉŒ`ñ.b<~Z2Ï#}Èè1îm¦Øè¥IÔ&–í ƠÙb³Vsóä9ÛsW=¶̉ă3œpZ:ß§'µ§ú2 ơ` :¹dF‹œ0 Wtu`åc„€?ÛÖ₫ë‹¢̉ÍO40Ú́`wÚÏ’q̀SÓ¢§K¸37„`t̉D—à&’|³d¤±.ytwđœ1J·­|¾9ë¹—¾‘EÍk­R¤­₫2å ÷©Œ¦GĂ«™YÛ8Àăµôºµƒœkw¾Itl%-ÿ»XơÛk>6A0 |î,UIiu2^íQyä“Éf}·œ̉)¢¥jµ±í={áH-g02üÓo_¿ưă?ưă—¯_¾~ùÚ‚ØàÂéªVÿøÇ?ªêåơÂL‹ßV¶OŸ>•R₫ô§?ơ§„ùj»úŒ+E}QxWÀ˜¶OÛfAí¬+?—~•„Ä#ƠÑ?íŒ̣8 c(Ö”&”UDd?ö²L÷q”Ạ̊₫̉j*(₫O/B%“ÚÎơ‡¿l!\[°ñôüâ›ùƒXæde£8bïÁ°”~ú[ă\Æ₫"“˘bóu'Ùé•usøûeWŒÂÙ>‡°a"@”̣¯́>¹Oñÿ¿ê;RúQ†ü¸Í«`Ó„p¶‡Ë‹©ÖïÉi.5OÄ̃ỬHĂȨêé|zz|Ú÷ư¦7.œEhY¬c5 8 „…:"2̉ZTFaỚûÍ™—°&†Ú:Ë“vEÿgô<ƯïfVÆ::$œ·ô±k;÷?’OAÛ· ø1D±†5W3P!!ÅQo÷p ï÷§KË’x)YxtzyªNŒô B!ÀPÏAđă#†ÈÁ/÷ΪĂÍ1YĂè_ưwÅ/qp=:4¬̃‘hT¹æ³@æ œök5¨È´ilbAÂpӪ…ñé+dôâÿªœ2'!dY0/ÆÖpr&¥:7_vT=0’“¶9öi&‚†

@ß¶|Z¿•₫DX?wÄ̉-¿s̉»\µ˜¬JΉÎĐÉĂ['áh+zMrẀFóQƒ&’~¼k\Gˆ¾ê¯&&€t8íK¤W¢>›ṕBLÑ:Ï‹›Y¤ràÆàIMø që炵 ßôsâ¬×Ä7ŒRåsǸ–Ç> ¯né.&Ì8„ÀiBÜ-3mK6ñË×/×ÿơúøøØr3@LºlÇqüéOZà̃åÉê—¯_ÏÛÉc‰†)G*J‡ƒ¦’ø°Ç í¤°̉;­y¯6]P´¤3SÜ”˜eaa@ƒS]fJhXhï¬mÓ7××kƯk­•=SƲÿWˆ»’Ö#>YÉ7ªƯ'x̣p çWtÈnß¹í^Q*ª›neÛư¸¢áø°¹À`B‰•|»oWå +>’¢)3'ø‰•ư44ÎºÅø?J£Ü®ïâĐÜÇ¢©¨ßÀt`¬’°pĐ–g*æâMäΉÀ̃.[I¬`j³¾(=ªĂ*¡˜îÀâ(ï"Xe#„êQùŒ¥àóØ…fG¹H"Âf¬ŸÙâ†d 4ÿŒ₫đÇÿ<÷'fù3Ñ×…I qñîdú/×ÓDT¶²‰¢ ŸÂ3÷ ÷¯å|₫ư»W†‹ø~¯Ăø=œÂ EX.‚pSU´­óÄÖU0zÖ#(0Q”Ç+Đ(œ€Usa‚Å2€îð<Ô,fÍ ¶F§£EàD:Fâiº‹̃LÓrđàËa©3?´FUOÂdN<{Æ‹Îà ½ˆW,  c¾YFx§# »ao„¹Ø!qy¨NÈ¥sËBćx‹x"QnrŸo[Ê„³Jt˜kBwëNwüÇè_Æw<Ú¢RX`qx¡Ơ‡×`c˜T#à^ó*h k Y₫×ëëívcD›È́Ö¨}ßT´ñMln w·Ûí₫Ÿ₫'ưöü ̣Ϲ X»R·ªUÛq¿m3P?gCºZ!óÇFjĐÎ$($=5hXtûÂ+ŒàCƒ LFụ̂z½îºĂ7$±Ÿ±NPüyNø‰ư½Ä£«æè‡}!-9ê¡¢¾ơqÛÛ¶¶ÓQư¶'k¼;TP&á€9ÄN«Xµ‡ÓCÛ(ùơúj)Ë(BŒcQà“.¾Y:€2Ø̃y‰hx…<í¶œxµ~àe‘u™Cx¢’ËåÊktcÔ¥AöÓl¬oh£üß¼´ƒtFçœLK7J]ƒ¬F¯”)vuç 5†öơơơØÛ~ . ŪçØ̀3ªC†z₫4Çá:̉a½¬ÙRû`C¸Âf®n±_Ibtê…[7Z}º ·±ïF"놤ûÍ«¼Ăk'₫û¿”½ăQ .Xu6léˆ= ‚cåy³¢Ï•f•MPT€ø@((;>é₫5»-¦‡G`B,%¶p™JÉO(}V!¸UÖ]…"ăn)Ñs‚©…­k­EÇ^æcµ@·bÈÁ¯ÂĂ€¢²AÁ†ɧn½ ú“Qƒ¥s/˜̀­+JñRèa˜6z¤NQJ0^1»á`ïΜ̉éé̃„rlEŒ̃yè{Ç–§±́áĂäáÚ?å[?Ơ¡ơ>RÀ yT`ÎÉ8 WÍéBiÇ€́>=2Iœ–@8­8 S új¤ –‡ÖF6¡÷›ơ饖ñ—·ưÖ2vîÉ¡Uûơ×_Ť‰ ;ư÷ü~é‰₫ Ó÷}BÓ Ă4 cÏÂW¶ Á‡v…èzàÁ̉È/÷XKBÿܳÁ†¦Đ§`³N-'²iøO¤ÎwƠKûúg 8ëú¨>1•å´̃½{·ïû×Û×₫Róºz&8.-ÚŸ­£ ’H´µ= ³hƠ°dh–¨$‡½zuhPæ½¹NÁđọ̈Ç(´+€±€®q?̀Đ|=‚Ób|J½V≡NWÄ,çÂŒÊ÷^»Ï›k¤¢QfË6j…ÛÈùóƠ2`´}}YṬ7ÂưÿØ+cÔ$BñGk¸.|:p mñ̉"Gn#¼uB₫ ˆ¥Ó }¦HÑß5ˆ÷­4÷J¶/4Y} Ô{t‡̣rtđmaBÎ,ÑB. j2ÎÓ1ăßẲØáN‰‰ăQQi«oïQPÈ#ëăIJ¼ÂQ×ĐÉ[]0C-(Đ¥äÚ;ĐWÁ‘ÀÁfÁ?i¿Ó× ́ä1»_ƠuĐÏ0Á, ·:h_¤N¹Ó̃R7:ê+iëÅƯ‹;ŸB €%W;_“ ?mÅá;?jß³–÷́Á˜Á`áÏÇq\^/³¨„wÍ l²'â3ÓT Àc’Ô“’? ÂcàÉÑÎ~!uû£qÎ WU&¼Î8<‚Ă—)×̣®üX0n ßÁJGËƯ’HIR¼ü„ÿ@T]eZÍK®¯µ6ÁăÀ&ơOj/+&c²¾ưz$Œ%©É Oo“øö•˜̣ÜÛøiơyQTû ¦tô^̣Âéí6&BCê?ư;ÿpÆ?‹D"­¹·±Mñ¶ÁooF3'’G%wZº̉C £§; GËƯ‘áå „¡?₫k_ữ“¤ơU%LËND‰{F *Ó₫T´ó=GV©-öy›q́×å xÍf¦Ÿ††j«?Yà¿’9/‘ö¸‡́`¾Lä­˜cŒ™EÔηD$üµ®•Ó«»47ô@øOæ¨ÑIO-6h_†}ßç¾Py[2S§H. *˜[$#±!})+ơ€f­ÇÏd¡̉²₫’# vu2"TŸ¦́¹ÀƦ.YO&œ½ ágiyƒML¥´1}’‚(4§¦Yl„Α,Úˆ­!BImñ®çW9Á†~&Ô:£b.r65S½À4Lé‘TçdUĂàF! >˜¶¶H.ÍÆoUhï)#ï '´p¡;³ÚœY&¬¾eˆoñ̀+«Ï x-Üä}qÊ_j–„EwƯPï:óoÖÁùø ñü\+3;êq½]Ï=sJˆÈ÷­+2:G=®×ëëëë̉µÜ/cP̃è«ÔÏn|"ÿÆá#€"Ü…Ú|gûl¹&n%´ÛÚ̉6Ø ê}’X¤ơ(üÇơö²{×Sy˜ ¹­ï¿×ÿ Ú臢 ôß÷êu9Øă`î¦yª…|Û=ÛêÏéËÙ£ ́ÏPO¦l {̉w/¹cÿ‘ưß̣₫1 pcñ3/‰̣§,£đy˜åËạ̊ụ̈Œ-¤Ÿef GÜ‘áăósüNÍhJụ¤$?A=Ó(ă-¥c¹®¤ñ¤//^Ơx»æ‚Èă„¡ñ•èe¬¶½Jm£Úñˆ¸Së§ È³7á}G)bî1ë(ƒ\¤ǻ 4ƠB‚@gŒqIÜ¿Đ7•̃s2Zß ’† '¡Æ–í£{2ʤ Ơ–”˜äÅ=ˆ¬GB”­üüÁ.×p °×–”\ ɲà³G•rrX{“¿Ÿ»µ¿q"-¨bfŒŒ’[˜ÚgÈ\€fn4¦ˆnó¢>ÚÔ–±) LărĐÎw4¼èûÿÔê¹ăăÜô€§ü[˜>n…Ç' {xv ø¾û—¯_„½IŒuÓXxW§QKѲtgSϸÎÁƠ*DO4™G¡ …̀>ê‹mHJ2MVµ̃à\µÅ(˜Îau±0vöÊBÈ.&„‘ÓŸ TpD‹:å+¥`¥ø đ`ñÚ+c@¶9À å’N½ô©—•̉¬Ămˆ ©÷±½p,;YøË¾ƯUoo#Ư64l–  ĂÇX6 nJ°ˆ‹Ø¢±nƯ—,Wp IĐÉ[;X‡Æõè}åùè;'̉]í½pB!:r₫8́±±ä¥-ïl1̉¦› Ø ÙZ%YÄ(¥‚À²äµ¹q­ ;KGPơƠàq`µ­vÛS>Ldeĺ!Ûª̃vó́óà1:¤,ûâ~Áˆ-t,†gIạ̇®½Á‚G“,‚„đ#á1-nB₫{ú\[Pk_<₫W¬˜ôúah‡-P—%¡çđd6̉ÉÜRj ß¶m{8?˜Ù~Û½' i59ï ¹Œû+ØÄp?PÁÀ}’Y©XÙ¸%6ÅßHÁy*a1 ˛ȉ$;–‹?s: ŸfTXggK•L ÇBaĐœkk%°O…©[¹ê&€/Åcl‚^Œø‡M‡‹ºåÑáX%F±gÇæ˜C5Ic<ƯĐ¥fCØ1rđ:lHæD4kÁ(ªi Ô Eá\âơ%óç¡Ë́ˆ©cÍLKÈ BGạ́ƒ½F¢íbèL2#æÂ£N CÂ]&nÎé‰V̉×#0Và2Ẃ éF Ñ1¨1®₫«t°ˆÿ!í稇áШ:PeËH³£Ơ3lEµ9J¡Zyư§Æ‡lØ7¶ YC5€}»º‰GY,6í/ŸÛ‰FrccèÑ…‡®y‰NBÿ¼ég XÜ¿˜û÷ÏØ̉^z Pë¥fâÆˆyâÖrÏPtẤ‘[-úTùƠnôl°r̀ư·ÛhÏz¢=ø¿³Ơ㫱CzÝî?Çr~܈q̀¾I¿>;Üø ‡ơøwF®,ÂÊ;.£¯}>„ŸÖ[ưh$ àĐÄ.L”4Ua5i`̃„ymÑœf˶mkT±¡Y´—_Aj³¨•æ;ù¶…‰wf6(Neâת™ Üs’IJVLÈ%ÙÂHÁ†¦‘u †¿í?Ï̉?hm‡RñƯ¼K¬D}€,)çäPÿDï¬I3“̀°÷JRtÏ+‡’› ˆ;ü…A •ôECƯđ®7o©†s₫Ăf×hfFg_d‡Dé=ü*-˜æd£ÛØ•̣đøp~8»ÉÍds©W×ÏîG¿w3ûùÍC¬cß—RƠå“§—µ s+̉=êoÊ5́ؽ±ö ø7̃ “•_Güßw¯Dăå/£¾(6vă¯":ßÑ›†Â)ĂôvŸ'fY*pnT ®sú5ÎG9 k_Ú—qơaœ¢ñđjXÈ:fÿO©ÿîOñ6øĐ•¾'Eæđ^JÛÊV¶’ªÇuÅåM' µ¼\‡|ʶe ÏTZx—†ÿ±Qu™ÑÅ"cj®h;è¬yÄÉơ´ô„¨!ºhv°QÇă8ëÉ?oD/oûû)ccÛ »A˜vó…Ưr$Ä®@çwHbw4T á=¯Y}l1úwñ¹µp¢‰äàCÁ¢MaÔ²>ưܘy;yCûß7v¿q“mG̣ZR¬̉~Tq“‰„yé¤3î—Œ§ç>9N¥”ëơz½]ëÑçÁÓ•x&¼̉Đ¾eÑÉĂƒu~£|”©4Ơ°œ7`¬«¤Ư´ơÈ ˜odé˜*‘iR>P5L¾¦VG¿˜:A†ïቂ 4g{5ø^Êù|®µö}3)uÁ§ÉâQÊÍœÙHĂÚßtˆ©ÓºKơ˜A!Qk₫4ü‰Büü,j…͹°}ê¸ÎçóvỤ́̀́r±U*ZêÇE 8á*uÛ÷@…Ó{µ†Ăcú·~kKYtû7Ö‹Uœ<­~KÎl=Zó¨ÆBưV̀ºÄÊ0,æoBº¿ạ̊W'ˆ–¨èdø]¿%D‰oôB’ü óèˆ9 †DăcÙJă#®·ëíz{ƒ„Y\TÎôMoĂÚ³ø|çÙûÆĐmïj*ÆÇ½Æ˜9Û¶ HKk˜gUχé>¬tsÁs€â–vƯöáÅ1×”[qÏâ­ ̀±Ç„á’hĐPM;2ÅÀ„ßưh6öß6‡”̉Îö*¾ƒa²„s·v‡¡ö\~ç₫‰t ‘̉TÔơU¶+mơLb<™Ụ̂_e?ƒØA*àâ-&ï-$%J¿öÂ(0v†—"0y§)ôFAob¥•a*«Q÷hyÛ&Ï}XøĐ$̃UÚâ“qRØÈ"ĂÆÿ>©Áè? °́Ă|&j¦?—#ô–§t[ë„Ó́ĂŒ2óŒvÅB2 F%;xBØssºÈœ=¦÷5߆›)¾tØ1z «:4ÁibăYÈ´Œ•çÀq$¤÷ơUÑÓéô»÷₫ƯûÏŸ?₫üùạ̊2TamqƒóD0lû¬a¬O₫³Uø₫4œŒ[~i£7Ư:€ẹ̈F“?ÈûÀ´̃@PúñX<¯ÄĂjœ*æ£o.z›–Rú¢"̣p~øô»Oû±ÿüóÏÇíAK¥´¾Ơ‘d\¶R­ÇÑj ©NåŸu‰ñ‡/ +«óq4lOȵAÉÓÙø€Â?|øđ/₫Å¿‘ÿùùŸm7~µ)D,q+ß Ă´dÅëlÖ¶B€IŒK[-Đr~j[Đ& ´öÈAÛz_ à…[ƯdĂ¢‚{f¤yÖÛíæù?=c¦¥E&p̀â§1™´lüÉó™J)%JÉi X˜‘˜®H̃Ó¯1Qi©ÀúÉŸ1‘éMƳ#‰×ùt₫ô»OçóùÛó·_~₫¥̃*œ¥Øóf\«É™ "Íù­|ƒø(ØX¦”„Ẹ́‰álMK<îT ‘<†Ï̀n·oÖá1üjwi¼*€_9ÊuQ!kÏå¤@ºº cî̉Ër2YBŸ6lY@èUHÉMCÎçóĂăƒU{yy1:. ÅWË+¿WĂ÷)ÊƠ‘üÓRÿ\Ú€vÛ»̣Ö Ú9Ô…Ü9­đÀ%– +2ÿÄ,¿ˆÍ”»¹‘˜ÔG¡ˆuk²ß7ü©ÿØW#¼gÎI5’HØHUbñÆ¿e+OOOư€H‰-å.ruæĂ(Êc¸ÓÍ|›Æ’óÛ!{0È·Ed³@¢‚<†₫‹̀ZaôŸL+yt¹q(|ÓŒ₫GÊ–;PêĐ4£̀.¬ˆ†:€ÿ±77\îÊ«_„ö²©”ÅđÁéÀ±R0na³É]­ª'ư?à…Ó̉Fbg>E`È\×ưĐ/˜UàTf%ëiΰ-ă SÛq¤mm@·eĂö­ Æ±¢‚e¬í§ÓéT¶RkƯo{'˜bĂí#ûËÖ>>>Ïç—Ë LêÜ­C^̣èÂâ`PÁŸåàGPæ®ö°–^ØI›6XHoư‰®hXp+›+ôă X“èđ{ù®@¯D¥}XÇpc°ŒdnHy•z>Ÿúé'Qyyy¹̃®¢aYHĐ S˜5­µÓØ6Îđ`‰èU@4¼Úqmêß—qÎWÍÔ(ÉØ̀ ¯ÉSQƠóé́D*¦®ƒ¡“ f̀‘„­AÆ>óS«J±jˤ ̀“ „o¡ÆTR &ûÂé6[ …-˜‰Ô·ÛÍ(¹ÁW;De)ExL»"L«{¬Ÿ‘,$M&—¶‘à9iôç‹+éFdE ;£tTí’Î!_¶̣áÇ÷ïß«ê—/_́)Ăề™‹ÊPÛó;C\ʳ¸- JØ\iw¨°C¡´to$+™à²‰à;+"<SÓø*êïÈ/!̉Ơe O—=[´óô—!½‘„Lñ'¥¬ï"~ÜXÀ÷C´Ÿ>|üp½]/—‹×aĐ·kýŸ„‡é̃(ö=‘l\aï$ËB‹ºü›ÎüÇ ¡x¸,Ñóx#;hÀ8¿‡„|÷xr@ Å»I÷cà¨F;(0럂s¼}9"Âơ¡’Äó0¡û£T—Êô37"¿ 6ă¿êÆ( 9:Vi2¥ÎhâY(„–É=å TÅŒgTyî”Đḳ½Äñ0‡-œ¡̉³ï¸Pû¡E óÙ8+ÀÄZn‘–&¤m› éUjÙÊétªG?gIbƯ½¦_÷}ÿöơÛ~Ûk­{Ư“?¶ÍV* ¯f˜–ùλ$µz¦¡eás‰YO Ă5VØ3ÆÛ₫§\ Ø,.đo?5su¹ Rç₫<.†ƒËÔZ·Ó†èÙZ’IË óîJ«½®=ÚF¤aLBè½ÄL6!oÇB‰tñÊÀß³ff‰ˆÈízûúåk?'(‹IÎJ“B¾!°æqÄy“¥¾+h­UkµZµ"å¤ Đ±2¦´¯¦åîÎÆ ̣¶@mlßsµÚ1UEâb/^e¹sí÷1³€ÍTJ~6]L+.âY¢¸ƒƯ/3IKÚª?Ù̀)—i]=[È» 3Û÷ư8ö¶<‘ K2­A¹¸-C –'N` èF̀ ú?µ×éPE#¶¹×iIÚá5ºFªíZ¼{ #e₫x ´Âḥ|`}×/¾Đ7Ê/:Y ăoÁäÀ<+.áÁ¾´‘r2íçO˜§»“Áï/¥¨``ÿ‘²Á¡ÔlQêWó¯ăçÉmåKüu\ …O«©ª ‘³œ‡p TmæÇx›ÙØë¿.æñ ¥¿+êæ,â2À½Ä¸´ư´ïûóå¹->Hb̀Đ<›/*»ûRr…¬>ưñAZ/d/¿má¯ấtç‡₫¬@\rư¸'­¿ËcH‚₫˜7èrTPp °Îu/Q·¢L¨èÇ÷ŸDäóçÏû¾sØœºƯá7G¤£ü,–?ŸđbÇúD@†Ü 0%ñW*ù —ă ̣íJ«̉óûáÔdê ¿QÚZÍ—ŒaÅ₫Đ£u)t¹Gœ$bhxÛo_¿~}yy•ă8G¯ñN§ơ’‡S\T†¿€ưØncÓŸĐ<{Ü[?ëȵg₫´$́zpY×#Ë1@û³Ó ³#ä¹ö xôÏ2&æDUtß÷_ươ´ưHhÆ÷´€Ư›ù`É¢3sb¡«Ö8äñ‡÷N»—¤Yh'ÙÏØˆ»çơơơç_~NS 7|G³ø—1%å{pHØÛ§ư¯áu e?zä‰5×̉CÁÁ¸øÖLc ›¡•›nÉ8 ¯‰W2ćѦ8–Cp¿3Â<[R‡x_úR¨ÆŸúÿ7:Èw²Î@³çôáaß÷/_¾\¯×ç—çă8tl¤æ}[¯ßµxįC)î÷Lf³±vâÖùm‰·m¥qaÍJCFv5 .r<KüÈ›#ûœ‡€å´MLM›o¬Åàí’æC«êm¿].—ciĂįƒŸïU`kÔŒŒí7B«-Ôsùæ­Ôï±gêpYó™Ë¬uH­¢º©™u¿L+}Ó ¸£¤#Él¬ú=±Ø7îÚ‰Zû›*3ÿ›„'Đ1 hîû̃&HR„ hL̉0.o%ÅÖÇGöF*k.n\<=M¤+e¬©êÓÓ“ªÖ½îÇî±–v2kK¶mĂÑrFÿ©»ĐWT9•"m±¯ÆÖiû”¸ÅØ]²zE®A¬EŒŒ₫™ÔÇgUƯÊÖ Â¾m øẢ–mÛD¤IƠ½N†R—R>~üøă?ÙËóËq@,.TÑ…º%ƒ&*'@_@‰­£iÁ±N\ˆQo— 5ó¦Ü÷+ßφ½,)8₫¾Í¹i_:,tl°˜ûá“€1K'ôȯц#~[•½î8†Ï”Ÿ:[Á3+cPËç'¨7º›)‚̀TÇȸ´),ºĐ:¸‡M´±,XʰMư €±]w¿“ÄÈñ¤`À=ÍB·Ây…1í̃ÅøSUo·ÛÿđÇVùöS?â—íèd0”Ư‚¤Eꪾ2D'‘ƒ8Ï—ùi¤Ơg½û€®æúÛ÷Ê;*˵©èq///Ëb™̀“h,@c$o 4‰t÷4cßξÀ´'ùhç0z|8îi\ÈŸ @ÛbS«&¥Ï ôÆy±Ư o»»̃ÁâhǾ––r%$$9„¬g @yæ‡ ~Âvî†"§`/É?„- ƒŒ¥^@Å‚Í$% u¶̃̃&̀·Ûí—_~‘ư؃¢Œ>1ö¡C}˜ÂtØDSí·uç-‰Y¼Ïăô}O6£/Sq¬eúF@Ÿæs)ÙAö-7\\¶N¨a€ÄI¬‰₫{ÜB9ưÍ¢KÜƯ2ÑRl‚æD‹Ö Ïß///–A±³ _mdă¥N[êb†ÍÄ|¿ÿ>àØƯÊІÑçÀ¦q:mxøçA&z £Èǰ¥G¸+Zc‘̃®óĂ¹mñơÛW vÏƠ¡tDw^´¯}Ș@¿CI1 B^N₫E=½pq̀ä§yiă~|@:.,{ù„^\ÓIŒ•̣»RäÁ ĂT4ư Ơg+Û_ưôWçóùååå矮µ²°az©å₫¸ÍWÁªél56›è=Ä̃ íîC«qO£̃̃c"b’£qcÛ‚‘~?×Ùh¬²x8?<<>-·Ûíùù¹•Ö(â½°-í©Óét>ŸZ1Ơ€¡q5 Çc—•Ă´„¬ữwJl®+?:y1ï3“À”ûωσ ¾Đ{Z\¢c›Ç<ñ$@ëµÖL'°tûa#‰ªm€ê@À¡•gŒ9³ŸrK5øW6a.ÙnîÖ‚̃º%·‚:3>À3ÜŸ0»6è|·5ím±µñ £¯>ơ¦¥ă¼ØÑÊ,M‰y0nÖÊG³Éz; N}‹§ú¯Ú¢;́ôÏßøø2z@’\Ç+à̉QŒX˜̣ç9&,C@¬¶ˆ<=>}üôñúzựåK­?AAØ%‡&È`^-Ê™]‘W›Cẹ̈ÉXêƯÏĐ@r-m1@g‡îó9áX€iÉ©ƠZÉán™W2¸rïá6FÍ1^đgZôññѪ5'́ÉèLzè¶0sX%ƒ¶))ÓØS¬o0”‰öfÔ»¾T̉ 4¤gu¤‡̃k¬÷Éÿ.B«)GT/ÆüJss»v¨Ïî2—$×ÅùêaÅp ‘ö;IO“Óék»=PàơlÍF¬n´Œ•üCDÿ“\Aéÿ‚YăúøăÄưFdx³ˆ‡=½Ă¬i¶ƒ!çÎÄ'€T¡5•)FuRIz$Ôâ%OĐe)B(Ü1 sœŒ—rHà£,nTµm  {%į{Œ-nü“ki?ạ́S£-]#X·0qêaÆÈ釜à]AŸÖ½3J€̉?—a>==meÛ½₫Í%'|&¾­XM:îœź®ÎÊÁ³îZ/÷ñññüđ E·m;ăëׯ×ë·µa÷üIúa— Y>ñ₫´úà<{́÷_ Hah–ù,Jw1DHµW÷§XFzª ôÏ)[¬J̃{"[Ù>}úôôôdfÏߟ¿=Ă^±…»o_^^.¿è/ÇQ[₫O2ƒàw‚±¥;2úôpÖSmÀo˜>@D˜Îø tNJñÔE)©ưk æµưºlbƒz-rB Û{ âÉåƠû—CđT%[ŒÆ¼ÉêÍOu₫îņ̀Ç2ú́Eî¸íåÛƒíȆCN$đ–ă₫Á…#T€›ñÆ23¼2ă*Ô‘‘eă¿FÉ·Áz|ßû §{Éđs"X4̉d‰A‰¯3æA¬1Y–|;x€¡ăÔ«€½©É§íôîéƯ©œ¿=÷5E°æ6èSQ¿̃°„¢îÉ[Cÿmûÿñ»Á­fÛ@რӶjBÇDÁXẪ…Û xD3S’£Idfk@v myÿ₫ưQËó¥U2÷ B¦‰Y ôæ!Ÿ«Ơ¾Xù₫µDÏ›đA&Xÿ½Í^ó«iÚ³ºXÍ2WfÀœ×Mư@â-÷ ÿ‰¢Hhœß3½Q•œhè[¢ẺP̣ˆ·@àÆ`₫§}öø¹}Y‚°…øcNªî̀˜UcUY'>+”¦ÙAï]„Fñ¶{‚Ô'1Vơa‚óX|éï4me'ê°è“;²½V–{؀ℋ l¶ê'ơ5Ư“‹Đy Fëœoöâ¿GRÙô%Aeô?5~„ ŒÆ#‰ äà,eDw$·çÓùơúúúúTÜnoeÚn¿ßck¹us1”L/"·ë­ùÜüѪí·}¿í"̉ûÚÆÚ_œómƯă¤ÈMÈD̀6Ú̃ÂTÛf«µ5ÖÆbb` Ô~ó́\÷hµz˜7XƒfÙd•~ĐoơW0xÈ´P£¡Gd"Ñ`ñôüü|½]kµÛ™đù÷Àf&tFo;¥5:ä@̀´Á?ˆ´‘"I’-àiÊÉD†¡%}H=2FÆÇHËeæ yƯ0p6%Å-SÏÎáĐ:@ư½ñ¸‡û#P` 3tH\ó€!N¨øÜ·]$xú¾µKK₫‘¶X⦓ ư2Í÷¨nH…¢Ô dơ´ÏŸ¨RIÚ,2Æk’–#:là¸%æE@ÔSè0ÑÖ‡É=w’Ơ‘÷Ÿđk­µeîR‡Ä;!{ͨ4(Çí÷dârM ¶úÁÙpµÖR«ÖÍ6ǸÀÿ° TAúT±mø31éY@IÖ é{̃ÿ‘d2k¢FDUôéƯS=êơz•}R¥‰ö| o‹ˆH5Ư¶íăÇûmÿZ¿¶™Ă彨¹#¡U₫w:&–9øöMâ×ü³[Úøoâéo\½ŒoHs nº¾Œù'“½c¬î’iØŒ{c åCL«‡ñ®€¢î›î ›<±67m^æQbQ ;hr <Îû¢xù‘ ưºæ‰¯T?Qg.è¿ơ¢. È=A©ư4â½Wă‹Äâ2á>Ψ›Ù¾ïƠ°g£?à¸me³Ứ6Yfî7æ¾ïP­ØÉÇ8̉ü‘–‡9,đ46袣ß¿µ2/— WCb ×××ëízO‰îÙL¿Öf̣)I´N€NíaỊ̈Œø©—£dÂâ‚Hܯ”@Oïzb“½«» ™ °G‰Œ½ÿûN5cUÆŒAß‘f̉ÅJÀ¦Ăl…y $’’/éΣJN¬X˜'Ớf„<Çưsâ~|VÇö|~ùMlg§₫JZ0åæ¶¾E2=o÷)0Rê™”Xk´B̉̃:3Ơ*ÅKJé hfÏËĐ_´'ÔzºđAÁâ{ +9&ºÍ¢œ™&=tĂÔ>ëÈÄÀ4¾  Q¸:f‰a äªz»Ư~ùù—=•Đ¹Fú¤ÓX$ÍÆyÎ…¡KPöá¸ĐƠÙ×ÚöøÇv@ Áû=q çÿt¸ù¶ÉŒE“H.$#†Ée&íṬ̉‹a³3Ç“̉±ç‘µE¼Ê²b ƠPQ)¥<>=nÛöụ̈|Èá́mmÉ@"Ø¡åR~¼.Àª[w9C¨B²fCüư8o_Vÿ’•NØUÄÙ‰ÙeøZ7wĂT1° ö=f§hÑĂœyædHQOX́DÑ9éĐ®vç„ êXá>Å&ëJù~‰%EDûà“]p^ ê8³Ñ›ß²¬è7Cñ'Ôåfá ¸Ÿâ=’ÉĐFµµ4°&^2;ëñÆï¥ÜTsûƒÊ›å ÍOYacaƒưƒÑ¨—ßö›́‚Å£¯¼$îç| NÚ7ưWÚ2hƯK`ÇŒ}WœÑÄbQ‘› '>L"‚¤5½ƯnÇqÜ®7ô¿Q¾¶åo²SºXÆÉXúáù§HC%˜|ưúµÜw}½nÛÖ¦Pœ₫ß6¤Ư§]z8(’q€ oóÚsŸ‚û ñjcÔ²çŒwƠ{€̣éƯêîï­>Đ0\èC—+!ÿâ.ƯÉÄnª½^^¯¯×6k½ÔeŒ2 j\›G_ªM¿•`»d‰₫‡‘pƠê vÎÀJÚ=EŸ™¹Ñj ̉—7€xñ́A2ˆ‡0oDỊ̈$¸Lg8R¤û– R̀ +:‚¢ïÍ!śî₫©ơL p| B½ÙƠOe&ëïjœđçÍÀs))¬g7àa’y`X8sˆ&¾Z´ß¯nXTÜÇR JsHAöHi t0"J‹íj‡₫}øÍwƒE :ỷ •ÓCú&kˆ†?ß Äu$‹̀ Ö…g:E¿Zµëơ{B±.4àËû ›ịâ&Ö!U~Ñ¢!l,™&ÆçÔZÛVŸ}·Ÿ”äC¯¯ h§}Å0 m:{Çq[öô ª„ẓöp2`è~́¿üü³™íûµƒB î_–(̃üSkæåårGăgjÖÍtDTCn|O*6ihX“I¨~q¦ Zơ°· º%4Lg¸oß ÉÁÙÛ́*å;z‹Â] tbOï₫ÏÿƠúû?üoÿ€ë•΄̣Q v¯9qĐ< B[„ÓÇxNrØXf3**®& ±Â&Œ&O°©Oâç÷í¾œèüN‚ï'-0ÊWæ %óz*Ä´s©éPÿk PÈèŸe2 ƒkpCd§÷wA‹¿®Y ]¨Cfưçê_[’ưÛs•LÍØ̣¿í†liă,!µÿƒè×qü{‡ïi@âSiöÖ*Ï„ÄÅ!"ÍU^/¯ `ü±ÏÏŒ₫çá@W°1…¦É6%‚đ´~:ăúzưå—_J)×ëµoößϲ.°,«NÿG%ÚĐ’Ù‰ÿ6Û á}Ʀö}>:—?]½Âå68×H±.E&*Ö¸¾A"Â₫•'gÈÿvnlN vmí¸Ù8đJ!¥A§;H[d„YÜúÍ»AÛû¿à¶¢ÿƒÎ³|¬q̉¸{~/‡$8f¸"S$ÜH´¨:yRó€µôô/££X1l̉·¹G¸MáNÇÀ'ö"ÅåÎb¬\`2 iT0‹̀ˆD¨Jư”¹·L’'†¡Ú†Éf\뻂̣÷DêôØ`DG¹XÓE•H%Øssº¿Ñ>ưœ ïAiâ>ă*^Æđ ¢ùbâ-Í)N/:L™ÆÍad¸Öü$s>½Û[&[ &ÆĂN f4Í)•Ï$%½#È›{vluë“¢ư¤-³¦bF‡BØØ‹É±»ô•Áˆ*_ZÏ( ‹˜yß0^°¼R°dÏåơ’æ£u&ÑárÿUx¡U{~¶âø‹~?¶;#>÷»¯HdGâ¾ûxÚÿ)ö"YSR¡£tag‚%\Î5«)G=,¦ª¿ÿưüăq ­F_AâcÜó h‚"‹I¸1îÇ­a½¶1™L6€e2NY„ä&¿ï@C-©Âaek“ºf—2½+ïe¸«…PS1öZ¾}~˪²Í¼$¶Ó+fYg ü¿r d¥{x› $°f|µ“4l¤‘tđTÍ‹èypgûÔ]·{°†¡Bj8ƒ6¸åè?+7uƯß₫íư¦±J̀¬kÜôkGÿ%j·Ém¿}₫ú¹”rGC₫}ßϱŸaXk=:ÁßR³¡èÁ…ĐNMŘMD.—KÑ̉~âF%̀íQÁ@₫fñfC{¥, ¾©á©yH}ĐÓ@„ECñ–3e%R£YÔd.1¹©ˆø±©YôN‹6BE·ÓöĂÇTơơơơạ̊‚©í»ƠÅ”̉ćÈ7–ËTû±_¼5dµ*EùYQ<'Đ3Lll£ơ-¬Ñạ̊ŸS|Âx f–†yÚ$X[h³X#Sî«\ươI P ?ºƠĂQ#±æ¡±ƒr[œ øỢ—ó 4øKàé„ï›÷m Kª9§"g¬ïŸñÍ6!®;ЇØÑ,Eª4& "yéq›æ"ZÇf ô9xÓ ƒçà(¨æé:G=ú!ÅÓ„¤¥~Yi9B¥ö-wû| ÅT<%̀œ#€FD g穳æ.*¶Y S;ÑX÷Úx̀O÷bŸÖ××Wg§₫́á̀q)Q!k85qù¿µö½›ï´=W€údy₫××ù|>OG=^^^<̀hêY˜\_¯—Ë¥Ûy(»̀̃qÔAÄ4•¤h)˜ j‹%ÚĂNƠ¸Úب+ZFèH-¥œÎ'«V÷EÀ­+|§-¸!=hv·´{êGÓ ŸÏ\ÑoYÊ8KuzK*[ä"¥J̃iË1đÈMÈ'.>0ÁỴ̈ëH‚,úN“f@ÿœù3ÀäÀ–µb×ÿ1@(Êw»:>-º©4Ăb¡9o)±ºÄbÆÆQ/>ØÚ˜0ơyLïD_ŸÇ¾^££ühK‡ø„’ zØÅ:ë¿•mÛ|Ë|ñnï½=EAmz¹¿]=q}̉J{}ö™„*¯—WŒNN ™3¾Z¯‰L{¼”I,!°ß̀â+åÅƯsÓ Ï«’¦Œơ!uTæ₫ù̃!¯éñ9>…r›\ {̉ À–À@c¶–R̃½{÷¯ÿî_oÛöÇ?üá₫á;äpâ6ÆL7)́ÜsL,ÉÈud€4 †–Wºơoúß²̀צ‡º;ÓĂ-L„hû!£GỤ̂Đøñ`̀•@Ƕ6bỄ¥mZ#ë±Y„³Ú1³iơ ~8Ô8ZÁO ¹`#¦̃Ă«×ÇF¸çÖ A-1vc¥âS­}ºÀjŸ5RBsOăƒ2¬+\»§§DÈ̃âLÑ4x#…Í^øđàùv¸5•2[†ÜÆÎ3Nâs;wÙô‘¥Üó`ÈÚFŸƯê˜ïÖNzÁÎ6 ñsªÇØ8\¬o 3*Ù²Œ0uĐú¡ZƯtc€¦`”Ó0±icûP¦U–’f`X$bÈ„®€Äbfô)âå±Ưw¹M€'…fJR¢‡\5̀ÂÂ’Ä5ú,36L©ÓÏ+¾ Âܱ…U?üđçß}zyy¹^¯v„¶XµËạ̊÷ÿ÷×ëơơúƇQÿÀ P]aöedx¡E8#̉#[êj+xª{IUŸŸ¯×ëq\¨‡” ă\Œ†Lwl'Ó5ëQEe+}J$ÄX@ëv ©8p Đ"¡’«̀ÆôeÀ.Àp­ă¼á ¢Ä>´¦2+yè8a₫µxôµĂ~Úï?)¯Cÿµÿ[,ÉÅ ƒ³‡í↠̃[üĐŸc/¤₫£fÙïüƠ£L¦ÿÏçóăÓ£ˆüúùWw™ÈT=LuA¤ñW>ĐæIV̉pjƒ̃WÊ–8·3!.Æ₫/ăŸƯiØYÍÛƠ₫6îŸ7ÍdàÛèLè –XûÁE›™â¹ZĂ:ÆD(eêCbQÛöR zs‡6¡ˆ]‘2Ô2y ­÷\¬~z†¨ă~²™¬†ÉÁa¼æÎd]ÈúÈ}m »Ư0+µ ŒOÜ)\†)›n‚ṛcH'ˆ>><¶#â00Ù€̉Å4lb¸*né=¼<Ö•ö…¤U2¸ÔqP€ơ™ƒ OÓ7¹ü¡I<̉ƒ₫L>8 É|ÁÊ3n†›¼7¹¿¢«Ô˜a„™Yéü=›$geÀ¶Œ³œÄPx3£O8ÚV„7' ÔGG56:́º5²ƒñ3©©tĐ0₫d)j’ăëMăä ùÇƠ@¬´„¢2¿Á„骒¤ÀÍÖ˜ÙĂĂĂĂĂĂm¿}ûú­€ –ÄbÀƯ&›Â$ ÆNB2O·¤ë/ Öăük÷»HЦŸÍDV©-Ù±?UÍJÈׂ¢5¡Lư¥ehO¥ƯQXæ“ơà?C8'‚M¢ZcÓ©™É\…€œØ ÔĂ«Á1ÿ›|}ëLsÚ˜¹bª&€$)…ẹ̀yF½0A!Ú=´t8k” «ƒÂ)Z>~üøéÓ'¸U¶̉fÖv₫>Ă—¼c(£ r¼”¸IÔƯâmî5 !²02¦‰ í37ÖúôéÓ‡¾|ụ̀üü,Ă÷å·¦µÜ zvFNn7b´@UD`€û³T§7vu¦>ñ(Óeœê9ơsÀÑ´çV”6¸,·èd¥Ggkߺ›†ºÙj,ɉ˜²üƒüôê oT†] ¿V«²€₫iMª—|ɬ?™‘O¿ûôă?̃öưó—ÏĐô\!]î'XmÑàG̣+>¼Ỏ¦Fđø‚KMN“¿t gƒºfQƯzơÆî ̃ **¯wê¿”æ×Ää¨á e—s빩"«eü;!ºóSÆáÁ-5€)ŒTˆ›™vAª‚Ñaá>Dl ? ă`:’MKÀ}³yͲæFǵJÚÖGÁ¼inHÇJtü'́AÚ @ïn[Êl–àÆÖÙMÄ÷}ÿüùó¾ï×¶P4?Û&¾#zkCË.„Á7  É!"̉²ƒNíK$fi–ÛW»²¥nXưÙUqZ5?’{q̀="÷`³E|‰Ï…Ă3/a`0säô‰zηsæ°?Lëđ%)e”ë9(Ưđêöy‰§CC†bcä°)oßÛ˜¦Çߨ¶̉Ù€>ĐtµOµ/£ ¸O³.åTê^»µMb+]…§ÈÂPJ~]ăøôñ—ç Ræ–ñ̃Zh“ä)-±đ4¨ÃkmÔZ=|³ ó!lÔS€†ïjëëéEûAÄo-̣1@´DÏ—ĂÈä#¿°¸fy‹½ÆQ`…ÓS‘ÓYEôƒøï_$!1§ âè-Z4H/ ¾Úm¬ïăA±„DSB Éæ0i©EÛ‘«X÷Ÿ^jf8BÄÍÜE\¦»Lú[Đ´•gRF‚`?íî t̃®ôU‰‰ƒP˜{?`éZ¾Èƒv!éú¼¼]ywÄ,®l̉-S¶ưBå0Ó,Ơè̉{n‹I¨Ơ°:ßsykÊ+¾†„£b&|à€đ«Å¢Æ¼¥́>îWÂđ®bQÓñ§Çđ*ïß¿ï{>¦8Aïtï 0ă:w`Dâ3„$*| /¦ºÅ=ư"½;ªºS\´‰™Ư®·?ưùOO_o·[_[£k+ "Û¶Ïçv†ŸÅăxQƯÀơCÁ̀7ø/Vj©Zµa‘ö¨đä@3m%±ˆđrN‡e’₫;̃Ư¾oÍçb!̀µ QPƯLP¸?ƒÑÅư߯nUC$Û ÇA¾tScÄîÛ¶©è¾ïX³ßæsúƒÖ§‰ rhPp™aßL‡ «Åó²`ô?éXø Ư¨r>Ÿß¿ÿđøđó_~¾Ưn³ïas₫¤BdDq3=†₫y|x¬§ªÄëäypăea^·5DM̀Hu>¬í ªUEíÔ)|¤ÉH’*c>­ÏªÅ·°µ]aQ´ÜoXG8k–‡|)ǼŸ!¥ '̀ưk:J¡ỤÎ)8)~?«F’‡7ÂFñMôÓ÷â»ôj¥L¼ À÷Mî½¢dRí×f™Û¶ëJxÊ2âæÏøc÷5 •Q́8ôŒ›!O±åB̉TDär¹hÑëơº́èÜuÅÄXIœÁHªô+!])2,ö̀à/•R¤z'OÚƒ¹»µfébhºB~&Æè÷náó¾ơ±’Ƀ,î$É ØÚ¦?íûΨ:&vĐÿØ~¾‡R±ˆ·û”±ê, Ç('Í^£ù¾ÛíöüüÜ6ÂÊB¸c‰¢2p?̉K‚AËfĂ@ùû°<¤³œÇƠ' °ötti°GÀ‰ ø…Ñ!-@ÿ§íTNt`ÖÑOZ@ÖJăé 3d Z#2ñß¾ s ©nâoêç:cÎÁ%l̀"@\ÁaRÖ”W»Ô a•÷"ă ÉÄ ïbÊt ¶™2D:¼ûѵ¨Ï T˜Ó6I?y{WâÅ•`34̀̀nûí—ŸnÅÖq Zbª ߥ”§§§§Ç§ưØŸŸŸ±Û7̉ =ơß ˆÆ•M’úQS̉s~ú2€±•d‡₫ăCUVÂÇlVi6dyøI» UgFdâQÓ”D»t¥X̀l%_GĂÅƯ-râ«…U¡Ư ˜§Íôq/a7è¾~,Ñi­₫¥”÷ïß?><~ùúååå¥+ç̃€¢£%Zÿúk3Ië%æ´˜‹k¨vSX­'¥ÔÚ¨#dÄ`±¥0Ê¢ÁĐg‹̀ff]ÅÆVưx`“ZÀÜ#l¼Ù8 `˜Ử¿Ä‚^¬ơÓ ‚?¦)uŦ̣c.‚-OgS&ăIpX£Ô4×&Î ‹nÑX[÷ŒxJ““¡«©Ï!̉oăô0ÙÅn8eâ1£Ÿ,†yº»â ºŸlʲA/ü(¶ârf f₫̀ÛRíÛ×oÇq|ùú5cq^©eѸ½é}ø-'ad^XŸ̃)>ơ.²±?Wăó—Ï_¾~é3l“ÿc† kĂŒ.°º1â{Ü%ñ¤„ÈÀp,½)˜„ÏđAt²^B*¡aDjíçix$‚Ag&đÈFTÄá7êé̃j̣Åø2ưÛ_Öû¤D otñ—ø‰óûP¦k¶ZÙ;Ÿ ¸O7ËØ“§Öú§?ưéOúÓ~́û±ÏíB_Á »v ñđ¼—!9 ™gÊ•‰|–.ŸÄ¦L¹đ:~/Ó<æAơ:ÇJGcpX¦#£²ăÿmÛ¶­ƯY­ơ8°Üzl©è1ƯĐq˱å?oơcfG=§@-âlˆ°ÄöM&¼Ú[†‰†aá.ê½Ç,Mªà{ñ<ưöơz½2¾gÜ̃mZ|¼¡œM…a7g>x„uÇudl 8r‡’®)gÅNpŒ×1ûîmâ¾̉Ê™k\E¸•ÔO*>ñ‹ ÜyZc‡g'Ro't‚*á3Öh¶{8O€¹eởÈü¢2‰¨º§ AShf,@| 6Æ ~ÊmÄ2­sUnâ"úÇ^̣€T!S%®œáÛÚ[ÚBµöëm¿¹̣ÆœF;¡7‡p:‡Íg~„VµZ¤óư€‹Ö]tǶB\$ªư˜;ÚtËex$©:.F¬½t$₫l[ÙÚĐ7ôß₫ëg~Ñèp4å}à~^îĐÿ8Ú8µ@‡'+ê (Âf­úX{pÅ•±p"Q“ª*º•íÇ[Ù®×k[AÄæ%)`̉k'Đí> d©33«=¬{UR—ÿVŦ9u`•ß›Í̃vbÇ“eYZ̃eèL×q/Ï/øß÷Ư˧)~Hçô=₫U|×B)µñûª8¬3ưbi[ÉV|+d®ë?ÓoÄ̀¤Qà®øĂ’ê›.•ûä"±¹©[æÏ©ÙƒûlÖ§§9Σ}Äw¯ỎŸ;a8ƒÔ™yÍ¾ĂªåBz†*²ƒ)[ă\iå ‘S Ç¥~áúˆÊơzưåç_¤ê±’U! œ‰ØLs̀̀÷ bWÓc?ăẹ̀©ĂNéJkÔëyÏËúÙ¢¥í•-ÉÜØ&›ª₫ôÓO¥”Ëóåz¹vµ²‘}7C&zˆç ¿‡óÖ™‰}reó.@¢é´O<|0F!Ü]Ec`±LâưFŸ¯¾EÍf“k'Û̀d2́DN‹ĐpeJC‘Ñͼ]xâÛơfÏIđ:æưp©ƒĂñ Gº„OÁ&ÿå×å/¹=˦ÁÛÎo“Ă[ofn;cḌNR à)oin&8¦·„¶¤É“%vŸ1¹„„ÿ¸÷bwî·Ñ=!b‰5_†¦ø[â8ĐÇ=”F¥u´ÇÇEå?G₫ kÂÖùÀÜÿ9T6¿“··_¶1( £z̉ ˜Ăă¼̀&Ê@ûV–'`ÊDÉLiÏ!Jc‚8‰‹míÛ}nÛÖr ¬sÿÿÊ₫µK’$ÇQ5wˆ̀ʪ¬¬éCΧYî9Ëÿÿ+†_Iî’gwǾzv>"#Â_fª"ûÀÅ…¨zTe(s{¨‰@ ¯)ë— ĂïWlîGÀǹŒÚA‡tpÜNû8añ1d,ÏTDÑTñ:âIlÀ˜¾`@›₫₫‡ßßßßÿúó¯ù8ö1ö8JÍGL>’¼>Bu*êØF’:Ùqƒf’ÂÏÏÈ)yô·1o!ÆX„ƒ-.H ªù+è *ë p XùtœĐđt ï¨ ư\OÿöN£<™Ù„¨7OͶ­¸ ÎS2;,fË$rNNcë·́ë)T£ï¦¾}w’vQÎÿ¤0Q×çtA_á¾Â₫JưŒc#=é¿øÊÇPïÿëƒ$Ï|s°­œ\&Dåp—‡|À‰Ô„VPûÇñ“ăH¥$‰æÀÑÙ€̣̀ïÆó‰ûáü,'‹b₫ø¬êqÀBF́tS£̃iáßUD_3‰Ùt0Éhñ.›0¨H¤ƠA ØƠpD}5 Hbr î¿-ÍEăû-ëwß÷rû!F»(Êñh˜I‹ơ‡Íµ₫#zôăF8åÔ…$ÄA›M³Ç ̃Z[—Ơ é\–0Çp8‰¦»Ó ÉT¨#ˆ½@ÑÙ»)LAAFôH7‹ó‰¬!5àÜÈ”9†‘ƯEB?j¬t³§@fɹ̉÷¢ ¦rr&đËŸqleúdˆ̀µ¨¼H<ư´—·ï}¢üÑÆQf0‹J71•?™5#¨£™‹ù„VßI¢œ¶t* óơ¹´€ßr}?3 £3a—LE%¸:«qÉă‡ÎÙP–̣ổ QPÏ~¥÷₫øøØ÷~½^§“;—Oº¨hWH&N³Tíîtb]́®- ŒÏoPË<à†Öú̀Uf7«ÈËóË_¯•!Û¾á+˜@±ª£0®B†ÙƠi›r1îÖ<Ë(eY°SùWØĂ–Ûq…æ„L%RÖÈ4¬á9“"ë `û₫Ăûß|û›ËrY–åơùơÓÇO}˜±L‘?c%lÙ É„E>ÂT O½Aƒ,&Tß!+iÂâÇ{/rE€¸è‘z§¯y‘tj±¢;~‹ó;Ùtg÷—Ö'Q?´}gÚQLmL!1‡bY~äÀFIÁ¢§ûCŸŸܼÇQ„yD°¦ ƒ×YF6¥fmØƯ›Ç†¦ª€'dzđÁ¸c¹€©DëY››«ÚœÉ2zPjbF!vÙ»»»ûû{²oû¾íR©ß£ơîù»f–«%’í™…Pçô2nĐå&@+øñ̉É›‹¼…ØåYŒiœƒƒsºØÿà éÿcöÂVñyøßo™£A•¦€Úư²Öå‘EY ü “7€¼“`T]䄳’a™y¹±¸BZ‘ơdJEÄ%µOô€K ®˜#ôo‰¿¿mèßwúß»ÓƠ¤(¦‰Íñǽcêü÷’­áé'ÔFnÏ­b@FÈïëQƒ¥N2Yh¾ßEeÈơơz½^¯¯¯ƒÂëMÚ“Ú¯[Ûư'dü˜–‰₫¯> ̀LJ`§Y^5wĐÁ¢K¥G†î:Ëa_à§I/〮"˜Û˜ä¹€!bw˜œ(gjHªcńx ÍêR̉KnRˆ(mĂÚ˜ÏsÎØç‘B êĐßBµPđ1UđªêéZZ€kíjѼ‘ùô­|°m<₫Ñü1‰r`03,ˆø@‚¡4U®±%À‹îVA Ú́Ëp³Ų5¸ïûÓÓS›°È-7̣à´M¬“iph¨ÂPR($§#-Û]ŒØx™x_¤>Ú)‘vAY²‰ÄÅâVdɪ*O5½÷EÓέµÑÇ>v‚¤z¾ Xñb{r) •Stü•nÑr]úh£÷¾íÛO?ưt»̃î₫å?ưËËăËă—Ç}Ûq^À+âpmxÚm̀ù"LĐá:kQ·p0Z“7L¾M³̃…÷àD`§ÅUר€ûW»ub=ê£øHnG8©’ }Ë2ᮥ¹  ÁËù„LB(Ả”坸ùÑ«¨DøPê„çy}Ă'|29:ÿ™ˆ'B̃“¾F°øzY»æS”âHP6°¤GN`å°,ÄáQ.Ríö¼mù„~dÈåry¸‘ëËußv̀Ăù̉O`ˆ‹z¤¤J+ĐOe†₫­¥µ€£„d†g+lr:å8ö₫˜ÆŸø¾>·Ë.mÑU·mÛ·}F6@çĂ4Äâ&0BÍGBÿˆ!a1`èŸÀ ›è3¶̀Ôt,-ê7ÀÄØR–«SÇD.ë!:«ˆ\Bơr₫²¤×nèÄô0@ˆKâƠ\°Ăå¦MÛ̉n¿eÇ̣.lNí„–¸¿ù¿@MŒ₫[ဠ8:«&D¤ø7B¿&v8 £Ç#7²ˆ ¹ƯnŸ?}•mßXç̀OhÏ­ë ½T,1qoj±øi¤åhù¼±„,o–_±÷Í#›]åÀ́œÙđÑ €igZí—ÖÉư •W9U[§;¼è8Zúö´êb&Úg‚*¢YÓưn‘c<ʰF«ÁËf!ó@±Mî¸ôBZNÍIÙ<}EöVùØW*ú₫Ư{ir½^¯×+n|¦íx¦‹²¤“·b—T†¨€2=“¨éjHk ßA%~"¤í[[ß°ÍØfÊokg…)EEºX<Ădp Sq5 Z)AĐ“‰ ƒåÂö˜`q‘4̉Ú¼l6ø+Tyn\JV Æ#F.+r$T´©Ơµ­}+ ~¾¾ÇÇÛRç5=£­YÛ÷ưÇŸ~|zzú§₫é÷ßÿ₫îr×ZÛÆ–]¥7ïPNJ„~(¥Jû93† í* ÛS. uœHñ=́–ª6FæÉç /;¨‚Íɯ`2gÀ3ä°¾ă«[ß­ »ñ¸Á']„¯ “5iÿ_µ¡2ăÁŒÓ?fqRÆáiŸ́[{=ÑF ;´/$ï#©L`³µ&á^m?—>`Å‚' ¿¨eúØ”₫›æ鮉_LKûàD<́á^è¿xƠUÂ+5çĂÄí—•BD“¤âŸƠÈ|´ñ‚SE–4û¿Ê{´|U^NǸó31¼ Öq¢÷¾É–g(‘ë˜đ!5†Y ̀Ó›^Íú?a|–hĂEpkü÷ë['“V·U¢óêœñ¢Ÿ­­ëj·lq“¢+g}M̃àEŸ^œÿ BÚ̀¿SE ™e•‰EUU] ü/Ík vñ¸êơ ơU€Û Üï‚ë{ḥ›àµØ§2O²‘́FŸåñưñë°o§U}\o×YhEN×KDZk—ơ""so+…<â¿ÑÁÀÚÚÎ":ƶoeª‰Ê‘z%ÑSuºsgRqÉQ´Og¦'“†æq¬ùä8B(¬Æmøơj,îA* ›O¢`¥ă₫ÚsÊŒºv@<úéœ̣P™'˜æ£Xíÿ€0dhÓï~ûƯzYüñÇ7ç_½kŸK¹PÔ&&8+¶Ojfƒ₫ă:Úç±|mlK$÷| = “‚±uq¡á6²T½x¥tÜà„B&z̃Ieê €‘{Ă8œî2C™yíbºx̣˪Mn–¦ƒI¡­,#&Âed´±t#JvÚ]đÑË–pYVÚ;§¡ÈgXàÆö±oûöñÓÇçççûËư?ưáŸxd‡«·Ó̃́?Íb‚‚¿D^̣)û~Ø*o±ûÓàO?FBAKqû•=ø&/A,Zm:Q¶Rơ¼ưùcUÀ¦w¿f?Đ-„–&Do]fRñ*¡gØ PˆíÉp@p"/³€ Ñơ‘ º®%·*”û¯˜«æÛŸ€lÙδq\Ôe.‘qœœÉ$8Ÿ3 {ܶ›*K–¬ài©b ­~¸—·, !ørN€;G€U}ˆg]÷¦,[͹·Nó£ÔM¢>Ê»‰Zd~CÔbüuoW̉ÿ¡{ÜYé2ñW%́1°Q~…Ñÿô])–•ñ«^5lMĂØnöƯ»w˲¼¾¾¾¾¾Â`đ‹ô¢s +<)(^ëºLøE;Yàˆc²<0¹‡¬̀ §""MZ ̣¿-Má×íÖ́w·ç9½1'€₫ƒ<ö12ñ]™ïÛæª6aáŒăMQpDYÓöđ¾æ–Y6FªXê“9磾Öü¢=ï÷({bqøÁ‘Y$UÆ¢ ·V ‚H,½EWôĂ<¨ˆå`á'‘ŒĂ©,Yåÿ¤œ󯬋 @\ˆd£‘«2 7ï>ŕUè)L·a33‡tgCÿÈ0›aḌ€—Ä^VH+OZ’epg:25¢|đ£́ƠTaq/MÛïøư7¾ùéçŸ~úé§éxVe!´!Ç£×§ă„W5@•¢¶°ô… YYuP̀%.âP20sBx€aN"»ïq¤ ô͉à4Éw%`±F”p’‚„Ơ€ÎÁ³¦0X¬îl>ÿ°¬Z#²r³€3 Ó·däă9O»]Ó €ư1L/²¤å܆Öñt/0ÈÓ"÷€ơêµk×¾m›ươÓ¯üÓŸÅú» Ù-˜‹Ú%!’³È’%™Œ±“@$`Đà­rvw4±d)¦ÂÓÉâă›<¥€«iC^Ÿ5L)¤ ^̀>ñø x¸±Ù›‘©P̃VÓÅs´£'mpÊÿáÅ™zç₫zgŬø ˜%ƒ8å™hđLwpoß®¹©m˳èB}¡G ´|Hf0xQf#T“¥o·²mµ†đ·(›âơơu»n­µEÔ2ú‘‘ưJgô\w,ÓL¯à6é\à°â!j` gú錕 ¾ax(²Å¦’1́”+æ)A²Qö—ñR‘LáHh”zœˆ˜N-Đü[øÊ-₫ ?é²a0B<+ ,˲|øđáîîîăÇ××+d,5$­dAç,„8éÊê‹ís‹oX ƒèc¾…¦ÚÔëư7ị̈dxÔ+uÆñr3|ÇuPx ®Q„@¹ưrÅV$o0”â₫cê&Z•U™º*ó “£ú °¦ˆŒ̣ïÆ;Ă£ñ;ë,n€€[;6;³/÷ï Ö4 - Úe~CÆ+n‰ ođD;o Ṇ̃1âw³}XµøYa1^I“‹³4KÆÉH&₫)ơT/ß2dƒƠMVU<Đ"ăf!dÉù)ƺ¢·¯<\ôùÖI3ÎR"jºOU/—˺®Ö:'Óg8ƒèä²|DƠx͈ÄÖ‚›y¡t#…Ù²-I=wî›gfJ_;´9Ëö± êsoLÏ¢@Âf€äç‘CbB–˜ù¬vu‚bÅ€óŸ Đ[ÿÀưpq`fÉÍâm3Ùe¸+0̉Àî#…n\fḾEî&’Û´E£˜O–ø”æ=zỵ̈øåß₫øo—åb[~*nOGE] 'ä(ˆîr~î6 åy1¤ÙNæơÁ\…YHe—Y‰ÂfA(ÑÔ˜ñ VÙç6ÔNá–H–ʯpr̉œqçØ˜#ˆ•‚`®3k@6C̉•}P=ØÿÜf‹Ơ‘äqÈV̀dܦbaB‡ÈÎǛR¶[‹}µà*7<{eÓŒ%~·31Py-ŸX&ü€₫Z±%Qc¬ëº.«ˆl·-O}ÖböWœ}iˆ˜BˆvN“HXØCÙR/"ù¼À‰2cüAG>Ë¿0"±ÈBÿç ¼V„ƒPAc:‰6ŒóAYwå„ûcG¹ö¸¾^÷}ß¶mPÂ.ï¯ÔƈOè¿g$z₫;JµÄ‚陸 ï=‚âûh”¨VóĂi’Iœª¢±ZX¾COO AíÀ}RSrlẠ̈;' {‰qT₫4k2Ü’—&ÈúUUCŸ^đ§ï>W ̃Éb‡×²°+’mÔ2 ¥̉ÿRË₫dŒqÜ8Ÿ́˜Iliæ̣Áb»ùÄÖ;ï‹Q–ÓÂ~ ôX` *¼:öëçÈóE†½B«|Öø‡¡ïǰM8+LK3¡‘RDi6p ¢È +ªQ˜Ôơ Ú¡+!i˜úIÁº¥5ªœ¹ÉÔD` d>J¹@ˆ₫Ï’ †́­¨1—Úw>; êơ‚†7?²ăÇs ê9=§|é[¯̀b‡üññññååÅYzåÓÉ?±Êê²¾9ÚA½™âW·*ω˜L%Âu‚)¬’`±`­Güg5₫:́ÜĐ,¿…OÚOñ\©0̃Å[#„˜ôˆSúØÇÖ7Tè·ÿæâ ’È(Ç ù>>Ä+$tø…ŸAơ°Ù+ø ÁÉ€lbúÙrHă¨{l® cdƠÈ̃n¤%O­×1Pê)0ÓlIfäW;bA#ñpÊÙ̃©æ¥‡f-Í£-úØÇ^đ(5¶' Ü•₫ÇÂ3N ^ÓÉAª‹<°£5Bÿ'avå90\’ŸNpÇ_)'l=5Ö„ªOQ'Ă²Q¶dœJ“tơÑ·mÛ¶Í̀­Q}…星”×zn€₫?P¡¦5œÿÊ\ Ă7À™ÚÍ˲r_₫°¼åÅàô纪€wÚÔ"M¹4Î ˜R¢*­A|QÁÍÊĐ.eüY¹_fvu^€|÷ÿë¾ï?ưø“ñû¾³|—™‰‹0a#’øûdlG( CY«$‡`È,´©©~gf¹2pb™¹6Ÿư:YhŸ´mܤ]ûU"đ&1Q‡äẪ˜…0Kàă«(íd%5¦Xº•65Â"¤mnH¥zµoîXPQ~j’½¿»q°Xhơ{-NÍ03úè̃nOºvíKG£½©îgï]‚ûM}®”%°×MUL·Kó†’“sî¹Á·„íkoéɇ̃Ú́E>¼>AƠä«N¯;i†‰Â¡Íu¼Sÿ̀?p öúïLlÏ#fÄăd›&ư&̀+‰ˆ_Ó‹QÍf*ïâä$­…̣ALعħzû+2U©±rÿoÍ<6µJq|uJÙè=~à|†%÷çÙ_÷cÿ.¥1̃úÅ™kâ|+ÓHÆ£ÂçO¦ÁÁEÊÁI>)dP¬£‡Å Q¨OñˆO’«zÂưOÅæLËlL«Ă,¼¨ü­`‘/"Ö$‚:Ïm­¦íááaŒ±m[ß{${¼Œ₫AÛ§ïBf̀:-œíß‚₫cVês÷^¿ư¶JƯ¼"Éú@Ä—¯®9H@ª₫g̣ r̀‡Đqµ½µ‘'d†~Đ@UW‡Ûq7ñ؆ ˤHü਒¦‰₫-$ĂϤúä6̀Ưsx¼µ5U¤Ö["PÎq¦ÑuË:ÑÉb«Æt”.ïô^%ư1Îơf|1'TkÉZ3ƠqÎßẠ́åÔAHÄsZk¥½÷̃—@ö& ú_9ÇF¸à[Aö$@uBí‡]FiÓûûûeYŸ á¬aRÚ™Œà@ÊWđçDº+9” +ñu’iŸµß)|g÷©H†̉N+XpC§BdhÄw’Mårb‰1KP†¸A˜§SÁ"‘»¸Fˆ`M”9&ä-t¼ñ^ĂŸfălË=E6€³̉–1kP;?”÷Ç̀è:‰T:ŒR…BX3ŒWí½ß¶›P[‘®Q„d%ˆ%H1,"VY†ù ÿ M"qêÏ$Ë ₫Já4 €bơ¹ñ-À}ÁÁ&º~>X+8 $Ôu¡`[x¢i…VÎ7ŸW”˜À16c~€‚Đoà¦ÜBÀæª']¥½f„6nYÀaŒU@« ¢÷mÁ÷e/°^Ö~ÿĂ².¿~üơóçÏY^†ùi’:OüF]βÇPÙ‘đ?³J„aiÙ‘°ŸîO„@F™Ü2*YrŸ ÜÏÜ¿ÏThææ@X×™Lëă‰ïƒ!„‘ÓÅi<H|£Å¦ÀXçO{v^Ylw6Acï[.µ·EÊ;¯Ôåđv»Ưn7pÿ©±CơiÄ"B3„×ü v´ƯƯ{R€ø¨$ r£Eë„cÊƯ‚»‘â½Í bRz¥`)8S¸Hß̀FKtP!°öqÛvÆ©/Ñz)Ronn0it“pp j¾MXDeă¢c¹–°^ “¯B¶ hS á…À&ûa>¼ặé| ơF¢(êha'´¼ÇÜ!È xâ¸âq/'*¯ö:àëáăâîƒ&P‚T6Ÿ“îĂÏ ÉƯ ^eZ[`Ôfa¹”.±Nªêº®ø§?,ẹ̈׿üơË—/̣Æ£ŒEK‚7̉tC< 8™̣|’ù‰Ö_$o î^&«÷̃ú̃÷Ö·d† =û™G ·ÑÂ0 ´à”Î ÆiOgj[³ €¢"='ܧºå½Lˆ7Å;4oMN(I óÜ,Óù=i8̉6e‡¾uTCÆ©y®å“´™ñsFÇÖöüuFkM›ÅI«¾†‰£ÂÙD ×¥Y–>c5ÑKᯙÊÑÿÄå¹Kü±i]$8Ø0:†Í{½‡@#¶á…\1 µg'„bó0H\ÖJ$Å(¡¥I3ƒxâäN<Î+Qđéù[¾>…zO6Ăº)@·d†›C<ªĐÈ´Mªäÿ.›a“0» Ä )å‰ ¦«ùøĂ—ôÑÿ(#“,]vjfCJôÏ¿22Ä㙬‘“:çđh›aâ¼MDÑs “ˆKeiËår¹»»{\ñ”ÿ=‹̀|>^̀-BGØHÀÚ±rv¼nÉ‹ÿç‡Qï{ß·mó*4ȧǴµƯT‹@²¸EöîÏp/> Èí™mæ[¢•aQ¶JÑ(  Kćg“ ÚóE³IèIiØlóë¶¼3‰3 ₫XzRØ–ḅ|½]÷mß¶m †-`êˆôÛÛ- çrä±G¬¬Ơ#́“£<.÷|¹Û„;L‡ă>É?6 ªÀ6QæŸ b̃üÓ&ØØŸÇ›b{ó o*Mâ%^×ơÛo¾½{¸ûøñăă—Ç2{¬‰œ6)a3cxóÔ O#mZèÉàŒ½s”FêNÿ«‡•^Ô/$^ ₫1çù{6Úú1cyÆn²FÑf̉đÁ.o:ã_Ơø9åéÓđ›^gtU^"g×ÉÔO‡ñ•‡ª¶e¹_–ëơ:6B¯n¨ơăW Núïûµ¼§B ‡lœO‘Vh®’ĐŸ°©çĦͶë@¾ß•lBäÉHÇî”ơÿÉaTY$á´9̉̉øÅ©Ưgé$ R˜"o.Xlø›®`aZ̀u~€‚_(‡c…q'# Œà!à*o ª¤Äj[ÅœPFxüVG2«Çj ©A ¸Nîăúo?ÇVúĐ#ˆ"“4mƒƯy|/D‹1_̃=ÿóZZ₫E‹¸óʸ³„ø̀Gƒjæƒ́ëÆµ‹Èëëëc»my…³¥7{ÏŸiŒº¯¹̃ÿ´ë}HM—¶8÷oÙĂƯ ₫”k)«–Gy®0³!Ôƒ­>pú`iÏoUtÄx}̉H°uóÏá O”ùOjߌ₫'‰b/ư”‡ƒ»`·¤í }ßoÛív½¹˜c̉¦Æz'=÷ô-Ü øÑU>Ÿ“K4ÖÜÂH:ü°ÿåíÇL”’Æyă 'ZffơFÒÓr`¸Q>2pn_Jt¡B¶“…¨¶ÑŒ¯ÂÉô°˜î‹µÆD¾ú̃`ZºNׄ‹:“NMÛÑ9ÀlưDó]äöîÈPàhHñdK ?9q̉*c £¤ËÖ7ûK¬?Œ[Øè£„ب¼™Ëm$“œÔ¨*f4%l6¾YL3{Ă™wäM„ëoÛ¶l‹í̉¤ yn‡)ÀÔ´¿•…xŒºú0&‡¼%‰&nX“×L%®ë¥÷Ñ÷¾7mye6s‚₫̃Üç8ª0ÙàQWÔk>Ñqë§M©È¾ï///đi¼©&5­ơ­ÉBç(K¾¼ñX×u]WUƯöív»Mp₫p[/÷y}y=‚æ“Q‘P¥ájç8ÿâƯƯƯ‡¾|ù¼}Éó~Œ±ï;êh1™z|œ¿₫ÆÏM¢Ơ9v¼Ô|^°ü3C¤¤?s/kÜN¾}đïá×ñî$éå;$äL$…L»lZb₫΂¼¨§¬¿Å|ùÁ†üÚăŒăœo‡~÷ë—Âxív*¼øæa}jØøÚOóư•Ó>e®W¦l°Åk3(ÆÏĐ¿ˆ0ܵl4*SûÁĐ¥ơo¸4§A&„} ưŸZ ‡iœN(÷º|°éÚVUƯ÷q€˜mĂ —ËEE·›ç€~₫üù²^^__Å Úœµ‚ư ½Q3̃%\Ï“¬‡zƒëơkˆåûîû¾ơÍ- é˜[[éÁM"-…÷^¨biê7ŒtjăR‡́iب<É74?@`®<q|§Xʉ6;ÊüľËAa?n'À27uĐZ‚TƯöíz½̃¶Û¾í§ùræ µ<1he,Ú¤ƒ¶æb$9˜G<•6ÓƯƒÂKr‚ÆÉ°̣•8›ñƯ¢c0'ơÈ y¼ói MD¦ ËKN ¢üƠ’€C¯µx·Ù0­[ T>È ê0ÖÀ¬£ ï‚1.iỌ̈ *yB°VÊ«÷øHÜ#ÁëàTºÁ;¥XùÑ>IØÛt́+̉ˆÉ£ ÷÷÷ï̃½ÛnÛ—Ç/i<04Pă2—>ºÛƬg®Và@ˆ0}Dáá–5Ö*iæi›A£mÛöç?ưY›¾^_-°© ù¯”Q±:2Xk¾¸£•Uu`¯Ù‡P!àmŒÆÀ]»ÅIùH°ÂAhÁøÿØ(n}œ¨$(F3Md´ơY‡/̣ú-hY&# ơ@³”X3¤îưû÷ß~ûmkíùùù§ŸJM5Qª*zÿpÿưï¿‘¿₫ơ¯××ë [́9ÂÙ'đZơ₫₫î»ï~£*OO>9,L'ØjvÁ ‡‡‘<+–†m௶ÜJ5"©ö™ÓIÂ)ĐOw£­J°̉ж›"*—*#y;=ÿ°̀ç̃Ôr×¹yëT—ïV¿DǺ́ëøp"àễB Å~8d%¥ N¦%ÊL‹Wó:-öII¨X“''®9É?;‡Y¤ù3ç’Ÿ;¾ª,Íȯp₫®Ưĺ]PH¼ ‚€IDATÿ5₫gê<µH{›\¬©rgäÀ+Ï]o¤¢>¸ë$—ợ₫ƯûeY>ú|Ûoc̀ögÓöáƯ °mÛă—Ƕ4œ§0À‹­^³_Uá*™Æ† 5€kX̃°qÿË²Ø ZÜ?êưó¬ú’bf¸đ·¦+)iî3ÛêØ½kDÜà ÇFèoî#zW-E?qă…Vl6Oû+w\âă^.V"Đÿ̉œ ¡â*Û¶½¼¾Ü®7d›8¾¼‘Jy0Pèç©ÀW®pŸ–T`nÀ9·ÓT)¢#C»ÂÁw5ù._ù¼Ê”°(87y¥óEL¹À°̀3q¦?×^ËÇ JÅæ§ Ù;Á.r®̀säzëÙ|"R£SV¦ù¯QPô< ¡Qưˆd̀e2ÿ\Íe½₫x´“²VùŰĐ[J4{j`Nîîøự²ÓFAc°å}jOc€u(ÿÄ’Ú+B™O¬6¡Đ1x₫:sü³¿Brp›æ’6—î̉Ÿ±îK—Ô¸đMzªC,dYƒY2*zØ,èà“&/z₫¯@ư3=SGp0(j®«@|$ĂB€”RÈOl‹ùit×ÀFg¦ïVGEć٠Æÿßn·×ëëår±Γ ä+³óơr¹à\‡9‘ÙØ+{çH:UÄ|©êº®eơ+s™d3cµ©ăa¬I·àèÉÛ©A}<₫|±æ€~†lI¨èăúä_±Ư=©ÍÂư›1<¼¥IªAPl?m>D„NPhÆkH=Gøö Aøäj•·"vSĂ[BfSé̀¥_ñY‘0Lá§Fï_…Pñ†Ậåèp’Al#„SĐĂỊ̂ ‘%¡̀×kBḿƒcơFĐK û¹ă/cưÁ…€&´ { ï ưÓ8ư÷ưClhâE¥´_¨³§¢—ợáÇuYŸŸ-§ß7ÎåXSœ_a'ønbĂĂ.ô? ú—Z„ÔĂ@¢ZÔº¬æ«·yʾCçŸøXX5±0CÛÙ̀÷²¬,(g ï}6Đ ]ê‚Ú lÓ(ùŸ8„”+œÂîT›·v^̣_¸"ó•Ư° ̀|ö¶ë OE3å÷¶Ư¼12¼+½óƯa×Í@è·†½X4ˆXƒ̉ ,Xă°µÆ°ÔáåtxR˜iûÚcB*Ó‹•=Ó.̣•7“¸ˆ%đxÔ”0è¯ê¹†tÙ¡Ăj¡Ø[}xĐ ¥ÎS>ÑăÄC”÷Ŭî[ñµ#L½ă£đ…™ªÓé’Çßú́(è¿4L0—k£zó5I$b±âb´áÔ!̀Úæ˜9ZBêÛ:²Ü'»mf¡% éÅ)s, ´$êq(ü–0A2:CóưD ›¬Kײ,:EỴ‰6–̉Q±B¿ "'ÁV} @È…< gYiñy}¯À¾ơĂCzo=ƒ|¬¢ntụ̂Ôaúáí̀²\#›Çi8̣\§ă0‹z¡üÓ`9ß5Œ¹Ë‹esµs~»ƯŸŸ·Ûv½^ù‡Nöξ÷——¥4¼ï ¢úGºđRƆÚnÛóÓóËË óô' 5ÆQ~"̀®=¨bjpS²j^Á7Éc"%'%Å,;®Ï©>-2 üjâSÔJÜ:9l„(È™`đ4Ü•_Y b9œ}̣Í}G2<[̀J̉ NTV™çùWuºĂR·<]LxÉ© ̣™;ƯÓWăyđ÷x1M™V#ă˜'|#î₫ÊèÿîTt†÷TôOßđ¡ÍôsUæ1*¾ß„₫Ga‚×̉CÎ4­ &NÖ^·Ôá‘>úëË«4Aqä‚Së ]bñ?¦¥Q^ 6À¼L6rCÿëº.«Å«0ú‡Ñ•ja\ơë°]Ö–¯¦ßïw+·ăñÇO’ơô ̣0s¹|©É»'¢Ëp&̀q‡Ùe›Î$i) îÁœĂ‚²j§ÏÆØû¾Ư¶ëíjå>ÓX=˿ʻÀŒL-ÏÆÀ₫ñÅ·CÖ4§(çô ¨eo=Jo,¨ï·Jë‡ÇQ‹±(LÅ©o!%/à8O–uŒ‚µƒW¬ÿ— m´áÀœoG´Úà8!>¦3S,F½µ8G'¶̣Lđ®ĐºwßRÁ:ÅLTçË‚#9;Næ{2xz¯c‹hqhîœQ¯làạ́~óè^ù[<Ÿ“ä³A›ˆ :"¦oáó@·Nÿ¬ jʾUjü‹|øđáƯûw/Ï/¿|üeßwX5u9)â‚Moïb³A%ƒ¦³Ik cz„*’HÖM¥K÷ÿỡ[ÏFË’̃€<ĐXsƒØ]@Ç%ûG6¤mŒđ6`uX„&Qgñæ[`3›Wö“3̃ûËË˵]¹ƠÎåñäz»~úôIµy¿ĂÑ5=Α7Q08̀đáëơúë§_¯¯×Ó«æn=zó8°íÄô9S2tỌ̈Öñ¡ÿ)Ä®± N˜lÓùofƠ‡:2µ¬Ç¢z`1́k§·‰ñË?đ85]pAo+4•å­@íổ|Ù Ȳ ̀¹nüâ*.Qm¶¸zêù$…^^_\ØÎ‡a<‹Ü(²:évEw±ÿ;ʺ¼µÙË5±”éu2!™{Ca?™­̃ní}¿̃®Vóç­¾ Óü°0K=\wH2ÅdĂÚó¬ëº¶Ö®×ë#ûà†ƠÙ7ñafẹ‚MÇ4ă-r)Æ̉Âơ?µĐ³ËV·i™)Âñ>#Gsvß(LÍM[pFĂsa/$í™ûˆ/xœ¥¹æ§z à1ÈÁèq´‡8¶(TS±pÓü”ÍSç .*đo×3cwíƒ0ODgÀ}ñùCE-₫Ç₫µXvn*gĂøĂ₫đ?₫çÿñññéù_₫+đ7NÊÁîfBhêq´—m‘¦µüØÀp;%ùÇƯB›Œñ=®/ÇqoŒH4èüA!³ ơ´áđü˜ÿ$0›¼°}s0JÛU*›%ôüà}bd“çÙÈí B:"idæKfæ ²k“9ÊZ (bœ’#R¾F$<¿»¿{ÿáưº®ÏOÏfZ»âXdë[ëMDtQsd¯Ëj†Êe]½0¥© ¨jÆ ̣0¤Üˆ@ùœ:¯ù„ă,aWëÀ–€‡èwu‘ Ö¹¼ dƯɈ >3`çäáª$AFÎâ8l Ä_ÓR=x/œÉ+âF°a•cÇ¥îĐj‡ă(=5°ṇ.ÆOèÛ.S̃ù/1m hxùơH^ă³+Ít¤ 6qi§`Âù¤tÄ3p“ Ơº° ̣«E½/̃¯Đÿ§ {œOl„|ë w k*Ö E™Ô2—Ẹ̈ 'iå°üÑʇq°`óoåŇXÛÁ&mï{¾ƠÊe ÛNØ5’rĐkYH!³đC;ñ ²Äf?]Øœ@c Âôơ²̃ƯƯỡíÅR¡?VLƒ8‹x%°ä pª•L‚ÜÔd„`ă°Pù¡bÅå¿ßW¡4-£}ÛU½ (¨l§Xú ¤âM㛓gAR,̀’vû@sh{¹\Öeơ&ƒû¶Ư‚ûGZŸ˜=Ă<­Éçʃ˜ƒ:“¡Uqq"˜wœ¹73Đ_)₫§₫Ëó?­J!ÈN -›ÂÚ J˜Œ¨ ˜a–AaŸ1ÑE ơˆ$·Ûơv½]·[™ä7̉8ËÆ”µ:ö©ĐÖ¢X1D=Ă#÷C̀G̣Ó«2)û ³h„Ù(̣V„¤̉eÆÑ{x$%ç‡VƠS…Zâßadt)Í##˜]níÍ|;º`HÄ>Ù{QiŸƒđƒë#H—32e€RDUT̃ó¿x2ĂôsÀ:¬ạ̀‘?¦ÑË£°¡‡ø™²̉|”~El „½ ,¢H̃@°zT@Éô$Û]É?»>zÛ¥ØWQ™¤¨pç¹–{4#pȸ¿»ÿáûÖËú§×?mÛ¦ªË²@éwéëe}x÷Đ{ÿô铈|üơăúÇuD”*³ˆ4)¦iA1™%·2æZk˜Y~q#tË~pª—úAy 3¡UÔŸ÷̃ZƒÀ©ưÚ Ø«lá¤W –›Œ mÇ̉äóɹ$ÅU8¿ÅwIêh3óœÏSt|L:é Ä9Ûl_M2VÖ…p̉›c+?6)ñƯ™§ô­c²£0à*Rw&~‚£Á?À0¬úΣpIqqQ²£œg €k‹M½ùæ[₫»ơp#‘s”¶uÎ/ud’³´g|¼Đ›c|p¹\̃¿/]¾<~~³zY6µgÜñdŸ$ç_(üÏ,íœđ3¹è¯̃ûº¬÷·íæ:|e⯕P´ÆRR Ef*——áYÙ}Uñ˜óöOÅIƯ_-AC` mÁÆdÄ«ªzÿ¯¹;›T´Ö}İá<0huœHXq|;@miVÙÆ¿ïûŒ₫EP­í¨˜῭uüçÓ‹<]è@FĐ'–d’wsó¡jøßÄưdKLö³P]G₫Aöb€µ²mYí—UCÿµ–sṇ úÖ́¾í×ëƠ³«+[d§ä¹’©Z l;îf€J˜"ư¥!xơU´4?«âøøÈ&̣"ùoëˆ.̣ u¾¦øÎtƯ×AÿtMS@ n’¼áS„VµˆX±sliOch₫ ²?¸^CxbµjKï&&Z€†#*´d³„,Ïùé³»>ŸÑ̀'áÙà«€×ç!¥̀Ơ«¥Ú\l„Hb!g™s´‡ds9‡u3c< æ@="CƯ²9aĂÛNÁ̃ Ă#¿>•@e—QØñ霙>ƶk1 ×9iŸuYß¿¿.«iöÖÚ66À»‡»‡ï¾ư®₫øåqß÷?>==áĂ,'؃#r©ùgçíÂc²]0îln@6É»Æ÷û+̉½¾“8ñ†ºœB̃yëŒ2A¶Mlüđà¤ስeE?2 Eå¨"̉ád=0ovă¼ŒßwÉÊüw Êúë$<£¶̀×ÿ.p ư (́ÏÇÉị̈-ÍÚ¯æsâŸ8©bô_OñÉÁâJ[Ư a{¼i[×µK·<¹Yk)mgN ;SN5íéÍW-Ï’›¨´î,3d—J¤åâ{',[Œ"'†e˜:è³?ï.wïß¿}<>=º‘¦bŒÉùƒ¹H…VÍc øV> M¬0Û5éÆq̣|âïéÎä´ K ºLIÀvÁr˜úgƒ—)ÙVr”÷ăÉ´S g„°ØJ ïă¥TÿH  f©|«¬Æïv¢Âÿ†rǿåpñk‰₫—ućûn…hö}ï{ÍÉ/Æ̉ôn¾S=Ÿ9åU0N7%ï—œ âæyZx ä ˆ{öô“'ßƠpÚm^ÖĂLÏÁ°í̀mªÍ €³oÛ7ç₫‡s—÷÷÷ªºm›ơz«sqüí4ÂC¹@ÍhÆưG+h{5ÙÖ××W‹`Á>ÔíPî'¥æ c^ÆM›»Ưn·qd_Ÿu. ?“́gĐúYÄ H®áAaùâZ³Êǘ‰T`Œ ÆÁO Ư¶QÔnƠà>»J Nr¤¤úăÓ·Ă319=‡G `7g•=°ÄŸc{H©µDET34đ#Fa:0åçùàAö­^9 ¶3Ưƒ ~ à ¼(pÎđÁ–ÉQ&›?Ï“¬Z8ûg“5NM ~:ö}}yUÑu]÷}7½¹´ÚĐ:¬¯º.mé½m¼́/¼ôùë ÷CDyV‹:°i4·iĂI‹̉̀U`Rj²%4BÂ"iA£ÀˆôX₫m´̃{[ZFöSïˆlĐ]±,º'dW^ÔëLKJ:îçAÀ}Y˜  çF‡´Í$–Ó¦ÓÓĐ—SC¢‰´ơDÑa0ÿ*Ơ9à ª—=ÈÊá •ưR0Í|>1˜4'öúº®vz áéM.JóÜåÉgE{†ëé©o'Ù·¿ùVT~ươWëƒÆÈdLô?Ă÷£0đ~Ï-#]¦‹ÂQ¯ ÂÈæÉ‹ó0ḄÀm5ñµSøñ•1Fk^·]t´ÖP1ĐñExȯ«yĂùút Ç!‡³ OxŸƠ<:a0Ƹm·Ç§Ç}Û¦”L ëÁUÍüU9\ŸQ>¶Ơal| Œnóó:OE®o}@h!uLĐØä–¥}>‹À¥ƒ :ÁÛ<¥ƒXa¼«/¾,˺®—ËeY–!cÛ¶Ûív½]÷}g¬_‚¯à¥‘æ 2ÜXz{°đ°2̀:!±ï [ŸO#Đ9ºñi œƠ=7”ù<®,©̃é?jçÚÑr;fÛª'¡‡¬¨ô½§‰M–eùƯï~w¹»<>>₫í¯ƒÉQFBµ|BZ*[¯₫Ü À¢ü¯}}}|~D"¯ i|^NdtđÙ € ¯ëúáư‡e]öÇœ(¬1Ù`…g¨ %9ü&µwwwfúÛ>+5!đ'’2t´2G‚~D·{W`˯Uo$5[â"†o÷ocK´¢ 6 ư¬’û$ÿ€}<ÏÅ:u¸BâiR[‰]F™±|„+&¸B ê&"° …,$¡[ûùëèçZś`uđ–ó ?0‘02³ñB”2°9÷i"­èS›b6H\E¡”œZ,!ŒEN¦eŒÔF¹Í!¢̣̣̣̣ç?ưy½[ïïîïïï·Û6¶ó`éËízûøËGû¼ç¼R.ÁHŒ®t~ןÑ>Ù|Y5rt$È€ú®H×ƠB·ïÍúè-²”Ô¯%Q ³r#£€ë‡:igqDf Ï û&¤w›1ySSµ€8Mïîî´é¾ïVƯŸÉ‚iµF¹Øfå|¡51Đ£—MÄ á§ ® ₫”/WfL3oñ₫e rY®ÛØöÜDGC‚'08-÷e©ÿá?₫ÇËạ̊ÿßÿúüǘwA3϶%°ô!ösáăâá…†´Ö₫Ëù/ëºüoÿïÿưåo/²GäOtSÖpZ «^’Y¤_å₫¡¸$³ư ¹•GÍ5ø f¼–—ÈgÄÀ¡¯_%;Á’÷Øôụ̣́ó¾©èCâØ…âmfơ7›ó7~Dº>“¤Ø6!Èç¤$ŒR×rg€‘ͯ¯¯×ÛuD{/l£8-uBÿR.F;î÷óOå/¤á#ƒÏJÖ̀EÎiu½ç«hùXxÆd™,A¦‚v«iƯQï”f؉̀¬&T–½cÄÿzY­©e£zÊ"J Å+…&íĐơhb+xªy!xW$9Çá á5À½"›‚wÙ9úŸº€É¦ªŒeđ:IOv_“•åÍö–æróJở î}ïf_mÛf’Œơ]/«§ƒ¢º¬—»û»ÖÚËóËvÛF¤É%ú׆VŒ₫ó¾èƠB“Mæ÷P ÆÍàÚ'…Ø´Ư?Ü/m¹]o˜Ü̉&¬V%ç[JH}¢ó3,úö•ÖÚĂ»‡¥-Û¶¹äñ=«0ĐÀq uX´K>]´´¥.M¼»µŒ<DÄDKA–c Z#g`Á÷ˆQfîđJ~ëđڴǩ߽»Ü=¼{!_¿lÛ&o@#á Èåqzxëï]azưd¡iä ͇„£N¡(úi«ÀJ$tpÄđde¥|j­+Ẹ̉ơ )bœƠ’IƯ·ç—çvmíÛæö3YWw¶O/ºXR ́œl4Qé|t¼¹vđŒÖ[ç,«|ï`±L·ég’dƠE·5?_5ƒä£n9»ư0"·Í Á,y#+PÙDÇĂ1nnêî₫îr¹\_¯ûËrjúẫ\†L‡Ăi¡ÖúeËÓ9:ÑeHñ(‡‡ĂâÇ€W¢e´_1¿'5r¹\~ûƯwëạ̊ç?¯J\5 B†1Pœ!O›QÂ釾MÛ>vSû–º´¥©çüơ¡ª¾{÷îîîîơöúôôt½]åT¾¥¸˜áªßbÜvº‚…âWE€œ$ÈƯ,èđ\+Sª4ˆÉ1D¼…HA´©ä à5É₫˜VóôÁ4ÿôâ`)®(‰ă¦ ́Sm»T—.»HdOJ„ qƯÏ̉*Uœ“bôŸ·¤EƒäßăàI!‰˜Æ̣̉ÄÁ•¢e!!́^´Đ¨ @ K<0=Kiz¶ÓđC60ç₫ï.æ…¾m·ÛơvÛn¨D‰âcn•‰±¸&Âq–"Ô¤¾À~¦Ø¼-ZLæÑÖøä}4½È—¢};¯ÿVE·ÅrăÉ-•©TĨG₫˜FÄÉƯ +Ư¶[ïỰơ¡Äö¾[ó™×ëë´ơ¶o¾ùæ7ßưFD~ü÷÷mg›èßÍ/9âè¿Eü—„æ±ă2;CăX•Ù0‰ÈöƒT ¢4C ¸†#ŸO_!`RĂ+‡CNTÖu½¬————y9?1™S¹Ér ‡ŒflÚ„ˆˆ•¥³Zl˜á¸ßkSru m [Ă,æófB8&:?§¢Ú ÀÜ₫<Æ8rÚôÇßÿîû̃ûÇ_>BăMpŸYÏüEÑ„CD% ă₫Å#7$1<ª)è$y˜ơ₫ôôd‡«÷sëåqX|z̃9é7Đh¦öêĂˆÿ”*öWĐ3¸ÇÑ2xÊ?‘àø³æñ¶ÑßT9 ¾n9¼!s¥FkÆq8Œ‹b‰Ûg 5‘ưÜqlœ_g̃cˆˆy ñ́̀b¯¶«§~ÎècÚyi ”Ẩ r2¸)oô˜ÎHA“ n«¢=u¨—m¥|ëâï³;˜¼UƠ£…M·̀8QL4…c~#< ÿ ”€ëëơ¦·àRfŒĂî¥m×Hư¬ ~ÂŒó ÑÓÏáú°ÏxpŸm4`îrj9+2đ/RG( ˜d”₫›&A×Ѳ¸§ưË©î@đOüPBÿvưGÄ’¤¦́}ï·íÖíj½¬&3üÅ?0û ¢ÿƉßk.‡’ ‹øÖVEæßÑ/A´v+ḱ”¸‰—[D³QÁ ë«ÿ(̣Å“å¡`ÂÜ¡"///ùË_L°Y$ïL´wÍ+LVưÉ)#ÄÂÿ†Ç¾¾¼ü·ÿïÿ¯₫z}åê å‹à_G#W` ­9€±f°ÉD¥ắèôæ¥7£4„̉„́NX€5ŒôßÜu’³£(ßɨîÂGQ*¼UtûÓ¢=VÙ£oä¨Ïy'TÀ&•'‡GùSÜøÛª₫O_)™©ñơé3BÖ»E$qɶñṭB‹Ö‡èü)FVV˜v(í$>H&s¡ëîH|d…|µ,‹ë=‚àú¿\.ˆü¹̃®@ÿS)údöàh«˜F=₫NĐ8"”¢ S0‹Đ SŒ+t>¨„A ÚÈ?Ù$ÈÓă…ÔC»ËÏI€g>{ÑÎLû'â…¬u×Weôô?2Ôư êƯ+ʺqP̀ÑW«¹?¨Á%<,mQÄ¡ä¿$™2PêtŒƠañ~Z[cñb8đÚOÅ’pÈ1ú̃ŸŸ¯ëƠ»WdZe‹svÄrE=Z,êuM\Éضíó§ÏÚ´ï}‚˜EÿÆÆVa¢WèàSb¯#ùö*£6o€ŒåFn™雼,ÎçÈKÔƒœĂf#pÇívûơ×_—e¹Ưn³¢×º9UxO&ÄG¥öÈ«æ‹@A‡BåÅb’mĂ·\YÆh(°“jS ª¢R2D2z5° ÀùHî7*¢$́>f_T¿gåB]®€ÿÜs;5gƯv̉¥/²d¬öúŸmH‚ëữ}ÿ‹æÁˆóqR÷„kX,GöAƠmăH́·8[ÀsEĐ+ w/¼+̉z³¾̉瀧2U°t‚’×¹ ˆ6­4„ùåååơú:Ät`ÿÁ³'J5×Ư€8À̉0̀C‚Y7VD¼gù‡Øæ (B̀¥VàNcaƒQ5ƦÆĂد,e I)mÛöéÓ§aIÀÒôÿ16Ÿ&0àJưPZLƯ¶o} ‡µ·+ª;ü:ædôñëÇ____{/Ï/PJ¡ÿ­%ëï̀ :vÍâtiëQçFƠÜổ½×•Ïf-{b—ÛöÍ|F)5”'4cé!K[P€h:j Ơú'1Ƹm·#S(%¯àÊ!7liTÍ«Ö,,&d 2†5° ´e0Ó[×Ư)qÈʼn§°5O–ŸhX¹‰æ9‹Z†™[îô,:bÛ¶§§§ÖúQîFmÙê„çÓbr°Ä9üd1Ơ껬„XCO B 0/„M̉Ùç½K: `YJ@1Q¦Ä•T£. B«yŸÓ=BT̀ƆfÁgŒêÉæÏúLˆk£íü=¿¯_EĂƠ`ën!=Ăú„1lé>Œ.™ø+#såÍ$÷£cÜ8 °b¶Ë+&ZLq9•å!V5’Ưô*ú¦ä„°,ñ2²g₫L0î_đ$WƯo¶\çxeºómcŒmßåx³“è₫cC iÛŸ1â~ēآçJNBKfÏ›µSơt¥üÆ2n·›‡•KA¨_€85°ñô ư_‰ÿùôQwÄáËÅSßZN˜û°@4vY`<œÈLu‚¥(¼QYÖà[B…×ơLDfSyœ?ŸÁ7µ82ú!…^Ñ,6_CP<À'áÙ RÆĂƒ"s¼ ²¥Üô:ỳÚ#¾t{O0è*à3_ˆQ~:J)|^Óºâ3Y¡ú₫Ăû»ËỮw%_áÔµyÖokmïûív3ô¿m›D§[‘6ü-\'ÎĐYdheOe)7c`Ÿ¢Eï匑£@h¿c2…t§°Ă!©óÉj:̉깬ˆü¡í“b<̉Æ|ºQßeû>v£¤÷¾›£ù×îU#AåDŸL|“Œ1ÆËóËơz•!û¾ôODÿ3:B`ü Æ!<Ô=çºƯˆùdï4¢*»”¹d @Yb(­@>€ ÷tñ8ECjô±³åĐÓé€`““Id§ư#¸„@sJßv™®·¦`̉ƠâΛdeô ȆÁaÈ˾i¡w`‡pº°¶ÓÇ©jf-|¼Æăv½¼NPëŒU€.ëI…„欈¯Â Ă4R™âĂØù̀Í#,}—½ñ‚ö¤âàâ­Áj'/®P¯˜ü OEñ­³pVO„ÎÙ¦—ˆmÀfí¶h£;é;\· UÄHDxO‘§—©V§FŒ3ñ8¹—¸l2q”ø+âQÛ]#Ft`öÎuhÿÁ‘‡·^/Ö&\IUDËÆáøW†̣#x°úi¯Rz, ùïzTõßUqMüq`¼ç¿ÏQơ î»tÓ^˜P›¬¦µf°Î?DU1ḮŸœæÊ6­ëÛ4É(ƒeHγă‚ö7(îø­= u’¢³+91h9̉#'2}2ù~pr’0 dtµ•‡»û©ÇĐ,Q=`Ép£C8Qn§q0yµ6–!-Ổ„₫]f̃zâøxK²1*R„=úŸéظ înfôñ™#Üçr¥7É=ü ’ôüy£KrƯ¥(ˆHØ̀\ù縃«ĂƒtÛû¶»£LÂá`Á*Vñ³-Íư¿^_·Ûf%}mnÅJ₫KYüĂ²Z†¡oî €ĂÜ)o@—·XB€{§üîû“‘KS­™Ăi*½\¼î”48I[n_ÓƠƒÄÂư âû¤E ½ïX‡€°zçnYÎ!*ºí[ë~;Èi­™Ü7ă´Ië²b4Æ^{1{¡’‹]Œ½ó©TSL¢Ç]goÓíÜgäŒEAh&MϺ‡^ç₫B%UÇa?°X0lÅJă,ɹ>²@Q?J́‹Gnô¤$íÆ¬Æ9w6âÊ ¨,”Gă<âcÊíl8¶&¥æă9úñ«EáæGđ<ÂÏv¡iûđ͇»ơîåååù鯻ái ç­RØb2©ăêR?ª3x`À²Ài…CÑd5¡ƒ¨¼·Fn€Ÿ¦ñ"æ–-:̀~·0.•Àb1|™”…™ÆJÔ%™Í…DEœˆ°²đz»SÑ}́óÔij̃L€>§ 7}NdNNŒ^Ïr<98x}„8£?4É~Ö+`™@–™m3 R‰„"¬uµÁÂÊ Ư`(¸!èe½hÓmßö}/­NѤ4FĂ™©G ¦O'À蹈Ó)9oÔA (ÿn]Ä ̉…‡ƒa0¡¥'e›„øi¼‚#gê!³ËZ^‰Ưdº”-[ GưåÊ|¤>L]ÇæÙ™ơˈ[f̉Q‰¹5%Í6̣ÔößQhÈÜ?>ØÊGØôÓÊơ‚TỨÛѪÁÙWdcd›Ó˜đCÍ+Oó̀:âoÈdÂk¼ËUüOÓˆh@X?—ú)Ÿ»o=gÔ96-vÓ½ÈñçÂ$„¹(±âE®,›‚Î~ZVCæße‘Ë£ều–x®/é>ú/¿ü¢¢–*ă¨º}µ¥D₫Đ<ƒ̣wØJ‘™¼ưSJDçN`,Ô]Ÿ‰Wl"©'˦”JB[₫'’\ ¡iËk̉ă¸²dÖÇ´́ñÉ6åuÏ®úGËd>לú{€ẹøÈPÍüaƯ’|?¸T̉ˆ¥°`*Æ«±₫̉E[ƯgÚ¼B½®„JïơT½“Øê©Ú"˜Åtô± ªA9Ù@TË¢¸h—̣&Á½M:•5©BhØDcZÆ̀?'(-oÅ‘zK­!bv‡µfÑr¾ )Ưâ¶j”W²ÏAŒ«Jë5°¬¤˜V„‘,^±Û‡Ï1Sf§5?÷Ưo¾{ÿ₫ĂçOŸ^_$"ÔK„œâ´ñ¾Já@L¿¥msÀĐăöˆ=i“©ªÚU¢ “¯¥ûàÓ' Â=ƒeRô1{J}â&ËË1ÈÍÅG#ĂzAwñÔ-g–}•L{‚ÎY°Đ(~—ƯgK¼U)„b"¡]¥ù¶ÿ:'=6´Ë°eØ @>ŒS³} r₫aüTư¯IÀü–ØnÁ4̉øÔéê)‰Ë¢b Áó¬FPÈШÊ,›wÎßÔ%G1&G™•H‚‹a¼y“z:N%Ö5/r h1é åA'#f4·œ-L°¾}*̉#"Ȫ°0µÉqˆ ^ŒƯQ8ƠwŸoJ̃IÆ<ˆæÖ¯·»âdÑ‹üÓg’ç'Öúm´® €Æ^s] }Á RÏ¢¸–³„µ6Ù[Sö4Ws$_û|ﻟ…'–Ơd„Oß®È₫-yÎơ:µê`·÷•û-¶Ç˜?lŸlK[ÛzÛnVlnâA‹”Ö“{;.Å₫Ȭá4¶€5 2°•Ó!´Ö•“—§½)o?ôàøÎµ&z#ÁrÏ6điİœøæA4ÔÈ µ×3[/V X|ºHÎ<a¥a@§¥Æ8Œ1±O‚å†ïÓ8\- µñ†‰ø)ÔpPäÁKô/è/’áÑvµÓê@3¬¯&A¾Hˆ?ỷ˜n¶X ¬„§E ‡Ïd(•Ô¢X]–]Ï{6üätN§gl'ài&Ô4d́ûî–GkK[kŒ·4Ư÷ưz»n·mÛ2̣gH”Z¢Ö9d…N†’o‰Ê×¥è¨=†G?GQ»ä₫ÉÇˆà”œy¦$بâ=Ưά½Q¡/fÜb¨P3s0÷?â?X­(o'ʼ •LG0î.Â~J²¯ú`ÀxŒ:¶äÉÜ—ợ$`C±˜ké´6paơr%*:œ÷²ªÂpæ±Ù́;>Öh°u¤{@z™‘Êük´d˜Đ'ˆ1ԵɌ4ÿ XJ&j­äØs=vSvĂfOÛ=iU¼A˜+GµvéÉ<˜Ç>9aOqhgâ›­µßÿû÷ïß₫üùåå%‹/¥‰C\BMëà &è_+öôQAχĐíéƯM‚₫ĐÀÿÄó‰Qû«Ë˜©3‰$ΪªSD3­RdÓpf4â †œ¸$ ȧú1ßăNU5 (v¦!ª°]<Ue&v–÷H®¸ "¼‚{ÜVgFsî>,«cz |¯lo”? “ă¦f.,­ñè]ú2""(̉¦yIÔûL*Ăi>y¨kJ:ëưd%Ă0Üœœpd–œº& væƯD_|ÓhçÊT̀¨z>i¹ÚÉ¥êœZTơ₫î₫Ăû¯·×Ÿ₫ù¸ôlß̣¢”O¼D> ÿ©z.xfoO¼r²ä¡ÓwO—NôäAÎÚeeÑqˆ°àM•‰†̀øŸ¦hàq ̣ Ơ"æ$ÎÙ¯A öO¯<́ذ/ óæ(‡¡îÏ ˜¦ÈU[ÿ `Çè:úïä( ZÏíúø<Ó0ÊF(Ûăr° £ EµáÁås7¨Ùœ*†­ñ.×́—€w¾wFQJó9[q{A)^KÔ0â²úïûm»Ưn·í¶eEI‹?äưăvØÊ]đÖnb5‹~ag̃fV°£à&蟌lFd ƠuÇ‹¹4ju?ó˜íI»tk—»‹ªnûæÉ¾ûn!₫ƒ’%́¿̉ŒjBÏùưüŒ£½6£ÿ–fJNeÏ8öÀđU§2À_R?"^D<ăb»û¬’Â7øÛ5ø×÷)£‰Áĺ*”fâB^‰D6§tÈÈĂè9¥ G¼œ(èYÁI['DQ| 6å-¹˜¶æS„4kä+Ơ !6Á«́æ“äØªx{Ç<1Öy$ƠuôĂ?üË?ÿË?ưø×¿üơÚ¯Ùá¨^™y2›í_~ùeôq»̃ömßîó¬²d(…–½”hàe³'¶ă¸o )H""rÿđđ *OOOcŒLP0‡€4ô³Ë́ƃå5%Ùâ:ö†Î¥ư€uß•đúM½clĐŒÿơ²¶µkßöM¢ùñ$®Œ'È =‘xÓàm]½Xcd ª(ÿ `cưQ ͦÑÜLàMÀæ-Ä“|Ä38‰ˆdæqO–ơ‹¤2¬ÄM qwVâÙ\TẂÁxE>*i’…ÏMæ4ë£Đ«¤rüơ„q¢÷!v ˆ'üđ₫Ă?ÿË?¿¼V₫buü:Ú¢öË´&$Û™ÓRˆ7E[TŒËç|ä»8˜/Ä)C̃’ÀöLQtỢgJ5müS3‡tB²†ZĐ?°>~ ô¿Çk9;Hî ø¡¤ÿ©ÅªrT<¬Tđsv)Ɖ-æçỦRz%–‹È»Ï®ÏGƠHöŸ¸ó! € đDÎÂÀ­º sX?ÇQØw€Ø ‘ÂØ¼ŸQ,>C¶Jz8º¬XuTÖ‰3¾BÜ꓈+²Î_C¿³29Áz4俤%T÷º®÷÷÷¢̣øøe]½x‚¨ư¾ïÛ¶]oWJÇŒ¡P}ÿS¡ƠŸ|Xε¿cG#h#CZÑ À˜~éÜ7@#®ƒyM['/ˆ.Q˜%ÔN_!/UêÜôŒHf³rêwF±>|°̃É|ÄBU w]Ic¼¼¼üxû‘ơ4¬}sÂ5m|´mL-_ßđ./ʈ꿩/r‰r\úƯYCº´-©#&jP¦½@Îc~[€û7̀†×iƠđ†œ¾6*F’ÿÓ¡¢‹,¿û₫wCÇçÏŸ?ù,’NsØxÜm£́—€€L–MD5­ó´c'³›aå:™ge,èÂFGà>zë͉ƒÑ¦ Í?¢\%Åí ¶cŒø*†€C³Ù@\l‚ơº “ZàơeÊËÇJÂĂŸ/[x”ñLÄv2—Ù`Añ™|nV:•[ÓûuBá|SŒ3đhów'h榱¨/ˆkå’y&ËóA¿e[»g–.[¾X—{¢H¦{?=55<́åN'&ˆøH Â!ÉWS18"ù?\˜Z¸8Œç‚_É‚-Ơ™è+.6„̀„ 3”î(±:ëƯº.ë¶o××+%)c̀Đ”tÁC|ù |YĐ?`z¨ư=₫†äO P°>ïPø»ËƯº®{ßo×ÛơvĐ?¶*JÈ/"]¾¦Zʹó”¢́Ís¥œdkzæ€zXWNÚa?ºvêcü­µïÿư÷ß»]ÿÛÿở{·¸¤‹lôÀmfÅÏ₫= Ăxë´EÉx`P·!x3÷JÚé G‚áXÿ¨¨¶&?B,¶¢ï5Ê X–ED¬¨ƒHÑZÀQ –r§Äç3Ⱦ5ÛzV%‚}YƒèÿI˜Ụ¾`l਀ÜÆx—߉û¢ÿc[ú5Gɱ<¢Œg5`´ËîSi‘9ö“Q."ï?¼_—uÛ¶íº9„̉F*:*E$Jç…ḅf¥“Ï‚€×éăHÉOocºUf×* hg-0qöÄT³›vă8J̀ QºÅémêmºà4µü(Û®Ô3>½ä6Ư¬ ₫Ç¿ưøúúºGu0˜ơHîÁfàÓZT,“Íê“ï?VüÄLÀ²qZbÆÚá¸F¼’=Æèc»m6ÚÖ̉-|QĽ1¼ yHÖ±g²º¿[ĂGxT^bJ}#{#LCÔ¥«WhKûø»¿ûË_ỵ̈üôlL7‘(ÊØ÷¸XL¬ŒHÖ=>¦[MzL<çÛÿ è?¢®ÿ¯÷0 YÀV ªÆ[;ØŒcËêdđ!4lnñg2²¾…):ÂñB ‘Å,[N—££Y\gÚæÔ_\ÁxJ•bäwù†e2ÆÓÓÓ_ÿö·­—®l±NoHƒ=¬æcßwú³é“`¦ư, ëüqºaútç—’³óBåÍÓj~±Đ»‡ÓGÓ04ÿhÄđxừçs\¼O0$Düñ©%“öÖ‘Ù·yºĐƒ¾·•à€™Ï$ñ+ôÂd?PPpÏ’Ÿ.$Ûº@T(\ù~‘̣ GTÖu}xxđEÛÉ„ă"˜Æyf€?u_¢úNÇœäÁï¥× "¦ë Êçu™æ?nđ̃`¿ª÷opEºlû¶mYÙî¸ÿ ³Ñr‡wôd2où„D“TÇă~Ú#˜FÎñơ@ó øOp¿Èäà6a0øOáå´YhiƠö~ïƯŒlÛ¶o{™®Ñ9øÇ½Rt&s3T«·Ÿ’ƺ9é‡ăo"”%wÇÁy¶ƒÊôïhN¦÷Ưw_ưø«WđU÷^>"gÀÆ*ͳO\Nd5q>&CçMKxŒiÉ SaÁ‰́Ä2d:f”„¨…8ûK¸¿lÑ&£;³Ï›µcéè$àà‰l€™úzc¿½ù¨Ö₫̣ñ—_?ÿº,ËÔJ ß-Â_AUúªÇ‰ut;̉ gMp,*fT¯¢œVå¶b-ö}yyYn Û÷@ÿ6<›ç.`q­15*g;ƒÅ•Ñ̀8›¨QLyh²w4Û6̣ mC9¢†¬ưVo}ô±´å›ß|øæ›§Ç§¿.µsĐÈ­Ü Z»TÙ₫ụ̂r¸©7k8€‘à­"€›^£¨i ‹$ô~aQQç}ëvúS±©¤R̃2ï±mÁ(Oü„Æ<cølơöưTÚûx•?«ë’m‰ăÑ’èçø}¥Ç§§çç—¬mR3o“̣¨¦)£d¼µ´¥­­ï½ïK0“O4b/Ø”̣%÷æ¨jnêÍɧIæAz{/̀üåa½v¼ ~*mFö,r6o{ßµ«wà:d†̀$º}  +“6¨Ld³Œ¸Æ€¿HMgÙÈÏÓÏ•+±QF…yi©uÏg¯3 K`2ú/N)ûë…AB̉ưǨxË2:z*7ØG}}ựå±÷Ư/K ₫ñÈ6±d ‚…x9!ÆiÔươÖ~™2v¾Ë (Ú!Ĉ•Íô_­Í^`­æZ„63z"½…´§Ø”eë”?§âèăåå¥~½]·¾AV1“Cªkë9DêœhÄ’ÁUØ´µ¥-º$₫§ÚG9üq~åBÈÖ­NÛG`z—B(­{áªï~û›ï¾ûí/—_>₫|Ûoj% [.́£«óÜ₫«N‹'ox̣ œ†¹ăñ©³\b”oU®·˜Î¼¥ë œ:óÄsđ¨l%́h1Đ9":½• ïm†ÆÔÚ6!x¬"Ñg§Ä˜oŸY¥ăƯiØ¿ôĂ*¼fnIÏ6m0èŸAg¶ĐÈüŸ8¼hc2₫œD9Đ½ƒ#µ†ỗ÷W/cp o Fዾ˜öàTdÈ>ô2ÏZĐ?äD†ÙŸ²gÙ7=FåVÓ V¤ ‡=P —ª«”'¯øL0ăSLă8q¡…§ÈÛ l§±”J§̣ÿÉÉ̀ºá]釺EŒ»HΑöi´„çàÍ*î§AÁ¼z*ö0`̉Băùf†ơG8n‘'·Û Aüùèqΰ~J˜̉OO €P>¬BΣD1¤‹µ¯2PöŸ,yĂ0)Øđ&4Ÿ!ûTƯ5Ehs1Úæ#’+”¢Ë/.tÏ&Ä›bD\ĐÇM<–¶øö²mÛ̃½Cmâ~*󟀨ú¥apóˆ₫¡Eg9 ¦oZ‘½¢ ‹"µ—ªûçiYG5ú̀ÊHơÖ½±$*»ÍmÛÔA'a¿`x9C‡ư;ÆØû¾_wdPdÊȈU³–3́Ù€Àp}Ï¥-ú&ïe)O¨Ä|­µĂϺ÷]EÍt•áiÁv‰¶.—»ËƯư6·„T½̣ºS}2ddẾüàŸg̃Ô—< 3T+âÛîbøÎç7ÿđn‘?Í_LcO§KQéa[ôî±$is$˜ZÂư!]E×e½\.¢̣éó'‰p X)‡¢ ́è–'k¢m†ë¤›çpÆóe’?ÁP¾¾Èâo5ÊcPQƠûûûeYtèÖ·¾E&kزNÑ1eXo“¡ÿl,„p[§0gA:À¬D-&鸵Lv¯̀7¶+ôTGH́<Ȱ©0““•Å0úÄQ3GûÜ"₫üÇ?·µ½¾¾ƯĂßwÙ¹r(_y2á˜êĐhÍQ¬GRG3̀ V˜Ư!chÆG°>ê¿§ Ô k `$B#¹ .Ă@–9ë„iEưCx½£y¼…ÀEl"›“3ÑŸyÀ̀,6^´03®§&ăuµ2í‡Ø˜S³›Ñ”ö·ß~{»ƯŸŸÇFÉgŒmâ¾Jö-Ä{b11?ƠÓ¢‚ïÓEHˆé7ùàXæ6ÛEtÙµˆº¨ç4È•̉Z&¼›w‡ëHÙ E`báJë=-—Åùf‰”ͼÍÂö§̀?¤Aarª¥é¥TÄ\  gLéàºøq§Bî¬Tb- ­ơ Ó̉“búĂ$DSb¸}g í(âäÓ\Ă÷ѽÄ$ Q4’/&Á!Àè0~8Ä¢ ŒVS¶5´DƯ/–µyÛnb™qî[àá¦(“/¡ó̀¢Ø¿×ûg|/DíĂ2̃ÇK s‚]­q·æ!]R™°ưwj2g<·ưœëUëP{UÏ©%î›”̃OË™y%âP&e…sm~Ö Cr —€`}z%Á1៌̣·…@)üø,Iüt.èѾ"Í$9Ơ²úîûÎ(?[XD^Ljp5¯4H̉h6Rðgƒ’F<Ö¿e°ßZ̀?¬2<̃Úy,`äă÷Ôûh&₫:6"Ç´#¤ÑŸŸï._¾|ùb!t†kwƯ- ÀîÇRKkÀú¶ó°§<',Ruư¼ŸµƠDơU7 öÿ„f¯äeǶbIÁÙgs_F-‹5jîQje—=cQbBîîîîïî¥É¶m/¯/Û¾iDaw¹₫EZÛd¢|ư1bx¦kÂâ)':=Éú´&üEf‰Ø˜f[Ú[mm÷w÷""W¹nדñ­ËÀUkx3¯e¼ /ZƠm(Ä X UQËf9Ṛ\àç•S."4—o†,µØÄP«/½]oa´ñôô$"½Gñ]³—à´9¯.#l™ă¢oczåÍBƒ h¥{ÄÚäµ₫^ ϨËơÚ( #,—)êï\™dNç´Äq}…œ0›R­ä6$́3OÔ?ºaăÓo¼<₫‘ăú₫zyy)ß úcfIcNû7¬r¼;fI­G’HÇ '˜.fcØÏ1·"d5q̀OŒ¹^]¶Uü•– ¥ÇïzZMŒïT7SkƒVwÁ×Ö6bÛJ˜‘Ñ 8ï€]D̀,{aŒÑ÷nÚlâMJQĂ^4Ñ?æÖƯ8—đé‘Ơâv”\dà₫m¨ë²®—U_\;Í¥~8‹wxĐcY¶Ha đǨᗙ́çy„A±ËaO%ठO4ƒ@üglºëObăàUª>Ü?<<<ô½úôi₫¸Û-‡ñFÖ_‘ÿ$|  ”HÇqw_©QSë«:â§x#0ÖŸuË¿uđÍĂĂ¼7oÖY²s„“!ªư¢ÆÇâdSIÆ^èS<ÛWđy«ñÇMÊS Zđx«ÖêË ¦ùa/ÍÎ.’É$/† Ç [;ÑçË‹7µf† üÉY%©;¥‰Y»¦z‰FÔ­µcuXïËuê²íÛO?ưôôøøôøôr}û°éÎÎ Á88ˆRfĐئ8‚ơ+|È ˜×ïLí&»Ăv;¦l¶OFy:ÄJ‚b9ầÿuc1ÚH)´ÔjiK[tƠ‡‡‡ëíjI«àr€/9!xÄ$MT¨/ˆÿàz“³SáéNyDS C©Ÿër8ÎÁ+uÓá#2X#Iÿ°x'@Ê^‡;Êsǃ³ZRˆgĂ Á*ùë̀#»g”u?(ÁÓOˆŸ)Óë<ç>Ï+ḮƯQ“&‹8fnÜ1{êÚͬnûV±ÙÈ.*¿H[ ¼B\æ ¨|I™{+"Áß+5 × è)₫ 0J1Î0 £?“[û”Vxk¡*ñ<¢˜¿†7€ZÙ5à&p‘£6‚_₫äÄĐ#‚||¨c₫ع€!ËWpL ½‰mzK…æ¼·ß^¨¦₫[Ĺï80‚ZˆƠ<„t¼¾t°Mf9NhÆư§íĂxü³¨¼%'c̃¹eÇ|M! ½œpU°W]̀€wăV,Àq}áyÙ >‰?ºF^J ÀÀOL­r®¸YûHơîŸ]]…Xº́c_Æ"Z1Æṛ>*â÷Ñ3g¸åààø* ̀íÏ™PçqÆøÆ‹~¨ixf¼¡3êa0M Sü¢÷¿ùö7Û¶}₫ü3 †ÂW’j³¦®8'ƯK₫k?Ô»°8XzÂzW-Iüg«Ú̃ËÆÓÊ÷}¥>»¼­=ê–)ª8̀đ3Z èG%÷¢À»Ü<ơÇŃrT°}ơpă[clƯ£àĐƠK¢ j[»´J×q~̉ƒA- 8ôŸ“}½r€ƯÈ~Äj£`NATh¿̣bm0‡’Æă•EdÈívûÓŸÿhḾ̉ él%>dD.A8÷ư"ª¨ñÇÊwVÙ0ˆk̀3C¹»á„"©*–f9>ÆW†ÎÀỊ̈!혛‚́YÎ, =ñÂíVÀDÇбè²÷ƯCÖ́³:^__Uơ2.ÛmÓđÙơí(D·ˆ×äsb„K„´ee:)\/×KOè>Éf› §iÙK°M6ÔÄvQå&u‡Êñụ́ºè²,˶mX![Xó‘Ql3É£˜|‹ơï£[Á/ƯuÛ7n#ॅ-+N£$+®À˜L%häÚæ…° Iê.Ư4·ÓëÉI‹Nă[‹3Ä¿~¹»¼{÷nÛ·/_¾ä7ñ€œ!°ÀsƯ‰–Na®&"Úr—OV}‘º†lBËóñà‹̃Gomï̀èO¬¼ú±¤¢–! "ûÓï·ÏK8́uÿMc)u)k7ç¦@¸—,3G<„Û—¢1&ÏÎø8*đ\èxæ)=÷ ₫Î0hŒ½ïŸ>}JÆ—¿ŒÁÇYC’Ë«̀Æ´ HŸ ’ {ÛÙ}§¨̃{”7̣y–ße%¬1`-î,(7»R>œ,FM V` Yv/ÜôZîn’y$#s„ +§‘€èá08ÇHÎƠo¹§Å‹Uˆă™óSÆ¢Èí} +˜̃ÔÏÈáÉ‚Z…9ubôŸŸŸ÷m¿Ưnáä8dĐŸS5úéúI™LŸá1øTŒ ç+WÀ ×Èûü$ÇL}Wú0°z‡Èå G”¶÷E [hŒ´ÊwÂÊ™A$–&·¹ÎŸQ”‡·è²caJ¬™Y˜qÿ(¢ª¨Æ˜ øu´Ö G6Â&Ơ>]%TI©¤VOÁñD%@çplLÚNa͈½Ÿ§ä ƯÑY ỗ­Á(|&l úBôèf=¥h öf¤tµ¦¢à₫'ÁKTíg! ëËç§èJn[ ,?çDé1¿Q}Ú·sͧđAüŒÍlK壪˲ØÎ€è´COi*0)€Œ/½÷}Û-è}Pʯ ˜Ê7j–U÷;T|Ôé»°û…śđ•}¦+úgÎT äƠQẓARuKS]´-~½>¬lS:ëf[PŒpÊ[å>£â,¢Úÿl£Ư?²g°­—vÍD₫†5Vu‰̉SQåøß½{·̃­Ûu³̣LaΤø»wï~øá‡ç§ç÷ŸŸŸ'p9ó…gCJÛÄ’zX<Ú`ÙNsĂGÍá²+pk•çñ'›>Ô*â4B—h•ÙÓͶơ4æ™c›Ñutà@¡ÖË̉–˜¹(_|2:Ï’c ]`Eéüúæ ñC|×l­Aß¡øÏû÷ïøưww—?ưùOm§t”13aL¦ €í45L6¦E₫Ăü}ë₫ËŸ___!´§ă?´!ƯdZÈvw­µËạ̊í7ß\îîîÖ‹u9ˆÏ w.ëBçâdÑM{‡¥…µ Àäâ…}ß²À‰®çC¡½¤ ",m>§íRY] ®Ÿ¶}%í̉<«ñÍàƯ/,RDRÁô-0«n™yç¢ b́ô‹“³ÄøhQLÀEê{ü[ñTq Í·̀;]uY–k¿Îú„´îö¯Ÿ©i0±#eå¬N†åY «|-°'ÎÔI3̀ˆvéÑÎa ‡¬µ\Ur÷½9 ¿‰‡“3(™Tá‰$5[œÅË&rÇËÿŸ>F´)às–Ê=±D½¹M@ÿÑEß½{·.ë¾ï–;›2F[>§tøÈ%œëGHiĐ¥ñ èí3ëºÚ¹¼ï»ơíÂy¼ĐØÊiÆƠ°̃°™¹¸ÿĂø§»ËúÇ?ưiû²• ly€Ôˆ™Éă à£Û«~½^́ƒĐú¼•Ç;û±Ü]e£Rä« fS û¡‡Å†yA°V@*Kø[#œ6Âô÷ñuĐÀµù# ¹.*gè_jw0IÏÀƯƯƯƯåNT,Më͈$&_È0ö¬ßmG¹Ï”g”Ცÿ0óâ83Œ¤V³I©‘ûKM¾2̉́°Ñ¥Q@WN7qÿƒ$£-Íû°̃2¬÷[½̉,EpÖ„M+uïpÚđ̉­3ĂÎ è| ”A¥Vbáv46jưÄo÷Ûo¿ưöñËăß₫ưo×ëIR©ƯÚƯƯå·¿ưíưƯư§OŸŸŸ¿¢Đ}×é|Î"E9ë‰Ư®¥Ẃ®1“–H­ˆH!æ­œmµÍ `ú².}®hä€1Ú ìô°›̃ßß_o×üƯ·oyá¾ÿ’ơ96´+”ƒSÔ'¥CṂ,*IJ¬§ù?}Œ¨_Tl²ÿ‹făÛ$ §¬Å1È/~È Óº́v\1` ™9’75Ö<ï³2Ïü!@DØ?ĐZ[V/́6Ưԩƹ„µ¤…[“`èÓ{@ßjK[×µ>^3”»,‚TÇpº¾§bp¹¿ûưïÿîƯĂ?ưôøøø¦|47Û Ă$È«s¾JĂ/ö½g½uË\Í3‚&oe{2r¤œ€₫“tô¼£U±̀ä`‚̀éœBü·æóø ÍW@tÚŸt†a ´ @bú x@).HÄ[¼‰q»o'Öö%‚[²Ñ¯EIIÄÉÛ:"yV_'Ñ9;H₫íÖ&¸ßª`1«66´Ó,ÿ‡º‘`ùYk€mßVv6®Đ¥-¨-YL#̃Ij™Rö1ƯCT´ơđ—±×€1©§$]´8+…àPfkí‡₫đ?üÿĂÇ_~ùüåóvÛ€¤¥‚×1Ʋ´û‡ûơ²jÔÇŨà;’ç &ÇtøTPæ¡nÙ˜3ÙT¼H¨Z5¦ÓöƒÑØ^kh$±[OT–eyÿ₫ưËóËơzÅitdy‹sƒnêrw±îί/¯>l Văj¾¡̉ƒVªÛÍŒ,,f»xä˜Ơa ÂÖ‡©“v™ª '‰}ñ×_?1n·«m¶Í/m×i'Ïcħ™uêÍ́̀!\ËR„™±+?=>Ưßß—±J©¦‚¥ư\Œ>>₫̣ñ{ùß—eyy~1 ÍÉut”3íÂz̀ăé¹)ׯ=’Đ5."…w]ÙÓœV­¬»A2ÜÁh¯¨”Xnđ¨½ñV¶dƒ¢¦ Jé=ãÇ£Z© ó[tN^J‘r‚È Íå<\”`²ă?‹Y‘xœªøăồ'iÓ/ư7!Œ •̣$jmŸAMâ{Í!SƒûØ…M\*mtç̉" !wZ.ÁkD Û0Ü Èîu¢.ơGÈîÔT"₫áqA¹£Ø9Â# ?ư’6Ă[û%gPƠ»»»÷ïßßn·É˜8{:^VÇ&“ö;÷óƯ8ÓÙÛ— Îňá/_¾È×ä³âcÀQd₫0í˲\.—ëơ:‘dø L©A₫C|]U¥ÉØ<%`–»3µ0-èñÉñ±ïûơz-́É .1£º’¶â,W:+FGù-Écshr$AØïû«Æ ă~px ɹæ˜]8f )J"ϦÀjÜæ,ZLú³́1M!4¨CªœÔH™,|.£.ÑẁxVJ€­å÷'áçªD‡%˜_éăz»^³Đ"åºLèÂÆ¶Dº´̀Óçèó”Ü9áYh>s¨£ŒŸ§ưôMë“}­ªÙĐ-s¢í›ÍÑ€9ƯPGæÈ²{G·Û­ï^/«ßD*0ÜơJÉr8_Ü0hô6Ñ8"Eµ̣àƠ¬Æmlû¶›¥4Â}-Lÿ÷’¹nĐº¬cŒÛívë7Ü>÷´[.ºˆỂ–l\@5O9jƒtz*Kđ647§œî ÷Ó¤}́CFÓ¶B¬ñdâăaâ{mŸî3Í­EP,:ó²ËÏÈ|€ÜQ%”ài¿|öfïưz½ºYF¼µf˃Êk8ùúÉ錽X•àĂlr%«̉7J̣™‘ă¿ƠƯR4–ùĂûmiŸ?ßn7/M?—Q鼿/Æ0L!>>>₫¯ÿëÿzww÷øø¡ôƒê4¨&îT‚n´,RΧIQ#2O¨IL÷ö2Ÿđ»Ho0#ÇS&Đ9¤Å~`C:%ÀøÖÊw9æR½O…¢Ö=×êÓk₫·$ G°p&ĐóơXj“ÅÉÿôgXÿà ¦Áˆà00q Úæ‰Â”|`³›́X–m6ü̉± ¨…•JU¼à`}6ˆ  í:OhF2„ ª] &ÜṂ¼C-&1T‡R”·¸A¹[JXÙ?Û´].—©ÛŸÍư©ưÀ¬WtÎüK'£$‚ÖRúbÀ₫–#{)ơ='~t,?Ø¡™ ¿v™¿€Xy„úÄ<[ «‡‡‡Ûí6ÿP¤\ơLzc Û̉ŸúÖỸ$é•RbØÓ…éåYæäçŸB‘2ŒIöV>b­‹¨9‚ä²ëC¼$¼¥̀ÙbO%,J0ñđ9?±ؕڔ?̀ïĐ)AƠQ&₫çJûg{E…o­8 úL§0ĂE¤l¡àăÖS«°2‡Ûgºäx‡Úágö`°¥„Qc!4ï7ÀDÿ#¹Dÿá-_'2»ïä́#>”™\lƠ”™J*9Ö}}yƯo»W%ơ™ơ—¢2‘ß³>_ è̃Ä6¤x;i‡Be{„j¹˜î}ß¶­E%9ä# ßZÖå7ß₫æ₫₫~Û¶Ç/ÛmĂrđ8±ưÑÛË»i¬Â››Á éÚ² ,¡­Đ`¤Å¢C6gÿ®eå$ÜŸ  ‚›ṇ̃fEơn]®́f`Ú).CÀ̉MbÔFëÍ¿“‚2ÚhFx³ ³"”7¡(F®\è‹öóÓÓÓÇß=¼ó€2 œ'*—ơ²,‹Xñ́È )$.1%r|Đ±ÄØ×ÀÛAâZùÔûûûûû{Qyụ̈ˆ›ÑuA(‡C‡zkTWDQ'‡zÿôë'mºm[b¬FäM6_C?g-VuAÁ…Äî‰%³'½Eto*}uózi œZ“ù„p¿&Nö'ܾ—iH5ÏIo]†ØœKt₫2ÁÖõ·X2…±olƠJ¢…í­́sDº¬èÖá+ëê,ăr52&‚énT@²<;\$Œ~#7÷:à5kO†ùJƠø…q!¦-ñ¤Ư£q™=n¤̉S&@iíøÁ ZÂP₫<@a³y&‹tƯ²m"4"tU²ø̀‘3³6¸̃®ÖÑ™æơ²><<Œ>œOÂÅ%µ+BQÏÉi%v ÎÉdÀH!dăĂJvUS)N5^b|ÅyX½Œḷ‰#ßt]km]×uY w€Ṇ̃°ÉG‘nú₫ưûeY,†“Ç™j<*)Á ĐˆÜ#!÷È™÷j„s:b¿=Uh„%LSÇ­o¦9LÊ¢>^`\²ï»§ÿ†¶±ù$đr²ü##Î瑸¶cÓÓrª´§´™ÁÓ@û±„*’Ú Xi¼ÎƠưqM»£f0·¨ Ä.ăäb“˜0(ă;IĂÑà$ơÆ@µñû¹͈́!(V”|e X«OˆO·I&§IÇ̀HđĐ0;5Å*Ñ~Äÿس‰ƠHt{i{,¿CÅa¬_ѵ¹÷STT0=Ê7âY¤`ư¹çẂ,«€êŸ-L¡̉̃û=×%øß"}?¡Hôo©h°`ÅíÙˆ₫ïIq©è̉–»ËƯ²,×ë•ù>´(ñ e#₫- :!y›4#¢'“́t§Or2 ô/Z¶mÙ–†óU‡\#B¨Yûå©6¢¹ÑöÆ­®ëº®«îÛ¾÷AcŒ\É–ÅÈ`Å=î ƒÏ|‘rđçbûa[̣₫yyyc<^·}sªỈ4_Öå›ßỗ/—ËƯƯª₫üóÏ\EtCMμ]€›Gn B™‹Ü…&‹̣5¢ơ†SÔ»ÿ€D©Ê¬t)å‚c ³k¦Æ™9̃ÔÙŸ_{°£¿¾È$T ‡d8t’˜/˜Zdå°½w~æ‘>fĂæsDœ˜×÷Œ¬¤ÏÛƯƠzºuiÀlÛ>ñ¬j§Å@¹ú™æ‡AŸ¯k=ˆ“ºzM_ôß bÏtM-ÜÎ<}yđ A(›Ơ¢Àªá-¿eTÚ9}đék„7ü3PLh †GX€û"̉{·Zl ̀UA™ùq“I9ír¢— +Ÿ]¼@…>?¨¾wûÖvÛúÓ”{£ªëzùî7ß™s²_;ÏF¹N½>ÎWỌ̈ ¿ÜËß­ˆĐxq*¯\¾[ù₫qœ"êB+C¶}“ÉưUƯ)¾e¾ks xkyD|Æ6“f®q¤ÇïB·œ^9E†"Ï̀ßÊØñ@50Ê’̃aîˆêj¬ÔÅ?+ùÇïåç'êµD>|ü­r]a0Hl:¡p₫á¼s‰¦]l&È„tmn/¨—­”£•_!Ù8×WGS¹̃5 ¥fx)gÊB€–*_­äxZå‡C–păGiœ&y.ÖÉÁ¼>™ÉüÉz*4rykỵ̈́z€4­¹Ù÷JDFDºGTOº`JÅ¿¤÷ÏϨ#?LO‘ˆúV‹‚g ´u¢ÔüéÂæi'0>I„úđ„̉̃ûơơåà‘7/¿¹¬ëêá₫1fX9y/‡•ßÅaQ 8ḈëŸq4€^|h9S«—ăèÙ©jï9°<>›]ÖËúîƯ;yụ́d.&÷-FFÇ'P Ñ”!23  ùIv@‘åu(¯ñv»mÛVöFüÛ´Ư]î~øĂÛmk­ƯƯƯ­ëúùóg7&“ë-”LtK±e×½ơi„å¼¾¾Zs/9ß|₫Q90ÔØëRyI³6(î”ƠÅ Be}4äR·9 _Ñ́~9QB„À„Ó$èœ+\đôÙOŸ…„¨Ỵ̈»og\©¹¨P¸¹Ô½ï¶%m=Đj ´-ÛœûØØ¦ /xrüö[³xi«¥~2²iŧ]Đ4yO ÍR÷Iùs¾/hrÑ<§Ü¿N ̀¡œïMjuơDÊЦ‚³#ü•̀›H&R~狌₫ôôôụ́êͶ Ö#£wi˲,ë²÷Ï2ŒÏ—XænpèD’ƒA°9UUIï  ›nbµ ¯ˆdSü ¡F_zÆ-ˆhÓwïß­Ëúụ́jÙKÅRÜWÏJ´z8´èD÷†®ºp«%è‘T…9B,vƯ'ÓY>é©ơ²₫áØ÷ƯâSïîî.w}R´&M^.˜kÀfÙ˜µ “]("ÏOÏ///½w;±Ä ½Q¢dq+«GŒàÈ<º>„ĂˆÚV%cº”â”R,F¹Á̃dh«Öƒ¾#Á…@O\~Jd ₫ôcH%₫Ă€H¸+‰²l (&ÛcMûèÖxx¨§¦ŒFÛ£ ˱̀ÔÜ{§gŸæ!§®®2h€4›Çÿ0₫¤¥ A”Y˜ÍªÔf êQ@áOÓ¡»î9Z̀›ơ6—i™c&:ŒN©ü‘ô–°Ê*¿¯{‘±´‰ˆÔ™üJ0BÊ]c¶X³1¨@6 y"̣Ø)́Ï·Ơ¹^¯¨.Âv1ßă¬c<ỡŸ²ˆ6ƯÈiä \—UŒk Ú™TqjiÚVé[NAŸOíáQm“$` *¨b£gö†$؉®„[Â00І…Ă–Á̀XH•Ơº˜̣âÊF®"‘âÜ›”<À¡PÀ4“ô¨ ̀=µơ¥j¯đĂÍ¿°Ù±gñ˘ x¤Hö¢È7 =L}ÅÊỞ̉<'ä Û¹ú“đ“iư~½^úñGÙn·”¤—|·öbÀĂâÅ8s$ k0·=ɳªªq̃¼øÄđ…¤!ESÊ‚‘̉:9¦*`Qgû*uµ̀ÆØ̀¡Äùúúú:ÆØ÷=¯ÖóWá@°m›ë5„ ï£A•›‚ăL ̃\Ië²®ëj*ê¹=] !Mqåd¾dN "éΠÍ̉¾ï @¥€¿2‡û9 Íë÷OgÊíáW®d­1Ô@0âÊ; ´ gÇ땇2üŸaó$ÀZ›9‚̣ „Ê4N¾©Ă-È‘µœºÓá ?¨â h—ÜÑÄ ÁH(ç¶Jú:`•-ñLöÏ|G°vè3^ …5ó(·WûpäåºT­^¥~%µkM˜¦…Ë*N¿“̃¡j³0œ̃¾~Ü×¢)œ¶@‘|̉„ÚtiËÄUë/"‹.Úô²^̃=¼3ÄƯ·nGX–ûÄ„ƒä˜É¨g“…AsÅëœç­1:í̃sm²¹,£ÿÂC…CEª*.ó¯âUÅaœ¨ªªUø¹¬—Ëår·̃-뢢‘\àJwâ¦'|øB¤µ2à%ó\Âö-D<…Ư×zY.&=»îÚƠºøzÅîdRU6Đ@戦۴zÓ% ´ê`Zo*ºË̃Z3˜Œâ¼©Jt<µ æ#³0ij†,r|å:dÜn·_~ùÅê-´ÖŸíü˜ơéÔ`à́ü#‡Ó«Œ*˜È´ `Ï Å·ˆ0̀E†¥OuL;*Øä5ä‘=q"$µ#Ûß}†~âä,œ(ă1†zuH³<í|j&;u¬êx:a``¶%MHO·à+æ]×JtböX Øg#b–r‹ªè).$RS̃ˆ&WcT1)>ylnáơÛZ¥ˆ ƒ›øE==SçÙ>[÷Fđxfu¸¹E„\gYûß‚¯–ø c˜7â(̃¶›)¯™Hr–{“躣YnüÉî8[ŸyÛ}r6qê[L:0#µÏø…I•:1óvG˲́û₫ôüt}½N;çq¦KM˜ 13*̣Æ·ScëÍ^‘6_°œß´/̃*¸Dj’®£₫Æé῭Zè3w"µMÿ® tĐVÄÎÔ›*ó óWø0̣Ó7P«”8b¬„ÉƠ.´]ö}·&’ÇN»’‘„…rg6 0á³QU¶pxñ )€)j V›†1 \~—Ă€C¨,»f̣h}}ÇM¯ÏÇôdáhŹfqe ùÙW’,Đƒr ?KÈ¡ǽü Ï#!3…—¶hÓµ­k[ozKv¥®ñ'liÖ/5œo GsK#½!})ñ08ñQè,bĂn(̀Oơløiª>ïcù¾w—»»»»¥-¢̉·nª)<˜£˜X­¨i(ŒB2̀Î[Đ̣Q‘æ†E™Êº®«IŒ¡soif±«:kd›¤”øáuưqP}ụ̀åoÿ₫·û»û—×Dùăn­ïcÑUù‡ŒÖ›÷O–v)‰ÿyGa%Ê9zJ-Ó&?ê‹}ßm"ú̃uW|₫È©”I“v-ª2qzư‰Œ`5öx_duÊ9[î1 =rw¹ÿ7ÜOpï*»×©<†1(–fz1寶0'¬7%lư e2ásÑâïCưIYêdbÍJ¥øŒE¥#]’ éHñ. …ÿ[́êL›eyB¶Œ̃oG0ïî#AØG·&JhƯ˜»µ"Q©Z7|ó2Ơdž„*"đJ,çTµäß̀²…+Äç? 5}Ǻ"CÿÙoơCƯäÚl ѦŸO‰̀€DZebk)­3Đ½Er!*qTL,[|AYËùøă¦̉"¢í–Ă˜‹È÷–Xâ/zưFäÕ&I›cŒÇÇÇ—ç.Â0rc*hj…-­á¯iDÖoßûơ媪|@x„pˆ:+Œ j¥7QB”V’£X L̀¾¡hcŒ1¼Ñ/ơCH¡ ±´½†· Ù¦qÆæ.w½´år¹ÜßßßßƯ¯Ëº›o›# >Ü9—‰Oy¢2GdÚ`- AC̉G¡åßÔÈQ])+#£$—yÖeíÚ›6”ăØe7X”ßĐvUÁîªê///û¾_.—í¶ơƯ{ư:ŸG‡iÆ6²3®¹H\=¥=8€´?sƠ8«f®t(WŸ"/g‡âÄ”̀wƯ+å–1˜¶´÷ïßoÛf%‹Ơ^Ñ6*̉-bzYÂ%âî›îƯ©,ˆÅå¬'Ă ¥Ă >Ú Éà“́4.f”¼}̀̀YUµ>ÛÓ¤±È²cĂ´Ö̃¿{ß÷~Ûn<óب(gdXÊ !&P¡¬©Ú¢fsß#Ê₫”ቷa‡A‰ùôbAtna)Íù\ŸÛO:i7JV"́®„†ñæËỊ̈œ¤rÿ₫I2Xï‰"±okë£oÛ&]–¶˜I`‚ä́‚,s^ûÀä)£ơå_7Z›*^¡û0u<Ăy/=k­đí:ù¬‹-.àŒ¹Jư±â¥"$(ù`+¼'W$#º9™3FÛ¾¡È=ƒ~¶Ä‚]nÛM"`Ăöˆ¾á¹åSL‘IƠôƯûwß|øæv»ưüóϘ.̃)‰K†ÚŸƯ±?SÜÁwÂRXi 3êå̀Ë₫C”¯aÛ£ £Dü»åĂƠhÇ8s¡  #ôŸmB₫0hl–đ¢΅̀t#°^&#*¦G ¶ÿ\µ<Ơ‰‡åƠ~zÖ²ú籕Ú-„¼!Ü&?M :Çúº®p¨B₫Q̣ß«›DS—çUE 8PP>©è¿”a=(ƒIxÉ2¶)̣jHû¾Ưç‡̉÷OÎ+Næ¬í¼BFM›ÿ÷÷÷wwwÁrÛ¶}ó¢dq¦¼aAO˜k’gçàBü&b+ơV®ˆ3ËucbæÖ»ơ®÷¾u·¶ÍJsLÖ)°cæè•„:Ttë[¿v»gƒfƠ-€IDAT^›\"äºgD²Œh`£í •ËPß0â¯ç˜Ç*eù à.„<)Gœ …?D°̀_gî¿F¿ˆÈoûÛ}ß?₫üåË—I7M“"lă_Úâf€H‘ơ!¢.¦öyû.(Q¶'ă'E_¹ĂŸx¾¬ËĂĂĂº®¯/¯·ëÍ…c@0ÖO³®ë÷ß}½~₫̣ùơå\ă¨í–T…‹*¿Ås8éÜxé¡â:e¬¿*¢÷À={J ™¸|ă£₫äé:¹Â[£”́F̃p8`’±^_™‚L4°q2˜BÖTÁ+Ok:oƯ¯ÀyxBzuú‰! °“]Zú@,ṛÓR‰d©ÈƠöµ‘̉?ˆexBB EdY–û‡ûe]D‰s|XœĐíd$l•‘Í’‚Œ|+ÔïnZȹEeJ ₫Y¶Ü©Û¹¾ƠÀ+ƒ?˜¥™"*}4‹Ạ̇‹đ ³ Ä’ùJØ̃):}2)Œ E0¹•S´Tó§R¹ÿºç›ªă ·Ú?ø˜°>#ơd€̃Ø3¾ùfô~»Ư>₫ü•ŸP¸5¿nŒ́ˆ₫—:Ô2&Ëé‹oÙA A&Ơ–É£úôy™ø è¸d_D꣪—»ËƯåβ0Í)1MÂñ9¦±µöÍ·ß¼^^_^^^åµ,6WơcÑÂ+ou0˜Y!œVáÑ#ÍQ+<…|v°¸a0\8eˆ7ÖRèkRw\îø̀Ló×Ï̀|ê\ûqL¨ªyó́0°-¶´ÅnÙæs‹j΃Ù,!Çàô±®ë÷¿û¾₫·ëßú-"ÅØûΤÎt~»2Vw₫˜Ư…F§mië²Z| ẦP§ÑU«?Ö€†“Àœ¢ÿS†©Sˆđ.êâHJư#sYi¶ăû– ‰©›>Ü{ỵ̈å˶oû¶_¯×·€Î)ÅökºëiB&”w‡§Ơû—ï¡h>₫;¡¯¾èË\½aÏXYmU=#rÊ‹«öp›̀¤ú;-œ@ƒ¤}dœ‰1»‰€C̣u$$ú¶ -ĂíỂ;¹8f/tsÑÉÍæÏ ̃æ°h‡=¢¯ºz:¯8’Đ¡½uPN6Ô󷇛1ÿ¤©õyÊQtE%ˆÿ!Q†¢ !/³£͹ăă“W‹„÷D‚g ³Ï1RÇ º2á?œX*cŒ×—Tä€üaBđÓ|Đjú;£/5(ëătssäo^‹Ö`̉'·oY‘Σ<ƯÅÄj»f·Œ™e‡Ă5™ªI?2Ơ7ÆvÛܘ Ùµ>p]¼ñ`|+…¤pÓ²çĐ™½đa„Øoâ☮́t¸Wjè>v3 ¼#˜–ºC¼å”B€d̉¹ä•óGê5‡2R¿ ®h‘7Ï(G“'[Ä•qĐ!c´8ª«¯sÔ¢Rc"°®ëo~óùù§ŸÁL{éa+E{ÖQQ3°,Byÿîư‡öÛ₫ùÓç̃»›^Ô68ă₫{ JåC•1G„ sVé( —QÊ€¨´Ç]r±Â¼AxéƯ%ÂAđè†!³:½]o¹§!ï—ÛíféÑÙÿ¥̃'trZ3P\>ON₫y4ll̀­œdxë͉—‘¸¿̃TYˆQlà™ßáD ¬8¤B#ˆ€ắ:Ă112¶‡áW¿Îƒâ@v‘œL½.ơ|äFˆ2äöuC?¢y}‹ệ{ªĐÇ̀ăI÷̣±ÈxȽ÷₫øôø̣ú‚ñ0,ĂÎ/f#Ơ`¬“.­Á?e¿÷Q_äæJl9d3˜Aÿå+Ó“ö0-ü ª© xù`³|–µ>P¿¾mVȬá}`áJ̓5ằÆvœR§¥¬ªưŸ¢R^ç‡#F0‰SÍ8́MlÛ‘?W€pØ\­ëj!Á¼ñưk[tñđZ·c[Mgœ„¯;Ûf-K^[€B áÄCZ`usa^§®È æ¢ÉÓ9’·vz.“ycw}Y/ô»Ư,×Á)?]a:¹̉ó@{-u£TÙ ÈÀ‰‚ÑȘk˜B?`'ÊX/ëŲx›¶­oÚ´íÍ|M[oƯ½ĂëL͉=™*ÉŒÉö"öK^WѨGH¤%X± đÙ1oiÁ`Â4dđ¿"ƠÇæ¡|X‚L̃©{Aç•nO*e$)˜àCzïùË_Ú̉¶Û6(´4m;å! ˺ܢL8ˆ(„?á¨đ•­yVưϰ)Û“N…2"—~ZD›©êívûôùÓ̉đü•{Z¨}Mîv»ưÛ¿ư›¨l7/,äK)–·Évn8¸äăág:Q)(ÉE^2Ú\@ä0ư¶ñ¼+°úïZĐĂ•«¾x‹°g]<©’Ù-0ß=»»„#4-†ux™ƠhØû~½7 ¹ă±ư¤>ØHíµ?÷mÿô铪» GÜ»;E£/@ÍïÄÊq¤^Öåîîî6nyĂ©¯!„₫G¢! ³È¤ƯV¡Ú¸)^¦Á•«À©Ăʉ÷E|”² *‚‚,CrǜR1¸XơtTàáđ±—“¦9'g¿"O\Ël$h"ƒb¯NVÁXÏ 'OeZ³ẩĐ{¬'+e~%Œ2T «ĂcTúÛ—˜‰!múáư‡uY÷m÷R' 1á#hÑdÅ¿ø †åÉe[L¶í[CHv´Çl'=¢〓T(!‡ØÄ& ‘¾8âKe¬1?©̀yœ€MÚơ°mlNĐ)IÔS­ ‚©{gz+̣&ó‰PB-áË́Ç|.!v©HơH½̀Ζ0Ÿ§¼"¦pq0z̃‚W$̉¬)nÄæ•₫³ÿWø¤b_”ƯÊÉ{gI‚Ÿûwô€n €>*ö`7!(·̀i„ YJ@óÂùú/Z"Ü0·9E4ËæZ"ï»…¸#îŸYÅs₫ưư®µ-Ëâa?÷wFÖÜn7d¡hcñ ¦iĐiW¦9]·7ä9ÅÔđjxFnƒ{•|‡˜₫jëƯåÎ8¶¦­ímë›ví¢2kÄEH̀Ex+›é^‹:o &̉èsëÿ…4vSA«Wq¾7„«˜Xk ù%$M|Û3B%¢+q­æO¬_ơ¦›ƒhÜí  ¦Ÿ²ƒï¨Ë9>#¶ çaơ–ȦuDÊ,_Ä›ƒ¯RN ™?wºAû6~kïûØÆ&›{÷¨ÜdïÛẢååùÅ9-*Jp'¨`e½> ‚ø§hûQ‹ñA³Lø8F¢«›W!°ùôb”c˜û¥”̉~ö˜Åe²Ư©#^%Ï’q>É—!>Íóñ‹Ÿ§[9_S¼̀È-¨r÷º,ẹ̈Ă~‘¿ưûß>?~•̀Éé…öḲ˜œ¾û$8WrmÛöË/¿4mû¶ç·$l€VZ†¥±X/ÍaƠœé̉¯×ëóËs¿uæ " d KRñ ؘ—†·3+_^wa÷•åă?=¥ È&ăóª*àơR ¯×6–§ûỳ[ï²ñ>™è ¶ṃ“5"–gæM$4ư®Ù†YÖårwÙ®›×ĂÔ$³bA´ØBl’‚†Is¶hœß`kíû¾¿[ï¾|ụ́üốUÊ[Ëó%Đÿ$c8åk'Éíă.âæg4×´vû~́j»»¿ë{ï{ŸT®ÏI,V¾;2 ’Ă% ˜Œ‚'’H=V’SG†û`ësÏ*ö$ñô¶̣x-H(;÷MÁừOÓꌬ:yKưg̣Ư€µ₫©S5,ù3Ù­ùLÂû‘d̃z¸eÄư;»“#Îv[úx~5# ư}„´S9”Én9¾ûÖ”æ\5]–ÅÜS®<£Ư¤gPXmwA^¬4ü j‰₫Ă8ñ+ ` UĐJ•X=qÍÂGÀ&i{ß·¾¹O ùëR‹ÿÄwØzÉ1O#.ßS~ïîîïî/ëE†lÛfÄ¿Á eI)ti9Ẃ©É»ËNÛó̉©”|_Ä’I(Ê×ĂÓ¦ëår1á&Ø̃´½ïÚußwO’è}×]UµGAå¿Ä'V̉̀2Đ*ƒƠº9ÑôÁ­ñNFaÙÖL‡laí́ŒàAÇa^r0\+“ÈGuSNđp-­‹"‹î‡}â7®C†́cçÍĂ3sqPñWü~Å›XùH$@*¦1Œ(œ¸Y¾fÙ¿<÷̃DtEbp§=ÎC1ÉÀƯ†ÓçDóz¦4$E‹íäi;×m,ÓO„̉¿÷`Ûà+ÿú%.‡̣+ơ…•×Y!à̃…ƒ¤œ‘8àç™í·1ûûûß~÷ƯÓóóëơ5ơÛ|=¹Ùé®GưÅ|êâvL9¤f«?̃Zûư÷ßßß=H—×—×¶üo®cÇD4ë:*«À…å'ô+̃Ä âXÈ₫ uÛ̉¶Ûọ̈üâ³4&Rö¦bRÔ³Ïät]À=I¢ÆîŒœ&#v>kbHS°µPú¯]ù₫á¾÷₫z}ơ¤`†ƒyÿ÷̉o Ö́4$‘¬àä¼éÑj&(?Ó7“¶?[ ¡Å“̀ơy‡¡$ơbèä’rJ»CFÿƯ›I œ5|RTàñuè?=,,¹…¤s€eP,º¸ 'QVôùëJ¹Ø~QLzIûÁ¿HrUdf8÷ï̉!üîTÑáéơû¾oø Ñu;Ç ¯=w鬠E‡¿hY ú·æ’ÛmÛ·Ư,ó¼qÿ|q¦$d¢‰kÀ3„ßÀÓukYé&bZ’x÷G }QK]›îm7LÓ¶í[ëmÓͺƒYfpWo6ÆrBá̃9¨‚BQÆÛ0y, ơY¢£Ë0z³Qö 25‘ˆƒ¬°$G» ÷³ IG”Í>™J§Î]Á LAM>F³© â'(̀ yw—çfÙÖV~p¡çCă®­‡vøàĐƯV‚o6Í’>9ضX„Xg¸Ăü8²ª(?çº ¥”‰ñ"Y’G¤Œră…H‘…gÙ¡‘Ú²æ%Ư›Ù›ª*k§öăGá`q5“̉JжÈĂëúùƯ"%̣đ̣Ƨï×e„KÀ+¬ëj®Ûâ7^̉üT2™?†<1[#׈ÜßƯøđa½¬÷—åbêsè°¶Ù¢®w‚ưqÿ³¥æă 09¾a±@)ûñ°Œf„xF¯ºr¸Ưnû¶/mYÛ D•hƒJ,e‰’Q\d@ÿ§¹ăJăJÂ]ھ¸‘3™ )K1Ke6"6ØÜJÏßÏÚÿ©[³Œúî)ø êkö*ÔưΘ) u˾´)Lù<Ÿª7t–†² Ê›¬ák}ªwï~ÿĂï/Ÿ>üơc¿Æ,̀ªIưLÑü…ơñ8!Gé×e]×µ~»̣̃&é®Eäá₫áÇo¾|úb„¨;®5‡çÖµæéăŒ¸&ƒ}½”»́ưđ*ØÏeïÖÚưưưº¬///ÆÙAæ•ÂđÊô*‰nHjñnrẁå´ó¤̉ăîlup‰q%æØơ!"ß~ûí¾ïưsG=+À5xnFdY¸ƯÁ¥¹°c!RÄ#˜+û“Á?2ƒ„‚̃B%–:™O0¨3k=âZ#È)‰ÔZ†©² ¢p…ÓV_8˜f´]kF˜Ö„—đ-Ø¢ùç@_›m̀^yêúÇñÇ®‡ÇʳŸ •JÚ$ÅÏ~«Y‚b²|*ÄU¦‹ªYø˜[3ôw¿®kßûvó2¾,'Óư ñ#-e³Áœû‹"y‚ %#êlun.ûLs~|ŒÆ Œf`u_-½µ¶í»Ùö¦ªº;ùƯµKg̃+¥F©èí~úØÇÍœ£ ²ió6Ÿ˜"§‰‘ÿî÷´CÙJ¸Dú&đ\"ê*Ǩ‡ĐB‡Lú¨b̃-IKçUĂ£¬JŸµj̣ØƠ•èÂë–a×G₫ƒmCoÊMerֽƥ«RGªVƒ˜j#" {21£¼]m>a—˱tÉ!ªº¬ Zf¤!z:EuC‰£k#£áỀĐiXct‘EÛ̃Ç{’üY(hl¼å¡DBmR=Ḿ ]”#KƠ°,K[Û¾íÛ¾å"ÖÓ…Ñd-µ¡nƠ¸£>^Ÿ_ÿÏÿăÿ”¦Ÿ~ưäf¤8²8€kMD‹Ë£Åê?˜Sµ˜.ñM©Y9 v’`ïăØÎU”§$ü©ïp¼0é÷iăC̀{`—·¿"Qư\M¥†'¥D.79€ñ¹èÔzƒvà sÏƯ™ “Øï²]1i¤ƒ9‘ס½ÏÈ2ăî냅¡X₫g^UmKSmÙĂ ~+»×ƠIË{ˆƠÏy¨‘ß©sÆÉ(,EdY–ÿéÿù?ưđĂûÛß₫ÿÏÿá… 5O}{úË/ŸŸ_đ–ªz~T ?đ·†Gzà́h£1’s—r˜  ñ<Ư1TtïûëË«øN¤È§X¨,å•ô±‡ç<-.‚4jÏ ZæH"°̀7 PbˆĐ¤¥pă†M&ôï1Ù£ËOă§!<à†RĂT)Ê´Œ^́Ñ@gµâ₫›º_T´¹–¶i+yœ<bI8’BùÖ÷Ó—°Øì\AUYÆ!¨S ?ú÷AR±³? l«T]Âô ̉’5ïå‘Ñ;RĐ-(9 aLcÓ÷K¯Ù–L÷6 10+Ej*+[F¨Œ1¶}»m7k¿9ËÓ'₫Ü(Ô Cœ­ ܵµÖÖu½[ï.—‹Ư®Û¾ïûî-ü¹å8èÉÀ„C˜c4EÂù¿£­â+eÿKGË€OÉ?.)¿₫püƒØBXG‘,z¹»¨èu»>~yl›»¶M7ÙÅNư€ÿ}ï»9 xæï0ÍûS¦”ml¨U-ưVI.³YQƒ₫̉Q›}ˆ]åÅNgö®œp#x> EÓ;ä¬t0B¿¾$|̉&¹8s ssæ:°”µ5¦F0†OB÷%·>µÄ WÇÀ.ŒVÈ$HŒZ˨xC₫a{I%yUIÙzđ-êȨàxÆÀ“,ƒ´áÈ€ÛN%sü9ÛĂMEdƠöîư»¾m×ëơºm£‹è‹̣éÍL©Y”Aˆf²ê®jhpăôđ̣TÖœÛüw¶§̣OÄ÷ÛüOFa÷}ïŸ~ưÔǸm7SÓ̉Äc|ụ̀e]ÖuY=¦N]F&¹"îK¸´Í8XP;Ơ₫Ç[–±ăç^ï××+,ÿ<àdx§º/”©@Ëd ØÆ|Ĭdxztœu•8fV’}†&SÜ¿ûĐE8 ¬Møă—G̃́đŸđn=—¢üĂÖÅØœ7„7ͺ#qYÇ—"÷ïß½¿]¯//¯*“±;ËNƠb6Ó[̉Çè}D€P %8Xx-ø"pYÓ7 ̃MgN±låđ¼úisJɧw$@zâ–mú–¶Øÿ¼Đç o’":ÿVÏ…¾Öüể…ƒ@Uµéº¬Ëºxƒí6•ŒÑǶm×ÛỚOøRG‰[³»?عx™=»kó9¬Ëº´ED¬¥ÀèáëƠˆÅÍ_¸™§2̀°° UŒ¦i•vpĐlæOPøvµ>k…¶Ư¶×ëëív뽯Ö=TUïïï­çë—û/Vü¤µ¶é¦”€FªjØÅPd sŸISœ‹]úØGkmi‹ç¶GJ@—n!₫ĂŒ CD]T#3ØÎă>–¶8äêµX Êô‚Á=D•}û›oÿÓúO¿ùÍ·?ỵ̈óÿô§—_@BˆÙrÇ\´ªIªOt9;­YæçÅơ FîwëN<[µJˆƯ„#=dˆ{¨È)€ùǦkE3̣Ç>êá%#{âTË_‘!"ï̃½{ÿ₫½¾¼¼X_ä£ë˜àơú 7¢³₫œ£cR~tÚ6—̀Ó9‡₫Jˆj»»ÜÉåîññQ_¯M†Ä‹§X°ÅUF·HGCÔ™¬Ç ²ç©Jÿ'L’¦ ’…|º’F›: £óNúÖ»Ew%Å×óiûØ¥–ï„M¸´åîîîÛo¿UƠŸ~ú©hÉF^o2Œy!K'VvDü₫÷¿ï[¿\.ǼM<1")Ë¢Rqè&!kÓÔ— ºfŒ.Í|¡HÿànnÏÖ\Æ«_µ\đ8ÜDå˜ÄB¦{.‘¦ÆĂƯ%÷ÏööÁolŸÜ÷½«w=.îÔ_¦Y”båĐm€Wß{n› Dđ±)…knû¶Èë1¢ÎÉ`E˜h1Đ§Úˆ,F¯‰4ÑÎÔT0²ªêĂŸ-"«/‘Î…̉ åC¹̣cô–]«†;Ḷ!*#¸BŒ*O™àDøè)Œ@uPO*Ër"2ÙÎèEoÜF&éO|6ùƒ'ơ}¨MGYOçÅ-¯ëº^Ö¶41¾'»¿íÛëëëívă¶h¹Ä Ú«& ¥U¶fÆ̃đàŸe]ÚR6f½;Æư“§Z’Æ’?³9ŸnÖ:I†‡‡5‡øÿb\́Í^§Ç5°ê°HÛv½^o7/W*CVKă轿¾¾ZÔTÓv¹\̀àèßtç',+ KßeoÚvƯQ¯@-Ï º·Ç>°ö}òdƯ@éyeÖN¢«"2¾…¥eñÜo|'‰×B#íû¾Ư¶Ûíọ̣̈ºo;³\|r x<%LĂˆµy߃›Ñ)˜­8Œù‡ø‰˜¿8Î9ú5úÖFE­_UtWëÖ Ỳª¥– ‚U‰Ç놳¹ßBæ¥ơDá ́ 1{Æ‚hkm½¬MÚëë+n‡¼jZÍ9°ØºøØQÑ+Æ5Yè¾a…nÆ—ÏŸ[[z÷èéºJßD̀0bÆCGöÏ‘}À…́Đ? ƒr„ŸÈ¤ˆóöY³¬A)4%¢½ûâ 3€;¤Êü_ ·UäÁV—˜kÛ)C2'A!NˆáKÿüü¼.ëóË3Û!\Cêp‚1æP$…£-0”ÿ‹1”wG´ 'À(Çw| °QçfvÓv¹»´¥mÛf…ØS_Tå[8‘N©Œ†ù—Ü®Aâæˆ̉¶"wLỷö}·qb„ø: ‡‰R ²io—7¢øNÙ3ƠúÉǴj¶¬Æ™[€_,D)ëĂĂü¸GfÀ4˜¤0 ǧr†0½ÁÖ`ÜßÓÓÓËË‹…i`Ͼ¼¼|₫üyiËĂê ge º¨tùæÛo?}ü予Œ̉Ô®16¤, ,I@ïQ+›AÉŒừƯ"·DĂ•èŒ`ÑŸQÊË äđÛgPÓ‹îÛ¶í}·uÄû£Ne„˜).í`2,%"FXz9ÂFG3² ¦<̣gx ØÁÎ|Æp$L8àơơơăÇ×íúéÓçëơª3-^‡\Ÿ?§ä&cˆ/á¦p Gøóå2ÊU«…*bt„Ê*­µml/¯/æÂg8% ́êÊ#2_˜”m8(̉BPy÷₫]Óv»̃n×[ªi•ÛxÛ7›UÎ)ácŒ@¹+6Üưư¦øØ”‰‘ל‚’Ư#?Ÿ—Ööm³‰̉6t´Eº ÷x̀öEÖ̃ûM®æ óĂØó1z7aC³¤ brRÇ©Yb$­ƒăg§Ö‘¨ % ENÖªc”AÓâÚUD]Œ­´„`؉đ(œÅ:1ÿOOO–¸\ÀüfÛút¦$϶XÁưR5¹%6QFŒ¯6×: »Ü]î.w¯×××××9J­¶I §‚ªÉzÿÊÎ>yŒ2ièç0mØo¿ưöưû÷·ÛíóçÏæI{ăb>…Đ};^hfưñ6rĐrc̀?Û6rP°ü  FBÆø€ÏoèUæ¤ËP+“Â"‘²q6Û0E&±'Û¾ÉV!T_^^~ùå—»ËE[سh½¬ỵ̈Ïÿ²mÛƯåîîr¿,Ë—O_øÊN„ơܹ ù̉+¿×Bµ7σ—3C4¡„CFVk*s}CFœy±= g>"NÛæªf§ rۯʀæ+£Ü T'T²t¬ç‡Ç|M„«Cÿxà[G„¢¢¯·Û̃»mÈ.̉ÆƠ^~0íđ}́ä°ÿcKî€đLåt/Eó̉¤ĐócHù5fÊÉAn3H+É %uäø|%䲋[­$&₫×eE¦J —Qk,Ö‘Ww•ÓÛÚÍ»x8g…²$ ₫¬—u½¬Vípï»G·ªXÁŸ×××ëvE]]-“Lÿèl7œ:bF̉T§›ÙÔĂ=ÊAÑ5$ƒCäÏ 6{“ơ7”˜†ÛỴcúäªç -®%B÷ïaÿûæ`FÚ±¶¥>1‹jY¿=ƒ9=l3´yhP×¶·M6Ơ¨jeD¢B”ïÇn@EÑ.”ù]+È("^=¾“Ư$x}qç‘á3dd')°ïÈʧÇëëëÏ¿üüøôộ̣r½^s¹¨äIc³¬”³kOp;Eµ’E4)8!Ë¡|…{pÔN¢®Ù[„û/í₫₫̃²^PLzju|‚¬Eu/AŒỂ \¶›₫đ‡îîî?ựë?ư謜zagC©¥Åơzµi´2“P‘"ôQ’Á’{ÆăF¨ºF¨ë1q®Dº½n×ÅZ‹Ö¾bhÙ‚ĐßD–®c›å™˜ïˆ´®¢£u^;5ÍZÉ¢'¥\Iâ„øƠj8*ñÉ(SK7#Ï G¸ÿ¢‹ ±ˆFé̃€WV¦°À\¯W/’H² îmFUÆ&L?ư›˜ëöq ôß8² ÓyŸ~xđdZ54è:F̀`µËY_ó/g7,píô”j“ïß¿ÿíok[ªTĐö­̃RÔñ#Ư ́ï§Ø¶†₫/—‹q{ß·}ƒ@nÛọ̈úr½&úOZ!L²¢‚Øí E™`À02TiDøœ̀]§ÊwÊ QV‰ïˆ„0¬Á@» 6—…ưb.ZƯ1ÀSÑ}XmÅmß܇l…¶r•Í0ÆXÆ̉{·¶jù說û¾[Œ¾ª¶½Ưô&»Øs{m¼­]Ø@,ó.í̃È6EpẸ̀ÿṼgỤ̂,{ +'¹MÚPtœCSwÔ“JÖ ¿YƠøpîIœ—g­Ú§2₫íOÓB£ñ) ÅÊØ¨Hj\ NØ6ukóO½²Góˆ‹çÖ°§»cd3éº4ßÖÚ₫Ïÿùûïÿÿ_ÿúó/?oûfụ̀¶¾€éĐ,·Ûm»m¾Ó–û Ơ0á&7ÜC¦¡ <̃€|ªáëQ/¯ÜŪèÆƯ‹ ‘>†4ƠÑÔ fl³Ư7“m8ÔÙgÄé;(«ƒêä·x̀z¨' ­Ư¥(Lf¬Ă‡±&jñcA¥{C@´>h©ÙîÅaèäæ]OÆI›̉‘³U†½ç'b„`ÚG²¤ñ̀.¬„ƒ]H>l·¶,Ỵ̈zµĂâ„m8côØ„“ŸGW˜µ°Ç<GÖY£S¶)É1†L4ƒ*¢E'–# ×î¶ïοUëđ¤3Ư)—‘áÆ‚dígàÄr£9„ÑLmpÈœø’’Àxö ưSửDá Q®çn½³øïÊ4dß÷ǧǗç—Ç/K[®¯×}ßñ ƒ±UrP*-T¢FjP?ö¦F4à¨^”̀|ƒáTu{™óç¨ÄqV"ÎåÄôfpoSè́\\á^.±”È/RBm>Öåz»bn‹ƯßÍxè¨q ¨‡ø:HN‹ëaQQ‹ưTqT©T/¤yxÜ: sè¡üñV>Èåb—Ê®aQêP†ô½$=–“GĂz¥̀éOk{V³#E³ä×ËrAè?¡È¨è1;Ă\Ù'@û ³”ƪ©¶%¸ÿ¥¡º?4̃m»³¬\ÄưgôZeQ“¼çöÏq¢aế_”7=Óyơ9pÓMa¦`Hc£ aפóMÓZJKt‹¨72â‹ăđ5¸oQyûV¡¿ˆ«•ºØ–±‹F©&‹₫WÔÏBV€ỡwíª»ví»¸%`QCÇOB̉á‡+ºđØÍx”^l tñÈ[]/‹ÖüE ¬<Ä9lÆgLpH0v#FU¥L™[>4´y9Ç(AôLµ›‹ ÀÔWhÿ,4ºM₫¾ï/Ï/–̀‘Ü3)²H©vm2[ÛUm¹Øơä]ü‡FÛn·/ªíÓ—O·ífëàë¹¹=Ă»TaXIù‰(9ùưØd¢Ê^œ^d#r‘ »v d¤üå‰+ÚƠƒÍ$¸IÀqL÷Ë÷¨²ÚÔ T3ºXgƯƒJÅĂyK¬~î2œB蟿~TC¬ÊYƒD£°Ow<Çi$¤¦¤"âP"œö1r…»x¦A˜˜Đ?~ &s„¬@CA–/Báú¨Z®{Y u'Ơ¾í¼>JËdÑ!2Ê][“ÔảyeœÄ}ä$|üøñññÑR/äđ`đÄ«à̉“~Î-Oh‚gßE S/Sq˜H:¥\íhNÇÏ„ù¤̉ù¼úø˜SäPå*ơX₫ßé°'éEÓÆ1˜Iïć§å>ơ¾ï{“ọ̈úÿçí_›$In,AP3÷ˆ̀ª"‹,Nwḯ®́Ç‘½ÿÿ·́·]™¾²Ó=lë‘ÈwSÅưàà¨g±Ù3r½(AO˜«©B¡¯×ù—¹½EƯ ¬€̀D>ü¨b™Ù µÑ&iÂN&*:!N¨…¬YNa¿¯úoöÜv¾ó qYÙ?>®Åtpù¥00kÑ̉¢°J°p@lÛY¿­9œußçà~¿ßo‘ÏDs‘9w…Χ'́a£Ă7ÇỸ¢ùœÅƯ•±”0¢cˆ“z±¯‘ûQvû„ pñ̉Ä+èT Ÿ4âC9vÈ—Æu”ÿơ( …;5‘½D¤%y°™ÿ¨ªƠ]ûè€û‘CÓ›+,½êí¸éM›´̣èđd #O"vQÈâ)z̓.¼È÷’̃J0U¶±-¤x:3{«̣>(Œ z ăqm†â¹oooá¥s³EŒÇÖçÓ̀O¾èœéVËÍ}HüÜ 7cu~cÓưƃ͒åEU R§áëu¾9”GK_kįÙüV¢Íûgêáè#<ébḅó/?>ĐÏP;È…”låṿ>=?}ÿư÷Çq|úđ©À4 U)Jg[° ªèĂ\MåÏ9¸ÚÂVfâÁÚTˆ±uZweêäÇà#̣{AêªYR£.{Ù/×ëußöÛív“[ ˆô<ȳ< íưå3`-£á9ÖJŸŸÚ„¯̀:¤ïQÛ“EbÉülʧ?g˜ÀBàâ÷¼Åj—è°lyï“„Ûr₫Ơ·ø" ¦ö•ï‘ơ+é¾ùWäz½¾ÿ|~ùÜ^‰ #—‰+ÇÄ‚í)Lj£ÿŒ;RÑ~ô>zÔ÷“̃ûÛí-LÇ-2ïtøó§6&ôŸgôRœCè¨]́Qj8-Íps My¨(²K$ƒGÈàÜ¿vÑ4\":rUÈUiBÿp/ |²]­Í•"A3l£X/¿3²~VÓ¦mÛ63ûöÛoo÷Û§ÏŸ^^^ăp?ÀШTUÇ[vzˆjƠ¥ÜÙ°0}đ´Ñzë>û{ÛuNµf¢(Êó§ÚơWd9¤±O(G,¬º‰†1³ưº¿{~×G¿ƯnƯ:óưĐ̣̀ßTƯpoúhZD–_×LTD@Iñ¬á?i©¦,Å/F[RÎîåß‚J”-l1Æû—ÿ×K_2¶V#G¯_̉dJ#¨"T^s&Vy ¥́pö#,uëÓ̀:ƒå̀sl`› ƒf/A;dX‹dߘ×êî¨LÄ$ÚPh¾.Ơ0®45ë‹ÙÑ4ék‰½fWJÊkbXùuR[‹]·˜ ¥›lc ÆsS̉z­LÇ ›l¡h¬œ₫ë€éùưÍóæß Ë2Ÿ­ÓƠ xøÍ¬!û7t"æOo­’™«úà[§làT! «ị6|=úß Q:(*`€M…Ç_·U< ë|}đu)ó¿ÍHäW¾fœ´Êús h{ÄGœŒG—¯³´”Ió›‰₫§1‹Ç?8E­ª@ÿÈĐ}}}E$•(-Ï`(™7ÎÂJ^.—o¾ưöíơơǾâJ¢›;8a'›•ei()2… #ù2₫›;Ël^.L¶¥Ÿ¼ K¦cNèß&°®¢mkm£¦“ÿ.‰3Ǜßœ8N"t%éX₫Æ4ÉDP₫»@¢Ë¸8^Pø?[€É\ä”]7L³åHĂ›úô6•9aá̃Îß\Ï 9îÛ¶½íƠ´ U*äDŸŸÿøÇ?Ú·Ûm#²|2 (#î?öï oɬÜÂ5´7QqèïE?],ûè÷Ûưv¿qØOq‹¬– r@«©ˆbîơ½S—e€äéz„₫9ÄŸ)­u}O¦lz̀Á@u~ uĂE ‹°áø oY}:àu ̃ U FG§Ú´m¶mÛöüÿ‡¨üø×ÿëư¯ ¯¼O“ûe¼aS·£vÎâq«Í“3Īs%–%-âÑ: m¡1F«ª½Dˆ?L;aH) ‹ ̀ ïs^-ó¬\çn³Æ3_¡d‘à₫¤ÍO™gµØdD-/ߦ{̃¼;jKq§XÍØ¾i–b-ZđK1zÓ¡w»nz®€»5“5ÑB@‹"‚ÏÀhE¢p”M7Ë~4ÑP3¯Ư.Ó‘¬Ôù@Æî!0—9²>u*e/iÓa#âæq6¤‹ –^£L€©sđIAÇB´IÀ (§Ñ̉¹U\%íĂG¡|öEÂè¿}]T\Óq¢æÙp[OrNÁ?’–2Öû—ÇÏS°èGùăĐÿÉHÁùS ºꢾHLk’w–-ä'e›KÔ§n%I™no|Å,'zíÚ˰?yOë5"êW3x v8øÜb– >μó̀È \¦ç@r2ñ<Û‹ÅÎ%j߸vC24'‚Ïé›5Î<Â}câ(µ9º JÎs8‰“¤üˆ-S$á@ƠØd¨c¯9 ñĐ?Zăđ²Ñ~9ƠUµz³˜óôº¸˜jÍ$+í£¿½½̃ï÷àà ”@À ÓHÉ ¦wúVÂG³)WÄ÷,HbÙA œÂ +‘ÖÚr`– úèfºÀׯ'Ç8îG?úívă¾§Ë˜—µ.m “$ó?#k1k¶eËØä•Έp1oĐ|̉o´§å'ysơÿo"₫Ek—U€EŒà́fdÂÿB$áøˆđñƠ,‡¾#ªÚ¤|]ö˾G™xgˆ"ÙÆ OÜè½́—ëåY§ ÍP™:¿\QK<èîèÇѨ\)bƯ¾à_*|̀*I7­›‘ sĐâcæn<4Cñ/X2lxO”ƯV§æµúJKÛª.ZüÆZ·j&h°¨Í,M®€¹å“+l¼̀õGÏP‡ô ƹîñô6*¨Ë*³Äâ¾ïÿé‡ZÛúÑÿạ̊/>¡H ÊDºo£a#ÊŒ$ Ï q=_qN 3Í| RÖPˆ=0 ’¶Hnă “¸ÿ6ÇU‹=c½=mÚY Œ /U¡‡E­œúä[ĐŒ¢Æß¬ñ;U-’7*¶;!Œ„xbQŶDʳ«m€°gäT]À|̀(ͱ|Q¨§]`.§HähAóÀCĐëB—â?t¨3̀²¼–¡qÆŒP2”¾Ù hH×FØÇÅü[¾ ¼L`=ÓùÂç §Sê)ÓÜĂ ưù¦–Ù[¤H½h‰f ®F)ŸÅM7ßV¢™ ²ô~đV‰³§}Øyv̀yÚf–6 *8yd6ü 2ƒ€•â3ơ®‰eªĂÓ/§#LáTÖEtS…-Ñ6—[±̣/•êÈy«ÚµV×UQ‹™~º9^k8!̀%˜Ih'02qNŒé¨X.ÅWcû™iË⼘:â,ZA:\Ê?ÉôO”™]®—÷ß¼cüôóOÖËPZö“b¨„M'đ×%$Đô G绹¼LmXPyNº‘́¬Öèă~¿{Öx¨Ü cè Ê?-‚¯úR0/­+&}tX&B§$×u3µ(E€-9ë:¶‹(F(E ÀELJáƯÁæ/"W·<ÛˆđËưè_ºdÜ‘H¶.¦o|Ö9­E#´ôBlm„b#Ù<.êg}•‘€DO`¥Ø)oaV±€Êy¸ÑFẴ³HËd©HCd¾c=› ¤'æà—Ṕß«]mmÛÛî[Àçó̃ïqg#ÆæZî₫vûåç_¼Ä<g’£ø’Цk&–¤©™Ùí¸E›BâớƒwqiÖÛÀë̀‚Bɼ¬ëóùđø̀È0ă4ÖđÀ¤¦óĂS4EL—(dy„¢hHqđd&.è%p6}Ưè¯#•s¸ª!́ùGí–lñ X¹J×ăÜ¥[x̀vđ’«×í !Ø!ôÍÆˆÆj¡,¤¡5˜ëÁ–å€ü£ [ö¬¨6ó¯Ov)™¾}¦‰bÍÅ8UO·CĐ¼>ˤMÇ›n '’%\#C@FŒÈ (?–fô\j°¦Ú¦ÁÔZóÙkDªP̀yăs‘P8’‰éÁ©O—ai]x¨­g| Ă,ÿ“%¬5,Ẹ̀×́qÀlØŸ¿ƒAe5Å›¶8̀çæz½îû₫úöêÚi¥Q¹̀5̣¦˜~‚ăL3a¶ơát¼^6̣¡LËm–̣À_3{ÿ₫ư~Ưßno?}¬€(̣{Ô >Zͳn©;M®ar³ˆˆH“èlØq÷ă>zV˜˜ă¡è˜éà öD›¢̃¿ dïưííÑÛªúx[ɤ u©Îd³iIơNµ`¨™c2lû!ÿöªcb2‰́ÀÎUƠo¿ûVL>~úøåå `Ê"„Eâ,öëĐÚÎrÎÿ´éq <½Ï-³ªxJSsjÙ‡<̉ HØÍ›™Œøçf´,oüơÊÍÿAOJ6XÄœÔđó. ¡oqø“& †K›ú÷ÈŸ–‘?¢ïß½{~×₫á탯ŸƯ"r¿ß?ú|ŒĂ™\³Đ?Ó46…ư0 TysØ.÷ăJÀ³JFïG÷b›Ơ`)ê<3¼eA‘§B̉^ ṕæEÂ<`{f$Ú¦Pû²¤Âê0f́ú› †Då4óv8Ó„û«ÊV“¬ʳá%q%œv/éhf­µ`µøNö›h:•¼ê¿[?}6^^^¶¶]¶ l©h æqC=)̉1ÁKÍTTĂ$q„®1+˜[4¶Fç)/sy»ßPT›zlƒxv¦F”HxÄ 3—‘O©eWa¯{FkN%I;VǛ Û«¤º`”¯V3}V’–x|Ṿ(ôŸÜvÄĂ´L,rUưI­kc Ă&@Äév?ç¾ưöÛ÷ß¾ÿđñĂÇX¢OP%~Lv̀K‹\%¡ ªF¢¶›ư¡èH ú—K)–d05PRmײáy¶—À³ÅđàÚ”:µgæĂˆ•X5û.­¦„Ơ’·ăJo™çr0íû₫ûßßTo÷ÛçÏŸ™†Ä̃¬»ûºÖ+È{†₫˜%Ú±2)±â¹ÆøJƒí̀|^Ø=ñ+§ÿÆ”Z5’S¡÷ê l.,"ÿ¤KË÷ûèv#@ê@«ïy‡„©́OÛQđ§IûæƯ7ß~ûíë—×̣¡́[+ ÜG·×Êÿ%‡ʘÂưñ·N½îÖú{ÑOÖ­C!0hœĐ?ÏÛE"‹XñôîŸ}+Ú.ͦír¹´­ỡ½œ4Ü;U韜?SíN£̣ DbJÆ!sóùëÔ"₫…½µcÚ&å»P„¥tlªêư}3g̀T6(üœ ONûëí£»`»ùv/$™à"¢£KoÖºô"zr1¦=|ªiPY©j=¾ǛîÇ¥¦¤Z憷¡˜#±̉,"E&QÅŔ¬¡JíçiK_ee¦ưÆ9HfA6u›D.¸\’ÑÄÔ…Á‰kZ–Ơ⪙Œx*‡­p),V©fYe˜1J±.“"Q ¡o¼Ëa¸~B´iÏOb6CäOÊq&Ø#@n1ŒæùŸ”ä¬uΧŒJ éå-üKŒÜ©‚©y Bà“̃!¬>)zv;æØÁ*¬Ø—@  7fpÓ¤ àû#Oë^á@Y 3zkdC•c~ƯÈ®>E£0î)FŸƒ%,ûF ³#¥¸4‹%0§|Ç`¤Øå²Hƒ æ°6?¨ÉÑ$¢p.­¯¸ï¬ Ïx…UÖÔY鱜y~#ÜÀƒUØ#,¯k~̣ÿ,#”ø§¿Ư€q§é²\;ÁŸ„}qxOh̃EȽ\/—ËÅÁÄÀywû*†L&”°ú]±|´¡XŒ"ƒ]3ăđb®*É*Ê·IzP™|›¸óˆŸÔĽۗĐZb̃Yq~!&ªÜ@§Mj0É9X ÿ­‚jQ¸q/Ùf˜¢¸#Jê«kq¹́FÁ %`,H''I¸‹|æ¡gRQỐäQË”3ÇÈ-¤‰iÊïʉZ¦EŒCI/Ưf…elß;Ëá2ó‘Ñ7GŸ×Éb{¶i¹5Ơr+¼!pÄưëôïèÓË4…₫O¸Ầ]œ_™:‹G4ĐƠIm^)è 6zdëzu  ´™gP™MÄóDÛ¬éwç5Qx½‘›@Ï đp à&„YWVÔ-ï1–¡¢"F¥&¸B"?ˆïT­~%máĐ,œJÆzÄ”9åcûÙ#¿º$9„ơnP>Xă‹ 5iç<’Ù6óÍáặÀŒAIM¤j@!¶Ö†Œ­m†ÜÙPª„#%̉ŸhHHÍ"¤uˆÄhÅ{LÇçIKQ›°yüfq*GG…¤= ¬Ë°œ]·@rç1€c — Ä/ •¿R&g8i₫³ơ¨V4†fǨó£Ă³G†ôĐl̀7ê^ĐĂü+|ê§…Y™ơüN@pær X·BDEÎF8ÏO,n+󲸉Chú KóFk Ø›< N¶ù́"¦µÅ?·¹¢dÚªn+Qƒ°——ç_øÙ¼ÇDÅỎ,ë¶JåæP›ÓLÙ#¤iÍÖĂ&I7̀º”-ÿ_ươåËËç/Ÿ›HŸ Ǻ2Ź%̃hE”DN{đET¢œ6:é$Ë‹Ư'2!ŒJẠ́ĐĐH°k¨‹"tăÛ°1Xu-ͪaäl/GXè¦èf€„A®V‹²±Î§ƠƯ‰”IÂÛûñÇ¿Ñ_^^G¼>]“Å̃<ØÆÖ¸¸á*糡¸*—¸ädáøÈTLê¢Xhu–|.`È•|jÆ@úÎ5O%8Y²çéθ`2b¡f9U¡–Ш́àX¡G˜D3ek›C…(ûÓö*÷)"&̃v XJ±V/ÂưAÿ³ơÈèÿq홬k9úđ¸ÿˆnï Ôđ»†hx ›\¤³ }[X_Óc»Đ:mŸ®Oß}÷Ưăåó‹Ç˜ÔUĹƯûwß¼ÿfÛÚO?ưtÈᨂ¬̣¸ ¨Q «Rs_`zK8æØ¡¿mBØ?ího+ơ·wG«³µÍë«FؼÚ~»Ưœ₫ßmo­IÛâ, '1…qÁƠ¦­µ}ßƠK…JÓ¡jpè¡C½;˜»tèèÑ|×›…””–y º' 0ṭUèB¥CÚ–}‚-/nA‘‹LŒÚøYF[ø†?̀<årt(ón&ñ®[_ ¹Nö6PEđRÉN ˆ^/d‘áỈÎ^3AR¬̀X϶؜Z•.=¥Iç‘ŰƯW¨ d˜ĐÇ:kR]O“l69Ám₫!Ú`¿ÎW]¡€¥ZQ—!¨INđ7m#I—¦˜aL W%6åb~̀ÇÏ2Äx:ă’ù‰ăYϹ „×M[,TtÊ‘M7Ø”.̉°Ë·p"₫.ÔÀú_/:a;vÎZÈÛœUÎ%³äz^@Uœ£ó± Çv;¯°́\Œ}G†<l̀~ụ̀¢¯z»ß2¶‚´+ó‹|/_±¾&ëÆ”hŒsôc£ƯF²$Ô k¡fqÏ'EZÍwz¦uưĂ „&ûS̉»ơ¨ _áñMdÑHôî1×ÇdŒ-鉓;ˆ±ølû¬Ăœøå—_Æè·Û­¬h“ӛ×ZR%._æ]·³²‡‹O~>J'HöœQƠM¶ˆ₫hÑå·˜©„•¯_^û½y}›¢ä «cnS¯„µ`@l̀³ˆ¢îÍ8F0́Z¾§cP¦ç9™æGqŒ*Ô x·¦̃xÇ¢"‘ÀÊöîÇZkßæX %«;† ¶°-Ë7ßW”Êßà-Æ̀ϰ?‚ơ—øë ´µ­mÍßå¶ßî7Ằ¶m³f›lÍ" ;"¡ Æ ÔERvUÑ6Ú!‡÷n½ù+î đxô0ÀÁçƒQ/7!2êíUNR‹`V÷HDÁ¢l¤©›%®;‘ÀÊ$œ̀‡ưY’ªößü†a9;!*å¶ó%åÓ¤==?ímc|yưŸçÓ÷kÈÀ§táP¬S´¦KÚDĐŸ›ÔÖâë[P\èÊŒ6X“à"@–x)Ñso¯EOƠ¬Jjp)Ià4€ ÿ‘z³8°¯đ3™è^óªøÓцÛa fâW˜‘ˆíô²\-ê“J:Öä6id¸ÂaèÏ{M„ås5˜ó˜IN‚÷¥¬ÆÆÉúû’8‹µéVGˆlmóÏl²©h—èîWDïCIœoÂÉbI³Bgü9úߦÍUï²)ÀÖo RNxđ‡e:"i²-:Êơ,\ ³øơ+‹ @_Ç3ßûd]œt¨<ái²‰=–,•Æ‘ .ñ€t„TjÂgS™gü|$ÇÍ’«Dˆy=¯ÑjăÑ:ú´uW3̃5r©/3̀—ó„×đN_đS4±:†w[/€EiPj#å­ÊP²ê¥ ˜3̀ ÔƯ¨_» Lú¹₫Ơâîc,:#Ơ¯_­Êô£ăïŒÔg;[Ø#Á5‚D…³‡}Æ^^>³Gxo’Ơ÷@2•s₫ơ ȯ,½J&ưÚø:–~鲦æØ¾qCqÛÔƠµ¾ç÷iz&I‘|2̃N¸vµ̣El±0EÚJIQR úĂˆ1PDÀËçU=C´N d"m×#ôR×úRQiNÅ₫­Íê7= ₫W h6PT>Ñd‡•nL›jÍ^ưOOGj:aÆ·Û-â¸̃¿.{»ỡ?|ú‰©áWư~ô’µÜ°Ñ³•` !/kÛ€₫÷Ba WR¥”I&"ˆöñƠAdˆ!3Ûo÷[km»ëºÑ†µ­m[s9?)bÑF³-²Âƒ´Vơ¦Í»‘mĐ{×ü/>¬Ă{ÊVMº9.¼k.¡ÍNÏ‘½ë#S”kĂk¬/æ>zÖ†X@Ñ_xR@³-^ÂXÏ’o«ÊD6\40˜6#µb"*ÿé₫áư»w?||ù—¾ñ̉JçC ÷QÉ4̣0øÄ0K( êïÁâ₫ó·8‚”SÆ•7ƒÁfCÆĂùÛµQ_ÂK0Æ4²|̣ ®J¹Øô™"<°̣§Óq©Ç/”Àjfæ)ñÙ ÔfS¹Áæ5‚´p¿/"lÈÈ'+y8qö̃@'(“*]½¥àù)biZ s#d/äÛ#ÜZƯØ^e²¶î¢p‹c £@(hDŒ&ŸË&²î{„&j=ËYÀTçL(JUE;ç‰á¶‰8ä=ÅÀó’¥ ¾X… \\ǘ€ƯŒN üµ¹|™>c§'t¥%ˆ•dÈ5U+¡{g₫• Ưe6ê"‡Cqç`m9ºi=Êx#&0´á‘Kïê+¨& >©g“T̀J{YÁiÑ4O>Ÿ”"¿£ˆB„`:…=T¡˜eǶ .—jY ÔPY²‡ fÛH`g°ejœ–(j‰ø™“–p>Û‡9já9¯}·Dg±¹•ë8/+a[j²w¶)B:ͧwAYb[q±oMĐh§©ñÉáÙ¨ Ú*£öm«eNđK½Î,o²b‰5íÑ,¾Rë [!ĐK̀ÆÂB^N½í*ºéÆ=¿ư‹JÉejÚP¢ª˜~đW'̉´»̀zF̀夅\à³yÇưW%‘p^‰ÊU?ḱ…paj¬¶Çú‹ÍŸ?îǧŸøÊ¼¦&ö믿Œ1^^^"Gù¼¸´Ä’›¨n[ƒk±ØTé?#â?ͼ2}!'+"ߥêÜ¿Gü[F y8F“¶¿ỮZk}ï}ô}́Û¶íc·Íë 5Ó¦Û¶¹ NPߨˆœªÓÑ¿c|Ø…£pocŒH ¡ûúèiàlî—^Ü$öö#²%\–ÆLỊ́?D‘ ³'}:£@ 2Œ~¥ÍfÔRß1bæP @U÷}Û÷=b‘“»ƠLïc‡ >€s‚M”ɰH½mÈÏ¿ă€ƠµOL‚Íň”5óî2´øXr0i­Ả’ Ψk¥+ùèÔ*À_²"¯Î·‰V́x™T¬zbµ`ë ”%qy­pxVÜ|+v9ÊÊK™O1ñ¤́̉ö†íÄI)Áưçበԋ L‘‹˜>`*₫£bÿ“í—ØÀcfê€&C4\‚6¼i7ö×ù £*Đ`ÄŒ²9 yÀMá·̀ŒŸđÁQ&®çK•^­zÿ- ³HáH`ô¾ơ¾ơ}ß}̣7ÛF£mÛ–5‹ØäPK"o19ª’ÿˆ¶£:´ko½zx²XiÏ HÙCèp}G¥x/`Ö &)²D³p—ƠQ§)±qaèWú“Ïáü.XáËùñ€H#æR‘“—rz₫Ó§OÇq¼¾¾:1?á×ÙïÉ ¹Œ¼1l"²é†¼WL>ñpÆK×̣üüüÍ7߈É_~ü ÖKU½²“ăGÉjâĐß-I‘ ÏÑƠa¡NàÎ{ºë<ï5«*sL–@ÅË>Œ™Ưư±(”ÎwD¾„)ú¬µÑ¼¾m•¦ơdpRD¯–Óđ„N7’ĂæPN¥đ°ó˜Ëx9¿u² VAÍó×IưM7́5Ô3S»\/ÿË₫_n·Ûñßñyx°SJ¿»<Ññw²j˜̉[r‚ñùG°›­M̃AË®gÓy~öp'¤W´L÷VwQ3ISóƒơ¾fÓè*B’ßZĐ?_«9‡Vy}÷áøç ́ăég4?Ï€˜lÛ¦M½âÄôVÎđĂ=È™«Ç+y~‹, FuxG)_p¡TZcφM2Ă@ùñ®9y~0rœÍîu8ßÎơzưÇøÇßÿîwŸ?½üøo?¾¾½*ß^aẸ̀Ló´0œ‰mº•y‰s*+ ñë¥ôæ ¢øKm?†ư}.²ä&ÖL»ăÙ($Çém €»i‘.c?¶Đ“T\ñ5*@„ï+S­‰g©=–ưûPDùÊ|…! ‡,²01¶Äñ6‡ưà+̀Ă°ç ³5÷‹Ê¶m—ËEEo·É÷ÅâT‚đ|1¶ñ®ç€† ç#.TäÂ"Ê$z›ø"´ jË–<Đöİ‹́_₫’Ô­̀̃B¯&¿@Ö±¼ÇËtaûB¢µ ³EO*å{§÷hư4Ơ{…ơ‹Đ>É-ï_©”ßé€Ư³̉u‘w¾Zd&_%3ätmº±¿ Jl™™ưíxÛtcŒm ÿ»ÿkÛ·}lĂÄ<%`³,á̉6‡q-ç­·t ơij£z´Ö¼ç@×.ƠÓ{̣ °8}kEZÏ(4È\¢ ORÑÎÆdÑ«|ÿª’×c2₫–±Å¸ựZÎL'¶«ÉjÉLª™tùå—_öË~Ü#Rm‹:[ƆÀ%R Zs/d“æŸב­$]H˜ººv¢ío¿ûöOú“ ûË_ÿâ´±¢½„~Aÿ%¬Cµ)–Éó0óÁ¼¼Â7>dl¶ï Èă9½`Y…U‡̉† CÔ´) iôÆ̉:·¢LP³*D+éâœÎf&«r@æÂªÂ¤TØ2̣éîÈAŒ°Í¾²[ÛtS¯lè,V„ ±fO×§?ưđ§×·×ÿúă«¾zÆ¿7ÖÀeƯ¢¶¯´{¸w¾—5]·–Lià £³gø[øé<ÓiÊbap9̉uj ’dŒ>8‡&‹(¯ºŒPÏ¿NSºlI&›ù3%ú°º‰=??ï—ươöúåË—¯ư#€ Zá¹Nëθ™KăÄéÎCâÏ,è‡åLËÎADg—ˆÏƉy(¢ơs‹xé̉E¤):Ùl—Ëå‡~øÓŸ~øïÿúçŸ~úĨV+ÅRtđ¢Éƒ…áH3X¦i°‚b²(Àơ₫«,cÍ$¡–á+(a.À3TR“?a_9-PÎm‘úó=Ö6aF£‚Qwö̀§E:Ư5₫ç ™X3̣đ›Å1àEÁ1½Wç)°|²WÈ­ø’¯ẒÜ‹a)>ĂÆ7ß|óûïÿöú¶mÛa‡YÄ„Ä< A ¦Q1*á=˜uSoälÔ¶™ù'̀!ë;¦K¾{Z¦j[“í9'ÖêT•¼€ÙC£4rFSÆ<₫$̉|3ÀkHOv‚d4|’â2Ư±,<*VÄëé>³2ÓŒYº>“Ï(£}ÿ₫ưåzựååÓçO¾%Q÷SU·¶ơ£÷£µ`^ù<<}n?sÂ4ÖeØGaô¬£Ï÷UæHß Yôrl«̀n|h_À}gë˜Ç`6Z8Ô…O"₫rTÿ”ÙÀC ă“×CŸœƯ‰5±³ßÁfK _|̀Î.ƯútÍ?üñïß¿ÿù—Ÿ_¿¼.´%«©óí„PÍ¡_ú(Dª&Ä<,¦T%ÂÏ™dë)4h >UƱ)•∈.đîÀñqF]~‰XMü„HÄÆỗ_¾¼üúëåß₫íß^__Këj†ŒZh¤Äx6eˆf\P¨ứ₫³Œ Ç~£¶e9Pÿ ^Ü~ ú zỒÛô-^¨å>˜óºc̣kΑ_øE”€ëüi³è\£¶§plŒô‡D·X8d| ̀ûNs(%ü qS₫ᨱ.Ó ±2ÿĂ₫đÿđÇqüú˯£g˜.©ăŸư[½¸(àZÄù4ma d ¨.FÆ<¼å‰—÷R~ªR:ÏÔđ‹4©%³~̉Â1Nïḿ yC‰Øơ² à"cÇá Vd9:×Û̀ X¶Ư÷…QÉ”KS‡ –€9‹áløåzy÷₫Ưư¸ß?ÜÑ¥ ƒÀ¼Aư[ I3Ínˆe’LüuÜ>“¹nA8äbª¢¢û½ßEFXßû>öËvA,ç{~đfY4J¶è:¥º_ömßlØív‹N­9­¨Y—Ú €) k$Pjó¢@c ï11TÙ¥ újFÛIŸrœ·G̀7 rZª¢‚Ë":‡[$₫8Ó“<ÑM8üj-çŸƠYœĐY>´Ëå\a± ú°y…¸äYWơ‘Z”kˆn£Ȫ=gæq/5fº…OŸ?ựË/̃¤å#|wù@×Ä)@M¡³°a–@¬©Đ'Ø̀f1Ù¦¢¨S‰·&ń gz69ed[¥VĂ3Ü¿*œ>½¸‘ˆ̉̀®Ö:¼Ùœ̀€V©áaLư‘À'<û&C¾ñ¦íûï¿÷₫ƯÏ?o¯¯¯w»û€æ6^__ÿù¿₫óív{{{ è±j\€†€vXex‘ñt|q¡ÜNpî3>(9'Q<D¶ $åÆ\t[̉'juN“f™”Â0Çn|Đqï¯ #“•Li+_6C~`̉6çÀ¡dåó₫ưûo¾ưæăÇ>|€äNáư²_.צÍIî‡3ŒŸfTŒ¨’=×ǵÈŸŸ†º ̣\=^#ú2ä´Êd–̀K2Ă_12Y±, #œFubḾơơơ¿ư¿ÿí¯ÏưôñÓqưóÀ̀¼Pú~˜r‚HµéÊ*È;JYr.)=.âLúFœí Ä— ˜¡6ëXüWÑ>ùÆjp¨·Me¨‘Ó7*Y[̉êCÊØ « G fD%XŒÙ¤[4Ç0ƯàÜÁƠ]"BŒ§ñ‘ ¤5"7˜3'₫GØto»ˆôă¸ßï8wHdiÓÑG•RhRV²œ’¸®üĂ™B>Ç+ñïµµ}Û½́;¨^ÏÜå®̉˺ó…6^b~ 5 Ó‚ÓaXD¦:H:Uâo«ç¡.ÈÈá;-V¡nä4‹ºœK½×„ª×€s A³ư²ÿñ‡?~ÿ‡ïươ×OŸ>qU$”H’̀4À1W¶ l³VLºe\IAëlÀ,R§víµäƯTØ9<*Æ̀q\ÆÅC€Üđj¬û¾ïcĐ mÛ¶ÍÏ’ Ú·÷ï̃ưèGGäm8LWz8¸aªê%´k÷>†ÿdđ©Ú8»b±đ ¶Xe”!8Äă1°ÉQ>zĂ8RA¬,Ñ£ƒà€íª°ZÀ’îu… Ë,ê2æ© 9&¤%)±n5r¨7#h‚P%j "Èă"#Ï›9áA3(ÈÿùñăÇ€́}`´gêZ̉1åHæ x\b ̣/4Àw^è‡KÂ6ÎåÈ/ÉYJ‚"¶DÊ ÆÁĐ̣º1†aÀưQU\WªÚ“Ite¶L¨̣«×ƯÙt_P¾u¿d*à̀™=x¤Ëb™´à³Íä»wï̃¿{ÿéÓgÍØÁª98lôñùăçc6̀Ë€z®đVù¶!“ÈÄđÎ5a§…›©÷ Tc0$¶íÙ †øHȌۦO*ư˜lkM ¥u ;dr†p¼ ̣Lö/p´ÇCưà® ­ú“÷ß¼ÿöÛoßno }Ĺǯ·××/¯Á]qX3ÏáINæ4‘)X—…}rîbFÖñO` 5̣&­€`15³ ÷,g•n*ñ )T€}pË&¦vôăÓ§O¯¯¯£W¸à¤UæÀpbf¿́û¶>no7!Çu₫Èêg̣H/7UàÇöôđRƒ(­ÈRĐsRÏ ­^±ü ’bñI m}qWÆ!Í=y“Aˆ ̉©Ç×\æå§ip¹ }ÂYŒÄ|×È%ªt(åàÆôǦ(\—úçóçÏ®‡qœMLưåƠŸÖ‹â^"ÓW7Ø~ ¨7tBR/¥ÿ±₫û¾3÷¿•ùD«fîˆ¥Ñ 'ˆyĐ˜À¯6!—//o·7Ÿ7X†T,w/KÎIP¡Múè&Ñ€6^ÏçèbV³Aºo=¡sù8˜Ï¶ÁyæA!đ‹MÛˆ¶ƠS—€pw$¶öÏ#’*̀wˆÈÓÓÓ¶mGï··7Ë$° b&-ÍФđtâÔƠu “™Ä7Róæ;ÑŒsß5a!¦†Ñ›l¢‚zA+®Ị́ÛkÊ24౪!|…"–E9ÿóá‹ËׄOG:Kœ¼(“ơt”®ˆĐæ}ôȽn6ô¯ïGF™?«»(ó©öBncºDdßös…₫1Ư¿₫j¿Đ6Oïl´°&rº̣\1n6”*ó'#êfÔÎM”Ïu¹ÆÅƯ©Øê÷kûơ<ƠІ1”-Ơiº­[·»!̉@€›Ï6‰‚ÀÚQÛ·ưr¹Üå>á¡–Z”˜En’?Ÿ˜`‘,ª£‘¹èÅŒfƠ‚ke &i²„¾L«ẲÂăüˆÖ‹sq₫ÑI˜g;p±LV‡ˆñúÁ¹¹xɯ́̉¨4uz¾ü±è”0 u¹p¥*µs]¿à§Ÿ¾|₫"I™±g•µYưÜ£‡£ÿmÛ–Đÿ‰Pe9K'ƒU4Q+ñ_.'₫}´Ñ$Û wkücÅ™ồ¦¶•5‹b>bøi,4bë£<óA´±‚w/ÓeN°®/ú‰GéØơXn„àç¬Aî‡TGfjïú}arÜ_ªM¯Oצá÷œL&°!cÂS—e¸ơhCÂÅĐßH‡¯'—JÓv¹\₫øÇ®—Ë₫ùËç}Ûß=½ÓMƒø}lcßö}Û/û®€}́ưwÛÇ6ưo¶ùr*…x(ÉÁI“ççço¿ùöèǯ¿₫úžh6'@>Vu4O撥ૌ81V'–úŒºĂ„@·Ë4Ü£å9r4É#|&É&)\¶ëÊ¢±ODF~=¯đ’dŸo=ŸÀZrÑ>aÍK´E‹Đf];¾ÎFóràö̃ăÀ½cΑçÏŒ¸“Ê₫aÙ—Ñ"dw 2²³sQ¤ZùRBp YƯ0‡L(ÿôû̉é°Ÿø?Z£B̉ét}áæÊàâh‰‚úÙa®€Y £-Àï~÷»o¾ùæËëë_₫íßFöTÇáÁ̃­IjÀO[íç‰"ÿ`m:&bé‘aăííMTĺcü7{yyq¸p¿ßÁÓĂL•M·wï̃ưé‡?ơÑăđâVLäâîÀƯ!Ê¤ÂÆDV-”cE f¬̉ £TC„ă ¨3côà1kù¢gêkAu¼ØơÔaĂe˜z1‡1uŒŸÆR°Cç̀¼{™̉}¢LV¸‹[Ư:wÅZ|‹gÄâ8O؉ 'IvaVo₫àm¶Âed¯·:hQ[–¹œ˜ ú×̀´c dJT+%Ój²µ‰ùcÏG‡1„DV»¯L¡™^i¢̣₫Ưûï¿ÿ₫ụ̣́×ÄL‚) •£©›L°^‚ó› ’ºBÿ¬₫r_4m?ÿü³˜¼Ưß´ÅB µ»‰mc‹á´(™vTËpØ$-Ü­T– 7µƠ^ ˆÙY! (OׄEưZ4K E₫QàÂeăªẓ!Ơa0?,Ă·¿PÉv° ®̣b„F£²úÊt³ĐpÖQt@À²ÁSB+KŒ¹´ÏŸ?ụ̀åv¿-g3ăªØPo'úƒ́Út#Ó œÔ$fæƯûwÛ¶Ưn·××W,‡vá#–?°Ôb¯ó¯UKœÙ%‡K/ê%Z¦}Å+¸X}_'Ed²‚fÛ’_¯Æ̉ụ̈úŃÎ+»è.ß”RW^`'Ÿgü±·^c̃Å “ éb ₫dJè|ˆÔ$Ê—ûƯ»ççç·ÛÛ§OŸ&ƒ‹…FèÜBAæ\ä í̉Lb)eR€Éx)'•$÷o¡Ă†€ăHj?Î)̣DÉ©æÏ4iÄxúO[¶w-…3Çúƒ=e‹ăX×LíÅ)́7ÂïEHU7Ù6ÿNÿ‡\X‹,ĐŸEư…Ăf¢ƒkÛ¶Í{Âîûè_›ƒøûư¦]@3Óœä˜Đä˦röô¯¢üE΀”– ·+pW¨°­µA¹Ül´¶0 ̣4Jî̃qASg_ç Zó,ë1ÆÑ4Úƒ£Æăv»ưùÏ̃·ươơK?ºÿDiµÍ̀zïÇư¨í|x¼~́hb¯ưŸ{á1”¶ˆô£ÿúóÏf²ß›§áºÔ^÷ëÖ6óz¥÷ÑGßû~‡û•¼½ï}ïÆ¾T%I;2 )¦`mÛöüîyظ^¯h0,*»î̃ 6jƒ¡YÔˆjô«%ñïxNÑ|^9DÛ ¸²§2[Fl‹.ëçqí1́´Y¡`º!Á Ơa÷”™“g|qệåJ5bN|¨ËÇv€k€0å{4ˆ¹YÛÚ­.½Ô=Ơœfđ1é}ú‹†Á‘®yP×~ƒ[‚àT±Ítx\[kÖ"‡{†øqXÓ±Ê`‘ \¼â¨‡ƒf|eµ¼¸Ç&é@aÓ€₫̃.+Éj>¹=ŸV­µÖ~Üq )Zä¼…e₫4§§C–®hÂÓ:{3æĐá¸WS¹½ƯÂk'ÑÜ`È@—ƒÑ’‚DÅSÓĂMÙbN¢ WÖ­áQFL#›ÿ{êiÛÖ̉¿ÿ€ %ÀEhÇ[Ûhúxxl̀ä¼YÖ겜öµM_®‰Â0uê 8}QÅ«i•ưL÷€'Ó–\>•¯{Ë'À¦¥yÆ`vör̀×Ä̉,±₫lẠ́„³åp¹\®×+NÄX +_VÖ(₫' áL₫V‡JäP5q'fÓàe^Ía›¦½I“ß|œù+¥>MÎù› zï¾ơ˜¬)á$vc5üè¼?Û’§I0‘½#tÏñ+S₫‚øg–@ùáü¼{÷îư7ïå³|₫ü¹¸[œJt7̣ Ÿä¥yluÈÉ)Gñ?’\¯eÿtfgze1?™é̀ ª₫× ³ß2¦báh"' ƯÂñXYDi’$,“¶¢"6°Ÿ0²­UU¢ÿ3Œ±9÷¿o{Ûîh̃œá®”̉*¼Í ơg13₫éŒđ¿†°ŸABxṚ °_NF́ÊD¨ØC¤5ÈÅ đ˜bt„ñ–ó%*Ă ưƒ¶v0ă?Ù{ÿôéSkí8ËPˆ}ߟß=??=÷öá·IĂ :¬e‚à˜kå`Ăä8Óï€÷Ø?0ÆøôñÓ0ÙoưæV]·~ôă¸Ï×ç­m^·Ñ‹ÿŒ1ú̃/ăâÑAÈ h£Ùn£·ûÛ̃ö–iÑ€ ’\¼î©Pô•¯’€aúïĂCS¢‚A¶‡åü=n 1ë«R–)4ˆÑ-¿ơ-"“™]XbôYËÄÛEŒ„u è6î@ü¤jèø!æK›d@9æp~ẻ™^Œ6ađd•°æÂÍ%‰ê4ưJ¸ó &’ÔtK&º€ùn̉G÷'攺;ˆö&Ư:C¨J ˜î2W˜F@Àpr¬‡ë|}‘à «Û6e´ü@",ú$øƠ^^^̀́~Ü'I?7“¦Â$„A8[t¬ăÎö™û_T:M]ï碧[vs‹5"&Ă$h™2Q@Læ9ƯÓüML°=䙀Ÿ.B’¨…NăéH€NF”ơ 'ü_†Ëp‰wê L£ç¼)&·H‡Ù×—º¦Ø}̀Ï«`>ÿ¾¹–câÿô~1»@Øü‹¿µ®Â®pбtƠ&bOæÿÈœ{€ø‰ÁëNmÛæç.f²¼R_¤8ÅG-uú*›t̉? à>’NS·¤(0Çd~ư¡•åc5çæ„\.¤‘1î¸ßÇî ]éáW¦å(Ñ\RƠœ8MøY“³ḶÉ–™³”̣ư5ÇPßâÚkTVhr $eă“GX^)¯>Đ¿éxíñ·¥Rüäl €5–›₫±>Ñ ßdó‹ûsv;(5‹®óăÔ[ká₫=Üpøè‡sÿ½w€c^V6Ơú9Kø7â¸̉kù-²–G91ˆïŸÎYäu[-(ơGÁĂ"S,-¹-ˆ¿Mo­ă0uI^ô¨„\ˆHkíƯÓ»o¾ùæơËëè£÷¾·}kÛ¶–̀FđKÂÔî^à¤AzªÎ¤V§ĂÛÛmˆmÏÛ3–Đ³©oû†×6 ß Ü"g ~’ ÀU}{}ûüéóí~ăơSÎoĐỀ¨M2^y¬`½bαE:Éά́V®ÍøR G¸€ơ{̣ôJ́êôÈ,o់ªeÜĐÆ± ¼î́UÇ•' sFEZ¶àræ½yŸ—6ï‹ySrR×ü/–:‡\'¸‡YÈ“?ѺXm(5́z&Â},å§¡̃i¾^c œ~”G.†¹“JZ̉­éÕ̃̃^¾¼¼¾¾t#Ù÷Œ…IF=Û È¿ÅM₫₫cºµ‰?½%óÅxéåÔs“q®ÓLâÎæ´™F™- Q–.5Z”­z?l¼èu¤w—µªƒbá¿Ë œƠH™^¬vÈù«¾‰Í4EK=”s|ÄÙPÎzA<đh-·´Á|3†^5?™u8nII½ OXñm´aƠó¢Çñúöễ§°<\’l\đgÀÓ¦û¾/0c¯Ú\'r5!$ÖCœ}¼îXTö³—„Ké«U“pÈDz#æwqqÖW¼ßYt§%œüƯï~÷ôôäèÓ¿âĐ¿÷“‚t^n¬Â"Eu $$j—_DúútUÑ××WD|é±ĂúdAùÑéŸB ¢.0)º:VtÖ9§Ç¢>IcÙÍñ‘¥̉m%ä…«8œEmFQ́¾J3úwHÑ5­AeÄ»ü"ñÖ“ç¸YÛ¸Ầđîmoû®{`ÄLÿÓô?LZ±•Y²ï»gú^ö˾í^¥jÛ7_»ûư×fâÿúö§Uuÿ5˜>Á¡ÿ¯œYÿ³@Q₫Ç{·†ÓË«†ˆ:K‚¥å&ó8¡”øá;HÍƯQ_́8ûq¯È´ôbÛ˜Đ¦½(".—ưr{»DZµíz½^®—ëåºm›˜Œ>ûárëqßö*ùO9uĐçYắ̉RóÉ~wgMvÛûè{Û]ç̃ûơrƯÛ>dŒcôÖ»ơ}́^ ´ïœ¬ß·}³Í†6¢G\ÛpV}yưrüåđc`Ù±̃Ô'Å;vy= .]Tâ¹FP"7À3E¼|XøÍQ¸f!{æ"0¬­˜J‡ư¢s@?¿‹¯,f@FE<罪¢mkM›‰8,ϬOêtơ»‹Ö³>ó¸0¤n©±MáL˜…ú fÚZEv®F½°nƯo1r¾Cg¯üzdôjvcæD¾À‰á.{\‘;;Úđœ`O `=ëOy>NM€1Îy¥a9{đ‘ÅoÈUM%R|ó%!uĂ ä…{UåÆ4̀ÿMP˜Oư÷ÿE|́Ë  ÎåDüoÛ†4_ïö惽 †› 6–°"‰µ>¹[V ó{¤3ª¬jq|¸“z èXÈMA> […OÓË<Üơ°´€˜ê½J`Àµ·¦íè1-Uf7»Cđ†‚Îç1¾ßo÷O?‰Èe¿ø8ˆ+÷î̉>}Ja'@=ré¡‹å†å~ïwmºÛ>txô·È6ö¶ïÛîB=úØÇ¾ïûè´-2ƒ÷±µm³Í̀¬Ú»í¸Øa†„Qd¯•]th–Àè” 0ÔCƒŒ,"È)ÏỬJ'ÓÑ\ô9ÇNkÁ–&́uzé/öo.Ưpf¾ßïu:ÔÉ̉°9#Játœ "–‚ÊEÀ g~äæJbÀTE7Ư“{5ïEÙ)AôŒ_Ñ£Œ"^“ûjhÄe¹\É 7nđ c:1¦c¥jÅÜkY˜Øl6;ˆq–ó,†“H9<öÑÉ*ºï»w0˜|ô₫ñ–eÔN[¢ö‰Ơ7Á+±²K+_ëuËjH›}Ư‰¼‡Ăï¼a> Î(_´l9~^»`vÜ3.?϶fg:LBi2¨,£#°p•CÅø€8‰2cå*p£ ‘ú¼¨lA•6ƯÔmQ¶Nkûë—½w×¥“H°ÇơQ,₫²£ç¹›UßßÀWÖ8ºÙ(uü)µà{¿©™E¦¯T¥G$µ²ˆZQI–Ø"üÊd̃°¼̀O!ºßî÷û=ru¾#₫‚Ö¢ú'\>%\r´̀)vR|tªÚüOI‹2¡”ß¹yÆ¦í© ‚  Rè?ˆÛ}wt­»’,‹i![fc˜ºÉd¯´6yt‹°^¡PĐC"›zđv„lµÈOp‹ÂUŸG…8ú§ăñº³Å}»,ZM çDÀ{̀L̃î»zcƠ¬&¤-ª ¾8›§»’H ’Œ^Ó|-£Ê‹zÀ¼«J÷:nÛfbG?îữ~Œ#lí‡ÁMp˜ZDHäZø±íƠ†xöÎq̃fÄ›êbQ W,«v"'˜ß&P$Êî©è~w/[¾ëî7Œ'î¸́—½í{Û»ön½̃·́*²÷¿o»§lcÛ·h$æÆ€ >|ô“‰–6h›0U[Ó®nô¬³_SĂ3Ù8ñ ᦠf˜Ç•™\l€R.ém¡…)N)ÖhpÙ/!¿*Ídơ:${ß5|#U´è mÇw%®é¹ËÈ`®Í¨´¨ḷÀDiƯÄ ]‰êïAq…”¶4`w¡» É¢7»ôÊÜđ’¤&ƯºHT úÜGj:Æh­­%Æ—SƯNµºéá\²̀ÅCk>gJ˜5^1‹*IQç´I˜+Î÷»I`ÑB!úOƒ(BK›Eˆ™…c&ưÿïẫ •×¾nèWAG4ÄÅ̀^nw9¢25o]ù6° ļjÜV 0£̉Í §ô÷áăßœÅúăééikÛưvwíÉû×#=ü@[&\)6b_´A Ứ̃:ù ¤ô›ĐiT»Ï„ÔÓgNu+ FÈÂwœµÇ2c˱ äo±ËĐŸ/Å]ik‡æWΠ¹(cë¼VÄëíơíơ ° ó88µyÚzÄÆŒMwq"q`Ôá3÷û½µ6ú˜>CnU0¯̣ĐÇ¥Óơ§U€³‘&KĐ0»ßó?̀Œö Ÿ“———1"N`ªüC₫đLjßVP[y1%Ë!¡~¾ #¾Îÿ,̉‹œÍvđqóU£KÓ́Seô8XÎÂË„o,¼~µ|’₫6KTÍÇi›™õÉuÚöÀØ»ƒ"ܲ«w—gĐáÅc.;+L•lơ¥Qđ'<²a~"¨urd™Ü#₫dÛ7ï0•¸1˜¯ÜĦüÏ}^2T@ _å )|5‚˜ 6 z~`@ü‰[„϶ËûNX₫Ôz0ås×(èƯ2ă^Ǩơyt„ư¸ÑÍ̉ ŒmĂÄ¥ªnû¶·}Û6Ä\¹ xºlYêÙÜ­“ø_ª0Ê–’$t‘̀Ä lœôÖ6.EûA7MÓ$±„K5Üé!ÓØ²Đ˜ Áø°”“m6€̉ x}>»Û„>.\ïr¡æß]vC̀Eø¦MˆyŸ·eùb–"yËH2›ô;£Đ ‘æÎ̃óø9èâÙÿP, ̃µy“K@ÂW”êzeâK¦ù›ƠFS¯–³ù^äÄ9œ¥–d’q¢W)ל̣ÎY¨ØŒ.É™ùËE &h«§'ó̉K^‹®§G©¶ô6‚*˜Ôß{úKsŸ₫æ‹ó¤›;yEfÂæ¡ümûÀ÷:ưºœ™•°+¸Ÿ((wÓ-NÓ=,ùxàơË~ùăÿx¹\Bâ›nmûƯï~÷í·ßÈív{0ÿÁ4·›]Ù·sz½)|2ˆQ° buÊVMjÏE'x7Q¹´ĐË‹gŒÅ¡†MïÖ¦£ézÈcÀ|R@óàX•?üáÿé₫Ó¾ï%Ñă €IDAT?} ² 7¨â™‰Û¶âoQ8¼÷åûÆ¡¡dØOkJ ïA.½0 JI¯¬‹Î"º(1Ér+ØÑ’›”vmó¡mE¨™Ùív{{{« ë>[£_6Ϧi_È~!À=;Ö"”ZʸzhU !<È0¤÷¬1âC*–×ùI®ßt°²Z+Aeßà9Ê¿Î<;¡Uµ6ÎÊư©TœaqĪô_•µEW¥Ëåz¹FIÇ[̃´Í¯ƒµŒZÚiñ<ªư$÷ïñ^CFEƯ¯ç¸ÿ ÷÷ˆÿç§çëÓ5̣¦2„̉—À«R:úg¬k—€9ơhó'Àyö̉±V ?6 ›&Û™ëËî[ûĐDœJ c Œ[IÁ`ÆO …«ä²{̃‘y¸ƯqϨŸ±¬Ô#I¯ñ{ÿe¿\/×§ç§ç§ççççËåâ¥ï÷ûư~ïG÷C‹•ù!J¡bçCP³¼,º7€’Ăº»ă·9ĺ>âc̃r×ʇaĂy`Ăc³­·̃[÷ºBî Ù8,₫gQ)~€}́mk6¬mmØh­í²«–¶Ơœ ăx˜l‚s½÷îÅ‚üDGĐ.™`®:T²ª‰TU²ĂXoá,g ¥(Í‘Ú3„ x*́!IĂL§ ï¥À€ơ‹9è;†Ñ2,pç@0…Ÿ ₫rơ“j±¦úËË‹g(ỢÖêG_ö₫̣¦‹3¨ÍøÀ=Ô?$–•ØJ̃)LùǾ,Q(dO•Èyμe–-‹ëO føº6[µ’m éÆX÷ )Ègz›^Œ¢“î±™ûđD̉mÆÛ¸Lđ½{÷îüăwß~÷̣éåE^;ï.Ô.&gdØ P{`&ơƯàª₫C°Ê‘́íµE¾ï×ËM™¦Å5ñ(Fÿ¼|ºôh·È”ơ®ÀáÈ$K¤Ÿ$Gƒ¤[G€§•}çÿ–³ŒXÎÂZØ5$1~ØuY+ öÆf@FSGØÏ^a?1-£#Ăi6¥œ´ủ|p¿yxóu&e~qeæßÂö ọàôaÏ@é,|H+¶A’ẾßJjüÚTˆ¬öá$3s¢ äGf³„îÙeÁ‹¿FCû·Đ?ö/µƯå‹ó?—‹đP#''“;k̀h~©F_₫=aDénQ³xYʰ“…7ơø `¾ç§gÜb₫}¯&Ưitr†°d€øî¯'÷‚aĤiS¯=ê-½®×ëơézÙ/&ÖÎÓâôđèĂ"8₫ÚGlư )èe'ôŸv>Øư¥5•¿̉G/;?ï÷>íÄyN˜˜pBđ d*Ùƒ–>1÷–lmÛ·mßüJQđ§hKµ°0<$ö·«ê¾ï‘rÙ¯—ëơr̃ãSùù¾Î²¡0kƯZê“)ô?µ™f ́€ˆ=*Ù+Ưgßî·~ô£~û;àZI€ g2< ÈÔ6Ùø/<[Ûüó›ncƯ*(hû¾íûØưù°áÆ®OêƯ"®wñí†Ùäq¹²E¶øo¨zIĐ6zï&TkéB¥ù‰X™5>7“ªß­ă-Å]5ó´tViCüe€d-°‚N:]bF¨MT« 0ë–¤rµ í*< RÓ́âđ+₫Gcó`ƠÎ:Â'- ¯¤Yt„8æokôôaơyUP3~âăá¿|RBqû'•ă_39 L|Pbzª#QÈpºA´Ÿïéút¹\¾|ùâyoÁâ¸jÆÇ”¥€YŸ.¿ˆ̣́́ZÑCüÅ€O» Ê₫¤³‚q‰‡ưøæ̉, äß o@ö̀6<`It® ¹b“°x‚AúˆzÔ´ß4¨¿¯Å™È ®GŸ¶Ú¹XưOŸ>½¼¼L?’1â Ïè95út Ra\b´û_­Ú´ñ1|èÖ§SVă¤wâÉØS )&hy`Ủ’az¡g 7$Å“đ½ Â’pÚÑà³Vy†÷€U±’$ø¿Úê= ?>]sßà#9‘å,µehQ–· À¸Î—]vÂCùîôùœ®OŹ́Üûyúñu¦]”©QÓú“Xd±‚û’2_’oóă(>­¢2RªXE+F#̣z½ÿ¶Đ7yùụ̣̈ùåííMU·m»́AŸfé¥Ư NRüĉaimR"÷×›¢Hh¥(ù(ñÙ¶ÖÚårñ¢₫×ËƠƒÎÍ,ʲ§Bđà–Hù=úÂđ¤UqHê…Iă嫺@è@Ú2XnXƯÅ °~«ƒ Gô'îwÚ¿³†ŒaÏɪ2ǃ±¥Çp+úﻨ ºLG ËÊ>Ï…pC"ŒÀËƠ“@öË̃´yÖ¾§X8ÍO&·ˆnÙª9µXñ D¼*‘˜À]m[Çưv»y5NÏ̉v]ºËÂoÑRyá¿p´áÏ æBz áM7ïൃqx2§ỗ½[ácÛ6&BÑîÖ\̀-¡<<œ¦M‡ö£Ă3:Tµ®Civ©r³’Y7ëṛú1|’f‘*Îcî÷ÎJY©z] 7\̀ÑÖ¡’• xH–‘ kNUƠt´ºE ̀°IÄØæÁí/³—ÊŲ’w(i.nlm‹ùlÙ+Ç%>ư!eî'ê£ }U2G˜1Á1§Ïí»u5m塆è…lÚ¬±%PŒ8™Uu×R  b|‹ú.)j¹!0^‹9>» £hkí₫á¾ùæ›?ÿùÏ·Û­÷^·éë’ÇREÉë4ÿ J¨Ûá·,ÏHB¥k £2¥‚aÆô‰§aÀt”´7b̀M½Ö§?e‹́4¢€âTĐ©PiÁAđ±ưfFs6u¦™ö¹{bé\aĐë ½4¨|om é­™¡…PƠgbÊ–ëZR63ë´L(å#Ó¢xö˹;x]Ÿü¸k º$ä°êơPT?ÁŒhøơ#¸6±fG?¼"sm®´úH÷Ó%uMBüüÓS˜z2>₫l/æ>‡Bi*à´?0l ÙvÙ~Đ>@iKüg† ×§LDÍ\¬i3.®Ư%è(Ư’̀bQǯH† oβ ; s‚¡'f̀Ÿư3­=¾ íJœ‰×z€¿W{t©G/ÄtƯ›­—²Øc1Ç%„t•ÅVôx!S9>“́Z¶ß]%Ùfs.vÓb1²¯zFK“'¦ë^$₫:Êß÷]Uß̃̃~üñGÏPº́gô*…Ô,2JÉ.bíí…@ÿ{]H$37 ªGx ¹Çư_Ÿ®ÎX9^,á±áÄp?:ÊøÔú2%‘ëç"ç¡–!g¨üS}c$l0¤áâÇñˆÂAF›¢̃‹ó^ä2 »ÚÅRû‚ÿ†̣ƠÜ—ßJÔg ̉d}Ƽ ÖÑo« 4 &¬b–„2[øy.₫đR?¦È¯đkjæiø$6wÔÖŒ™ä2`‰4ñd3»ßï·ăv¿ƯïÇƯóüXwCz_Ơ"o¿!C‡&6dx_°]öÑ"@(pÆÿí[Gw°̃{ßư.{oƯ¡ÿ66Ïî­{ Zkf-’*k*¡Cp½Ql]e“]w•€ûÚËp°èÿÓ„ˆ¾Ï'&²$fÖ́ŬÆ7u–S̀ ®€ăp1IOưB…8Ù3€º“YQ̃(L(uƠ¨“e´O\àăƠ}È̉…úđëx-Hg±%ư¿ZJyÓ­KoæB6•­?OE¡L8 †D́53/Eí!°2¨rl9•`éx½øĂûẠPJn-ÖbkOOON¨”9Jäz`ñ$3"[ăÿĐđ‡g[G)“ 4ÉÖlH,ë‹*¥±ÅF½è“æ)³Ăë+˜˜;=0L$‚‚Â9àmă4lE7\#àD N¼‡ù3<à3¿ø^¾̣<„Ị̈DCa®PœIt*ÔjÀ)éÀq^L̉9mñŒif'á”Ä3_!– ÄáÁC”Ȥ±ƒËÏaHO‚yrÇÑÆ\è[\p½,ϪÙư~Çå„ë²»²Ü'œY\3œZœ„ùï©ú¾ˆ 9́8́@¬wÿ]tç“fYQÑ̀̀Ü—Å·ö5¹r°,4{ôáyÏ/>xëáGôñ×Ff©¥đà›…ûŸäá<í'ˆïÊ„¿XØXÖ±í±Rơ_9_Ø‚rÑ>×ZÆŒLñKvZŒé¾¿D"¡¼,bÁ²´<¡o!-Ùè ëªÀè«|®¯ßZó‚<Û¾EewgÖĂHh-dƠ2'udÑLjÙáz© sÊo=s{ÀÅØ¶xE$öæU†¢æÏó³{*Ú~˜‡†ß{’Z¶dÉáæèă°áƒJBVäUvx¨_ɸ–d jÙ¯…₫W›9W}“/Eóy}‘3cÀ³©RE –ù²‚₫Ó×1­t;Ä£MèÿzɈï)­×æNßÁåhŸbÇ"¢¼läxδOƯƒcܼ‡£ÿÑÑGEʲ½6Ơél«µff›n&¶Ùfj›m)dmèØmöa₫·U£€aclcŒ1ö1ĺ}ßöÍ-„­mcÑ5ØZ3 ­Ë^K’ñ3 ×"#BÅc|đ6̀S˜Û3ê, Qđ«pRéĂGÉVçÁẓ¥^[tî겟?9-$i4`DI¯´³kĂ©́̉0‡4¤æÙ´Ụ¼k+T¬²F3Ỗ(ÄѨx[¥M7ß-b&è L |Àøíxù|ßM›WĐ·$db]©CB͘ÿ³Wi è½©-!¡]²,¢Iq“Bgéú̀o&Ô¡[poooBe%mnmQ+Ëœ U½¦ú9~ezîQCŒ„͈̉!g·@Ù¥Ti^ѵ rê%™lu‘y‰¥oƠu=D›…$éyn³¡¸Œí$ˆøĂegÍïó)‡Íºéău4áơ€t…°yƯàÓ¤=ô­Íă„ñï­ÖDb©%ñ@_i}çÛäë,FÂúa ±s<¹₫¦Ïc†̉]­áÏ4aFơ\g zÁ©ô¬ ß¦VP‘Í•ñ±0u4/’5F¤ ‚qA§=^mZÍ•ÖáØb-4ù+[R„B(v}ô±¯=xiÎâkAÈ sÿß\¬­MN₫­Ç–ỞđëÓwLF̃ÅIr{„ªHa~®às>-p(‰L»‰¿àW#è’?Suưe²DÑh¬.2ßOÅÓ;¾È~EÍJT.qµyœoßv&hEÄ5Rtj;ºÛ$oE'·8Á}0ü¹÷í‰,¬Ü¡¨’¼E•ÿè>|½^Ÿ®O×ËUU=æD2q¼g?[Äb-Û˜äùù¹mííííơöêÄ.GĂs̃6è¹ÿµ‘ĂÉ6;@¼‚ûŸµèïu~’BX;—¡?±C•́Kñ`"áZÜöÍ{#ø[Aa÷@³~'–á…sgÜ5Óù¸Ổu¿nûv¹\ö¶;L…²‘ >(è©́Ÿ¼[Å EḍDå]°pØ8ă~¿¿Ữ¢àº‚¨ˆ r6ªÔ×È pÇÆM6k¶Í]À°mŒ±o;jE,Đ–MÄZß-*„6̀̀ưH ØlóĐ6̣„ø]Só¬ºÇǺvçS­™öœ‚>`V"/ÊkAz®R"‡ß‰7IŒB†©$±¿́›ÉƒL̀Ç<Î!¬7n¡8¾·×´¬•‚ë¢ÛÓÂAË'á8̃HF*›€{L¢)˜E6HÛÂKÆÉtxĐQäz6O/–ÍÄœæỏ<̉× ƒRÔÿ\ĐpE¨û­µ¼fœæHü!¨O¦Åi`Vm®¾ÇÄäP·÷ă_ÿû¿H?"Œ/®3׉52ö”‰ªG,JBö37«9wă§´'`LºDX†qqa€ẬŸÏă\›z;°€ÿj‚p ̀)É”* c-ç|J Qe·‰ûDûxùC» ¹™E6Å£Ë!@`©qö¥p‡°ùùéÏ Îá+4p±ÊÙƠ3̉’<νáü´u:̃&í¡ƠƃÙ¨†Ù(^Æ¿gưjÑ¢,uØ_­µ£øçYËáëR©0BÈ—­2ƯZá¹jÛJQÅgsr‚tù²R%ÆuDµÇ@T½B˜g©³cMơ²U·$J]~—ux­₫ì_J†‰L•<)ưI ë kŸ/¨ µvÖk~`áÊp2úæ¼€/Ç}í@œ3›YzÙĐ-£.4’Vè?B$Y'cÏjxlÇÍŨE²@¸Âă"og1äp”GĐ?8Úz5Z´ôrđïĐÛ¿å|‡y²‘ †]tK)Í^ ̣WUo‡ÄÖÿY Q­©ê¾íÅî`ôz½>??_¯W­F]™̣ëm§²öĐÉL¥·ïû₫øÇëợÓÏ?øø :.kÓ55éúåØwŸYlÀ€¶c¥ă}Tr9ùvØư³ú‚R¥đPă—3ß׌áiĐ£®>€₫EÖư‹:£í½½"øªm"RAD=K‡§µSm‹øÈ~ô$?«J>@Éú³nôÑï÷ûÛÛ›Gü{X¾°a6̀ơÍl_5́W±oe8t‹ôÉtaÏ h«Ü ímîĐ̉}ßön=:oĂ â›…pGÜ*!XV„ơàxªºí›Ç§v;?i¸y`¨₫d³'HâZ‘IUó©¹RùâB…0¯\}…ØD\ü|å2'Rµå“<-úƒ__*„"]¢ÿGêôu¸̉ṕ„äĐĐí«¢ÖÈ0bpà΄Hx°H“ơ05‘èhÛG_¡¶†;È7X×®ª æb­ṬÔ8ÎWœ"‘C²”0£÷Ê8b±v́ÜàU+T7²œ¥÷1°˜VªÔ£Ô°éœ«Ÿ8Qøf„X8éè*3¦™v€)¼è‘·Å[CCeF€Hú„‘ă@4̃ö£QÂaÅ—ơR«å|XÆ´đzí²%\‡áăç²ëDƱäZơÚ™vƠ$¹1Û—ëå²_^ß^—đ(–ºàQÎ|™‰˜¶Áê»ù¦ëÖKqñ®ôy ™gÀ/È₫îNr ¿ÓonE,›7Ó%ÙÔ©ï_UË2b¾ˆf…MΧ/Îèâ-}8^LUb4}#Z‡º2±a];XßhÔ móÑÔ©È{jÖ̉u5æ§gÄ_œd¬v•€5ÅÚÆçÖéI…»Æ&ÀZsø(lcb÷€„x‰IKY*P΀b™´9¬‹ Bẹ̀ªêz̃²ëS5]JN•ϯy°5½|ír³₫_®dbaÊ£XnE,‡´suÉ“%(@ÇFäOöọ̣̈}H:2³ûư"?áår×7±qÍ ¬ï:0̉ưIæ"—ÜúG+¨mÛ< åút}~z̃/»os8̣pÿÛưv?îá:cúÀÈɰ!b½÷ă¸úWAO™V¥~,„hgifÁ‚Ó‘ {&~q¬½½‰fè&Ôă —D±ª$w̉´é¦(µíQ5®ƒ÷÷˜,§)¿¶ä$Ă® aûí»÷÷ơÊ<á‘î1óeO‚qÈBŸ¸`m=)G '8i²ĐùuOöu‹î~¿;̀ÆÙ₫Ơ,́Ñ:û¿ư×nñÄM‹uuZ°’N$̉=£€Œ]wë­ăˆv­{¡«¾÷ÑGÛÛècÛ·ml[Ûv‹”€¨À*Ï„ 2ƒGXk%c¹ÉÈđ¿ úaDJ²gêè˜éá„øcŒ¾đúà&…4đ¢²ÂR®$(iäI`” †áù+NcWEN­3/ơ,X(ŒÙ«sñ́`• `iÑK9»Ñ%@Å,̣¸:êyê‚‹Ie¨7Ư!('8\C3½\/—륵6îQ6=#aˆ†â¤û0%I2ÇbÂ-_z`5±#~>êdž9#^«œ;6²Sd•·ĩ®ŸÿÉdÀ úú¨O°F)©†ÜJç :ÔøîÑÿp̃@Å+ÿ`£InÅØ¼5² âkêi6agN“okbe¡I¾ñd.—¿ `üdr³Sä´¯S³N« .-—µµöîƯ»§§§1ÆkµŒ(óMÁ°H>Sơ"‚=Î#Q°ÍAZDn‚;díÂÊÚ‘i¾cTIWÉo|́´8ƒÖgo:±¾Éµ/²Íövá×´½ñ퀉TëÆñ!c ‰„³süÏ"`Ǿ“2'Ñb7År‘‡ú¤îP^釈÷yü-̣'°/)üÊ,'2Ç}‚̀‚¡øµs¾¸¥ÏO™÷5Œ\ÓÚJ,B:ư›v¿Âưóùpÿ¿ÁXEK§M–'êUäƠ°É6Cç,æ×đú¡Aøá­[ËÎ1£XR¤ˆ ("‹(‡₫/À‘‘å²!EưÆ[êAƠ‰₫¯×ç§g@ú́ÇƯÿ»ß{ö³]-v,™¦yy—>ˆÈ§ÏŸ~Äí$¸d )™ơ ÄâC3÷ ôôĐ×6J«à•÷ÙÓÔ39™ÀHñ­́ăT²dZå 34xO×đ%“`óFA‚ë f~­L¯då#ÑÂ;ïÑYyP$ÉT ¥x!¿í22g-€ó<–˜ ̣qé:đèÇívCÁ¢ú·(‰Ç!"¯vyt̃|íÄy335TˆX4ḱá@Ư:Â{¶¶™™wđˆ Ư[ŒÍ6 ô¿ïcŒmßF‹:¡̃ 8²ß̀¾@÷6…c7º4½´‹ óö ̃Ö@̀S/Ná @·¼ưx[°₫´.&p(?W‘_Hâ¥øŸÈû9iØï=z²æ¡‹â’6W1‹S±@v̉¤E;X>è́·Ú îZO*(’d‹xŒ&î(#[Æù°)½̀‚•’G3̃Úrøj×ư²¿ÿ潘|¼}ô,€f­mm¿\ÆÑ½(Pê­G…50 nƯêÀ%–•ïô|fûÊṿbÿJ†—®¢’ëâ)­bÁĂl{h}Í~Aóơ £–„₫‚êc”Yÿc4Æ€’/èsÛ½.•  …ù$ó@B%¥…ÀPÆ#î"Zä å‰MüE~đl¬ÇF{Z.Zµv6¥9Nc8Ï$¯µöîùƯÓÓÓ——/ç]̀43¯;¼̉µp§AÖWFNÎ̉#âkÉEJƠçưûu¨·<Ø(N÷4“˜çmß̃¿?Æx{{‹đåy7 \©$®Bûn"₫ç'щIN¥µÓ§áªj÷ñœ½w9ÇÄO{öljʬ+a\;Ÿ¿2 ̃éơ¯‘x÷Á~ŸgûlᇪœCV$£Gdfµ§Ơü³¬µ&Ï7e¿X>¥³c¨Å[IYD¾d娡~OÁ.S9>/J–₫1††UCN€âøieŒÓ–^b}ñlZ fsù«YóG3úßăy'úŸDw ¹jy¶^9U@¹Å₫³¸Ü~aÄ~À9qÿOO^ "f¯£º–ë#/°^lôÑúù'O-废àÔưY·¨jÛÀĂ~ÂÛ “ÅøÄtøN$â@ɼµ¡FCtqơ,¢«¨öÓÚ¶o>¨häÑăÑM) „ ÂრÑ́Á âß[‰u³'ŒƯB],F,|#"ø™Yç³à¢Ưq÷…Ug†1F—(` ?€Ï̀ßÎ8ïÿn}Èđ>»cŒM7jÚĐ. Çđdî£Óó¼(а±m›÷„Ú·Ư pi…*IÓ¯Îi$ÁŒ#qhơ»ï~'&_^¿|úø -„®‘nÚT­¢æ· k eßÑ©{<›ªEÀ<:xÊ™N €5ï(ϬˆÊ˜)Ḳ̌©¢H‰®( øâ-¢8Ø!u»É³ÏÀùØđøîMl˜[tn“ ë Æư4[ëöăT¡0·FØ!Ù‰&Ơ¢,cÛÛ»÷ïF¿₫ú«üy₫æÛo®Ï?|p§ª'}Zf ÆMÊE‹}ñ»¯̀€/…²À™ŸxDDz°¾Ồ$ÅEˆN]xiñ§çü»KŒ ΉâưeR©xIcûa²<ë® «́^7WK2€I$áÄçµâôø12™2ë‰đ˜˜TÊÁˆ½I¸dƯ­2Í9ĂJf O&nÅÙYB´¨µƯCóÔçp|¶¶¤%Ă &Ñ£ĂlùWÊÄ́Yªß2B¨i{O„(qØ+ûN<Ö2iË“Uq™|÷Ưwÿûÿ₫¿ßn·ư×ưđáÔ qÔ;'•¬€V(<"*…kê@î.mÉ;•;†˜Ç=I;›n|t!³ơ±²È ƒHí.\s‘X^qI-FÛ̉c?dÚûË.L&†‰C4¾nÔÎu^úZ;:ƒp;`ÖߦˮWÖé3Ëj̣$01¿¨ưXÙ¬ R¨äàÊX¬Nv8æCs™Í@)¾ÍXºl‚ÀXÓUˆ×‰ëeÆ—! P`-™E¼Gº¡n_¼µ·m»^®Û¶…]4, ú<ºrÓ ^Ø'bëQZ}Û·§ë“£̀ª£Ăû=JÂ#º³QëEØ,³†qf†À’Àư0̉´Ă¹®öƒ,izi+Ù́‚ úô,{éb́IæÇ1¼ØWu€!¨)”zÂ@ Ïv &|²ú¬01nyE¢.· ç_a+w‘¥Â–˜+HOP’9Ó8_W¥ºÈÛ)ÀÍrk…ë,ókỬ ÍZµ†MœÍ½ê–¡.FK!³Ê™)TGR°]ÀB¢„O†y&}³û¡%ÚZ‹#Ñ1ÆËË—Ëvï½c<%GÈµÍ [|A´Ù ëÏ®˜å„«#Ç&Û€-s¢pßOđga¡‘Á¶"V|=¶ ÍÿđĂß|ûíöåËÓó“ư†Vú$ặÀ»ˆHk¬CTûÉ:IéC½^¯ßưî»ÛưöóÏ?ûîƒ'w®3m½÷·û‘×äÏÍ‹́‡×ˆ²₫‹²Ubô.Ôéʼn\8?Qé‘ëæ_!{˜o6$Æê4Û́ÆAZä)[f²pN!0̀ê$Z<´â"§ ér±Ù¶B)$4?ĐaÜĐdưÂ8¦„ó41¾ûƯw[Û^o¯_^¾ø¨÷Ë~Ư¯CÆëë+Ö)aPtE^̀ î—¹.§́•×E„ï4"₫9±0 ÖÚe¿F9úáÙ¢₫1§ùÑû( Yù¡Üü£R.€}߯×ëơzơÈ3;úáÇqÜn7/ É ›¥'-¢bPV! ƒüX%êP‡/¤(ªQÌóŒ¡+* K“r;•X¶†H2ˆ•N˜Çx£¨“àu¶?è`ưÑ¡̣–«©Ÿa£Ëƒ¬¢Ä¿g}´æÑ¿–̃¿GîçÅ´sw“æ'Fχ]Û6EƯA¸Wp̣íG?Æáæt9ú73ÿ¼©«ÿA ö°Dr­Ï-Üd ñœ¥6‰Ê¡»í̃l´±Ën—½÷Ñ÷¶} %`lĂ‹ØF m‘SŸû°ÈDåF ºˆJƯơ…»ŸÂ;¬¢ùÜ%2p0Å”%«{× FꟜúIœÊC/V_Y>S ]MEÅÁÙ£™#o¯TK 2Áÿ¥j…ßB#-›¶"ß#ň¨¶ht‡ƒY#¢F@ÜL‡•ŒÂt̀L/QQkf= ¿ßÂëëëÇO=uÉë!dÑ8úqô#|D^2¨åí̀D&C.&Baµ9:eöá¬öEw¸W5.ĂŸ‡¨«ạ̊ MËú®Î<Œ6á¼IØfäa_)AHªe,d:az™ ôb,‹œçl¸ 9!è 0Đ@{±S˜lj›z¼eæÇo¦´ auî›Î úÎ(dƒ6¾|ùrkÍ[fâ[:{iÏáû“w§×„£N²4Ū•I2[‰|¼ {ÏÎMẠ́€”i4:]衘Œbûüù³üå/o¯­xy§åU›ï¹°>ÛÅ fc“}ß¿ûî»×·×ŸùÛhCü₫÷¿ÿîư§OŸ^₫íe ÿWü,H /„ ¯ëR6Ÿ–UûÛ‚·°6J/êz‘Ạ̊£LŸ#£@SP}'NĐùá¹d‹Ñûơ:§«Œ-ïØ4É z Q"(ø#Rq\²”e<ÿ-ơk†R~Ë»Ë<==í—½₫"Ñđû»ß}÷í7ß¾¾½¾¾¾.—…ªNÊ_2/VÊ/™¨^o¦ÛÖÊ.â†V₫÷}Ê<ic.… 6j¨ª(P&p̉6ơ˜Ç£¨?,À··ƒ=fÉ—‰ï`¨ØñÜ¡813°=Ë€²årVrcBÿu¼²đ”0oœß꽜nÁD¸Ø o„¼î‘Ø/»› ô† ‚¶ ä`Ÿ\C¹.ªºíÛe¿ âߦ, Dü³éc_ʶ>̃¸`Zm^Kg ~k²₫Çqăè½;â/³-éÿ²´u:û%̃ùÄ ‰Hô H†8ªˆ:'í6@Æq6ÜĐ·̃·̃Gï{ßǾ훇Åm´-Œ U-W€!,ÎÛÛÍ‹¡F”•&úW Ô©æÈ na@á1 ÊÍ–VÚÿ!ܔŠkYØ ÿ¥öDQÅ{ú9A·)˵ ŕ•–ƒÙœDn°Bê^”E´ö^n9¡#3ôˆwô¿–aÛØđu{€˜«J^ơG“æAùx¼¼¾x_ïƯ»P½¼¾üơ§¿~~úüúú:úØe÷Đ/4´ZU}~CzÁr-VRA}%óS³­+ÑKçø.‘ ©³x¬ÖÈäƘ¨‚óM-ŸŸ/§]±Ë‰gSv1¶ÏŸ©ï>TK§Ë›’ÀôËÊ2fÂçæ…bEœt­Ó9{̃Îbv–C‹·Z)P¶µ¾³‚!*S¢¯aÜ2D ÷₫·ß~ûûﯿΠ6 Ù/kæỖ+™øÉ6`«@3}n–y῭"»uôÿüü¼m›ÆDŒ®IyÑOdư¢",[+˜ˆ!y"Pï>oÇq˜Ùèă~»ßow£*L>¦É<CD"ÈÇ+=kÓéG¯Ô©|_·‹¢äzü™ôµT_œ#sAÅó+ËcÊö9…À-’T)Œ´ư²_®Q·Hö–yÙ‰B.‰Àư¸»Œù¹\/^ó'rV½XP.Œ ©[ƯV2®“ÔÛÔ2$Ỉºç=ă1¢­X=Âm¬ăŸ¾F9ˆÈTF̣ÿ³fcØØt‹Í<̀Ăàdáèck›'ßoclcÓmli —°Ep´ödáaä|-ö#l'€Eäíí-j₫´ˆ‡ñ)!Ơ´H3"(Êăd¯—›UÂ,c  Ë–́‚ï̀)ª¶@ËN bƒö́@˜Ñ!œ-N-G…ø91Àe ›\3@9jQÊl3ˆº#ú?Â{2âÅĂÁÍ2 (cx¿©Ô¼,M¦Ơ:Ô2̉×¢PDa©¨i·îÄ̃ËëËívó"k>à?¼|~¹́—x1Úöˆ9Ѫʈ§€`–>'[Ûâx üzß0¦ÁvÍ)³́Áíà¶>BeR9Fëæọ́-`AP’‹}[CùJœÏt*Đ·&¹t\˜˜ôƠ›ï‹}èZØ™á/ƽd‹èJ́¦p ¤¡ƒBº…̀aQˬ°8¹–!¥ñU ®Ø³~Ô5£́—ÚFf³yæa”©•ˆú`cxzzº^¯·Û;ØƯîuEid<í<† ”’tm—ưÿéŸÆè₫óŸ~, §b3̣·˜c¼UEÛ¾ÏÚ×fÛæ9oooo®+Ơ‰«Ó]O“?XFâ§çù6îÇưăǯ·×hb¡H±³¾ưöÛï¿ÿ₫ĂÇ!×ëO½?ÊÁ BAOl™dô'ÊI¡t–Ù®Ṕ|qNÙœ6²%€ªÉCSY-̣$E‹$Ç̉Ëô.³ơOºâƒe'“ơüúổ uƠ¨2!˜v¬øJ'C0–¸>Ü\>¦-Æh/eĂ ¾Ữøûáy«ˆđ‘R•8,˜÷­rŸR¯Ô²&:Ô¼ǵ¾ZV÷Ùhºïûó»ç÷ï̃oÛ6z”¯q“#øê†_ŒđîŸICFɪ *:Æeâ]l…{Üÿ•gÎ7(ÖiR¾ZÁ"?¢Z€ñ*ûÚ9BóIFüTC“ˆ¢ï5áîP¨z ‡SC¿l„I`hăÄzµæ”¶54>ĂÀ²µ}C%_Qăßó+üNƯœSQ¯»ïƠ¢¹•Ôm‰ÙIAñ™Ÿ¶G¨äsQñó¸÷Ñ~Ħ“ üûè÷ï«ă&·&p§“¯áÿ ¶_J?׋4ËQÚàđRXƠ+`ë}ômlîƯˆZ{k[;î°È¦[e¼k ÑÁf›§[”¢_L†Œ ['a8ÔlÉ ‡$p?jn®:tåëu08<&U«¯â¨Ëcú0|H©è†1$PZ:F]Ơ˜Öjă¡(s¡¶°µtzLCæGJèÈ™s=%B¡º~ï:Ö ±¸_M.ñÉa‡ LM°„Ao ö|±çæ¡ưăƯ‚-ûçtG‰úZ.NäĐ̉z6ùX»MK,ơo1„:ƠQ:Âfd¿\Ơ``H͸¿̃R}÷îƯïÿ{UưË_₫rÜ «Âm\ ̃Đ€Á´(å”m|b—&°̉ăʤœ*̃º¿Dâ3 e¾|@Èư^¤»Ú¤• ˜Œ183 #Í¢öá¼Úôu:©Ăl2®Á‡EƯTLĐ&åP„ˆù˜tñ×đÅö“}Ù*`„Í;Á/«ƒ" ˆ¤CµĐ?3•— sHêUçö÷Çëëë_~ü‹W„‡ƯtLJ̀́—Ÿñè¬3QR؈ÿÎÎ1^;́ÇéøX|k8ÂÙ‡™4Q{ dæX–:`¼¸́\¶í!“ÆƠŸ9Ç,1ñª øFq"QçÔÆa1ø%9b7æ||ra.£CN¦Lß_,ñ¹zŒ!ú|µ>êÀ˜HbŒ˜|úüÉ̀|oúÅÿüç?ÿø×û±@ÿR§ªW#+æ",˜1%æ*ÍàqUá;Ÿ""û¾¿{÷ι3“!îeu| ñ€—ôÙw‹ùS++ylÛöîƯ»ªǿ¾…ßîØ´ºF`9hQ|K¬O^ÖK ËàW‹ä¢ Ûwx„P¹'6Z lœö©ơ.™́@~köÁÆæma®I&"Û›E‡¬̀ñŬFl9µ&ÓŒû÷Ëår}ºzĐơ[h[ư¸÷ûƯlê(:Y₫M–ÛÚs¨’´¡{CĐüf­5oÍ©hÍ -µD=ÍU-[¡é¤ñy¸¼“Í3ßÔ„qMQÉɉ+åŸ`á™®f•®0­¥ñM¾cD’˜NÆ̃Ú !̀ÂJdY á%ädŒ₫éăGoéRÛđaKú‹˜!^6ËĂIàyằKÖW`8eUêô-DôƯĐâZøp¡ÿ!(Ê|׫¶abÇ8î¯÷(ùïPë̃†?ÿ÷?ÿuÿë§OŸ&cơ7ä!—oÙnSz2øSa5¶•öÖ+l6ÄÈ•}xđ?~@xæÂÄ%»àÅç°½å xÎ@ÄNb¤KP+‰ëY*ê:ÔŒ?Â‹ß âỲ—XˆVc3µD…/{6€OCBÙÇÛÛ ¢åwưúú:Ù~ç‰ơÏ'ÈÔùKæ,ÛŒB±€÷dă‹½@ôÏmÛŸŸƒ<‘¦^Ú®ñ"¤fÚ¢ŸT:ZKïcóËHƠ°Ï! oåeû¹á†LèP>*5¡“°öö±̃7¾ÂI½d¸îÏä IíD̉Ï"ƤÎÜÙ&öȲM樰¡7u" 0Y±yÓWÑâÎA_¯n ´­íÛ.*£ă~=Đ¯±u“®8íµÅcà€̃)Qúñ;n±Ö2udƒà×i[óDVRƠÑ£÷³ Éßgxê€[ØăÔu…mt3ó>aÑ987y|ÈK|Jó́UÏVví1?cxơ¨§wOøÓö§¿₫ơ¯··Û̃ö>úÖ¶± Ç÷(» &fYëT†/"£M·p̀<'v˜³ë©’7NÑ3 7ôxl̀“-M2R^3_Y”|:ËÜÂA‘–ª•fÑI×ß²Ä)Ả z£y¤\‚̉’§²<Ô}̣²E”gS<èS“ Í*đ( +iÍ6Û /&~hˆÇ¢¨u'@/2̃U¶üC_SyáoưB…’˜¬“`01ßä. –=i+Ø]¶¼É™åăTÖpø^ÄNd÷èGƠi :h„غ,ù»ÿ†7:ï"OQ(¸–đPeƒ9/¶çò[•üwÙVĐû<¦ÛyT5»f"â₫IfC¡iXZ¦w¥Â„P½ªÀ´Øññ×_Ñï÷;.rFon·/6jÍƠ#9́W\đ–23[æª>Ï–tI¨”îN˜È~\ií³Ä'b€åiÍÉÅy‚làZ5oFo£Y¸fú¹e܉DOß÷'÷ f%Ư£B)§ „£¥…^†;­ç₫Ø"ăV‘]äÍÂ7¢%)##¢•ú^hÑNø4-A¾‚>|ËÿFØjNÿ́˜ĐXP­|J˺?jL)áøœ“t^OŸa™JJL̃̃̃~₫égQ9úĂa>i¸St₫̣H<±¨4å€,~bºüßô$¬ÓDA°WN(=+t"x L€cz¯W¨)^·̀ߘÜqÉ6éẸ́Ơ9׳䂽Jo®ă„T&X’ă‡ªa*AÄ̀̃n·Î¹­ eŒ“¤?§—ƒ°Ë\Is“³ ₫E»qΆd‡ lÆm%Zl_ÍÀnÂûhR0ÅĂÄ•Tƒ2đ_¯æ4Ï“Ơáü`¼³J̀’¤ä„ñˆóf/£Ơœ? d̀î₫º́Wˆ ¥Äßêso«l¯·0Ëù3d!y¬»æi)qJœWº‘₫2ß¿́¾‚ơÂå?óoÉ)fÉsỊ̈WO₫4PÓ·tº6@. t—tÇÚ?¡%óC3ê˜ÄjFk¦{Ax<€$¸S1c¨e!i¸G¿‚㤷Å9>ƒ®(’¥'Qo'>,#¢̉½îib‹¤Ï Ơ¨A ñ<÷ï>„Îⶆ­çkÇüĐ—C³[ȤÁæçJÉ3¥Á1ùEFUµëôÏ\-›î²T1áuèGGZVn³=??ïÛî×¹\.ïß1>₫|{»ơÑWAÑeáBF#^ä\áæ¡-ăæÀq·ûív»y*‹Óü₫®{c"â_"Z²i”‚}º>y¾ïqooo÷û=²4S¨₫`Û¶ÿôÿđÿù?ÿÏÖÚÿơư_ÿüÏÿ́çùa(94¤is¸éŒ ÇE¢°FÙPk¦Mu×ËơrÜ6 >}øé—¿nº}|ùøúöÊèßíăh¼mÍ[“p¶¿k‹JØÈ<¡ÍµRÛ›­/„ª®u舭¥älª™p.2¯cöø-ñ•‰ÊÅ-`0%SÜ€U\uè)O9µ&ï4U)Å¢;UÁñ¹́©ÏÏÔzZê´(@F~CÍùq8^£aêP ’bœY:¦TU«v ÖL4"₫qàiÏm†·h-ƠX>fH^Ͳ“€P (đ3_‘ÎÍúE>G¹|£̀yl˜”Ă ÷DL?j‚4‰Uª—çœ LF Œ“ă8>₫¬- ”sByuüͽ£é.÷ÜH ¦w †­U;0¥¢1“Y’Ă._Ö2–Nn³ "R‹ \2Â߸ٶ œµ0Âñơ@«9©e…mO•  :æ̃¬«iÉê²Ñ u-ăß̀ơ>VH·`:̀›‘Ọ́›‰_—Ï,”jÉ˰ëŸp¼¾‚=Î^2..LppJXNë,/†Äíđg|HÛ¶ưÀ6äÆ|«ËK¦F“åÀR(¶ă†åó“0k}}"XÔéÁ§¿[ î2ù)9LÛOÆ̀ ßƠZ¯2êl^ʘÆF +…-”3ĂsÄ]™¥̀2öl,üÉë…I¸\æbÿeÅ‘₫Œµhq¢! @¸̣&}W¸Û:­¬‡†cé-É‹ư²_.—­mMz#¦m×]Ø åèß;h¹[ ¯_5jœUtØ£ÍÁívs¤ˆ‰¹ƯoK+oŸ©„?ùdó"÷,îÉĨ,éCÚöMTúÑ—p/C Á¼áD‚̉Cm%É›s‚1l6 9:ר¡ø#mÂôD1W"â%Œ.Ûe¿́O×§ççgo¥,&—Ëåéú¤¢o¯o·ûÍKZk£0“̣O»KY`̣Ÿ}t ¿h÷~¿ßî7÷2‡3ư- ÜŸñ?® Ú̃®ûu¿́—ư²mÛăííí¸èÆïßçx~~₫ÓŸ₫Ô¶íưû÷^ïk†lydHøq<ǵ ₫† iDψ¶79Äor×}Œñoùó°¾·ưă§÷ûư²]¼_ضm-à>²H,nU_ehü©À-KÓx»©nZuÍG@:ĐöạJ¸ª#o¾à’¼KL¦NUÀV&i0ÀÓ&«€H4ă₫Ú÷l΀S9vOÆuæ¬3Âp (¸dfí ¸‡Đ7¦ăÙ]=ÓˆhxË6™̣ͦM.Ç×´4‹M"а•3Á·j§̀ Ơm:¼}éK§(3}3ñ‡ͬM)Đq;&M…»#maø’`[¡ŸùÊú›ºƒ™† îŸ? â;WZ•ÈHC•_£Q̀ư*®ûDÄF®W™ ­K÷8½p»© eêûènêđ~è &=³¾2Ç'ËÈAw \ơXœWgÚËB³i'„q Á#¹$|æ°å·J.ràHÓE›ưû§…_˜¬‚sèÙJ•<̣0Yù¹ä&đâüC̀øI4Ʀ cÿJ#ÉÄ™¼àj}YßCè,â)zà½̀ûR>,PM¸L•™?æKW¤,s>ưÿ=y_Ë;´åCΉæ×®\[ÉÉ6ù1|eFók̉•6̀‚Ưk¥(ßTdZ_I7Ḳ,5?|^¬÷yrÎ0l₫Œă¯£AÛ̉äk±ÙÊW@?±ÈŒ$úŸh8UÍ‘{Û@ÊÜÚ¦¦ˆd«R3ÙV c[+5‰£U 93»Ưn†‡é} ÷¹æv]¨os4?ºwúï2# ×\¨œVlÂ(«/Ö‹Ÿy”€7‘,=xnô`k̀ÛÄ#ơ[k?~„ù±p£XeB·}ߢ“ÚơzơP7·<†ÅÛ) àªD–ÀGG—âgy»Y÷¬¬_³nÑáëvܼuCù!~wd^‡‹™ư#Vf!21êpWư{B€̀́öööë‡[kˆLư­Ï‹I¢ºà‰‡EN§×oY]ÛkËè£ßÇ=z2·±ë₫ăO?~üôñr¹ô£;¿µhàôÿ6¶ml̃€¶±Q¨Ó̉, †hÎ{­TE ̣;T•I`ư\́đ‹j pâæé̃8&ÚLê|…E »W`kÁ' Öp³†\CåĐmSÏÄơ©öÛö;ư<°85ë8Á´ÇC¸ ơë‹Ê&[ḷ&"²-œ?Nù¨ÙàëË–Îcà< KM†lm [¢­­FḾ #ʾƠ=Euáº&ăMWqæ₫ ¹ª ‰yT¢;ؼ:g &̃lr•˜ˆÈe¿¸ó®¾€•‚3¼¨ÛgÈÍÏĂföE²†eeObFáŸa*Ô/AAîó‹¡‘&y~âỹÖ¦RZ˰±³1FcÑü2™3]½bY’0i±§Æ 2TÖư8GJ,KÉ~Éä#ªEoy!¦©đïÖ‹H!àë¨./<ËóyNÖ)‚áD~‰ă*“'ÓôơÑDqC̀Å úÂĂ‘<»ë¢s¹ƠùN§yăi±J-XÁñâz]vSǛl ¾¾¸x´~è´J½p¼Méǯ¨£‡Ó•"½8¸„ḍüÖĂ]³¾w\rdö©P{üˆp^n[ưá̉/«̀kt6Éđ¼°₫Œ₫áÆ Våer‹¥ —å·²b yH̉´íÛîl}³æ‰‘ÎΪ¨çÓÂíàÍeÑm*ˆÅYÛúo §©AĐöG ÿÉŒ·(̣ă«ăps úw€Ø9ôІÄd·Ë8ú!‹`C¥Đÿ¼é„QMrO,̉‹l&ѯ|,5ÏÓÓÓ·ß~«ª?~4 ‹X,ó*îTÍ]Ú¾í̃:úz½zâ¬lÛ¶Ë~cÜn7Ï©ÀƯYfN>0À-¬5lg>7£ë9:˰aîi9úq¿ßßîo÷û= 0ôö’x!¯{̃¢Àÿ¶o6fĂzï^˜Èƒ>JPÉQÿwÇqüë¿₫ëëÛÛơrùơ×_ƒ₫Ÿöêˆb;á"½îFóW¶ûư₫E¿Œ1¾|ùâÑ›l¦6îăvÜÜVF Qo°­·¾oû>öhĐFk‘́Nÿà‡¦Đ˜Đ ¥—ÓKæ †ź «ZF’ˆ q,°ƒ+ôÿ‘” G;}̃(Đ“l°­́O×ơ²îörÜ€̀Wwwx1PtđÜÍ̀¯r>€Ơ¥› `åùñ[%≧8ẓî_l̉­ûZ4É1阦E+O &?³J*́”!Üij®¥Ú ]wÙ»V¬nå*)(3ºåpL탟°ÇڹѕC‰ŒØÂ^V? •„bSøÖÓóÓ¾í¯¯¯ưµ ¢M|´­jÀM†ŸÚ˜‘ÇÊZ=øu¸kM£u±óúˆåkÚ¬[Mp’Y¦DµY™’°á2Ö‹Ô%Œ.¼9—–­A˜(¤Dœ²²*ˈ%6vƯ}¨ ăÈ6ÛáKÜy=B–9÷Ü¿ ös0°;îQPx`̀mÂÈœ¼(ÿ₫ •ï+~wÔë®</sü0î8!gÓ¨ 0ÚæØ³üW¨x<ë>Ư.}Ô*ämIÍ»xÍÅ¢‡eMdfy[M„ø₫ß̉§©>ƒOrH̃¢áIdžÑ´̉S4÷¡ôpL®óKçpS~»|rUKº fçlÍaœÅñ£6ü)%€÷&̀6*‹ëºLpË´uk3Ϋ•’ùêÁªÑ£²§N_äeTVÎêÖ¶ư²;¤.J;£É½§ªnº]÷ëơr“ă~ Å₫•á=#yzÔµ„^¢)Ïúǧ̀5G•ûÄbEOU ư3́è?0 =Q4́˜¨«S_HßA#û™&£0Ù Ó₫$Ÿù¤¸è¿Ëạ̊üü<2HuZ>Ù­¤Çɾûî3ûơruèï~½^Eäíí ¥ŸU9H\ÆúP³,CY$HME‰Ïûííöæ-~áÉñÏôO'@˜6oK¼o{Ûˆ÷¨óĂwæGr1~ ü}U€̃̃̃~₫é'UÅƠÿæ£ö6SYFM¤Éư¸£ ¢MZƯqªă₫½í]»WrëgkÛ̃vï"¼ÍßÚÛ̀`G l’Z(ÙVªS$\`4d´¡¦₫·à~Ú „ṢÍEN$+”63.P¯ªk±TĂ¿¡¿F—Á̀ ü}I$£c€HơF€*ñÁWE +ÄVè“r—10_µøÉ́(´]‹óiëVÆÆ)ư·8×< ML7UÑ>º‡lùÿÊ¢í_™#: üi”rJ ªß_N b61oGê@Ë8Ư¤a? ÖQÈ8;j*M> _D¨¦üä’UÑrënR©VØ4…À/y8W˜3A+ *äú(’L$kS·ê=́^‘ µƺ:́Ö3›,-pE`̃ë̀î³=¸¯H¼Íüª˜̉ªj¡Ơׯ”óœéQ;=Ëóó†èT́ sÿ”2ó}ñáF|¢ J̀9[›eöx‚₫¨ï®L!ÿ@éIäđ@¥u„óø"GÁ»Åüf9´ø9Xxå,Wuă“đ̉Ó .̃0f‹Ï–À“À—̀ås{~EÿTŒAjIÎÙ$`&âĂÎ –ê]½ ‹áºˆ4/n~¿Ü8`vy5±ˆơ"T·UX–ÏúĐ£¡Ơ%R]¼IAçY“…㱂 øÙrkUóÇ“qóZ«E±\¶~>OUUEÖ=LV§ÿ/ÛÅăö¶_/×§Ë“xר̀Bt”AÿZ‰Y˜s€ú‡É§Y¨'Ûóö2¤i¥¦h2"é®…Ú zTØWÇXÄz¡íÏȽ<—ˆ…q[b¶°'Äø—ÏÎm£ÅÆüçh“ûư₫ùóç1Læz9ñW5,¸×eküă«àWÛÛ^pEœ‡y‡V~‚œj7«°}D ?2}ï÷»×÷Œdß~x­|ó:?™̣ëA’M›n‘Dî‘đ&v¿ßGt^ -$Ư‰¨Ïô÷O §lô¿ùE0{Ʊ…lØĐ1ltíîü2niQ ¢YC¯€M°µ- †mßv2¶á¥s[k½udÁjzyJwÏ &&dƠÚÈ‘x*­Iđë#<̀C[¤Q†ÄS1ŸbÈ¢]œ\Ëđ€’!p)Éô»é 6;ÇÙGµf:"âßg¥]<Ă…8¢;²̃v5„uXm¿€ÑEq“ÔÀ‚MdÈ&Ñ <Â`ZÄp$)¸œÁØù!r2~øăß}ûƯq;~úñ'/hP䥕Z—¹6>­gJoŒpv2“ÏÉL›IV5$“0×]p/a ¼¢sr‚_b£Ga/#—(‹Dœ‚L·Èü¼xBBqy€ ú¡rpxB°²FFCïàKé?îtJë1l‚w“ $úpTç}*D*ăyÙËM¥0/ÅâeyN ́ ·NÙ¤×G]Ë'N•¿N@ψÿa<́…£ùY™S<™és9#~¾æi)èT7V|ËơO˜ñTGˆ™`€ZĐÆ’Lö2! '`ü×üÎ8?Xó‰ƒia€r̃;ÅKm.̃e ”¯́µi-Xº×(pcQ¶§/èz¬̀µÿ₫7XÙÅ–&ÓJë²f©`)Hư|·* Ნ‘­’›x¾×馥W%́¸çÿ¼jªHưtô_}æ)‚u±¼~Äơ¤ĂDhΦí²_ư;b¹î×§ư©i‹ÈơÙt‹”µƠ¶mÁY8ù>‚B#‚˜%É:=q_Eóç*”y`•`ÊÔ>)®Ă­¾Ü°aû,FèđQàw%Sœ|>̣Øc€uă°~X„„h»·×·~tÔ—÷ Ö| £+*)yøVJ˜̃ï®Æ“ŒÁĂ3f^‡… ôÏĐ?JûßÛqë½GÄÿè(óÏ₫q#Ñ‘ 5ÑhnÀµÑ&ºÂÿØßỨï…₫µH&E–çK>)ªÊÜjhÆưG%=ø~BäÀ66 ú[ï}ßv7đŸ£Ày eØîœ… |p,ŸW²:t#@H$âX°ÆP¤ZçÊDöËc‰göå<₫gø1,̉ØQIi^ÍB+M̀l´yNYy™v ÑJ¸ºœÁ0Đ, ¥?u@²Ùa7^C¼¯76ŸvˆÖ]û`âÜ6?üé‡üOÿøë‡ưé¯ÑÂÇ Mq[̉Æt„¨V V[ÇôL®«C¸¿[F´F˜‰ñ¢̉ỳ…ù2¼›ØívSU/́p̃P¾Üˆ)\8Ec%ó ÂÖér¢‚În–9å_wDh´›Đ¨.…̣»0B÷eQƠü'l&È™];?¾êû¢m5‰ÁJO‘0XS ‡]áÈßÿ˜ÈÔ¹JÎ=¶–ϬV"^±Óë)HÖÇ‚. ²çÇÑF«đëGV“UµlÊf–Ü‘÷º8ưg&™fûQè¿XÓ°ëjJ ƯJ80(v\aFË÷È,] o¶–'i{„ùØ9À˃!:Í—ZÍ ,"Å.>S¬ö&«‹‡´Ñô±Gº÷¡© ä‰zh.N¯¤¤ñK¤ø̉Ăb!ĐíŸưH₫ Ë4–mÖÔS±ôˆøR2Îj9ÖÖß‹À,ºÔâ +óÅK©Âđwâ₫wBÿ×§}Ûư«¨·øE²o|1ăpzï•ï~‡´a$ÏŒ1á{:øL*ĐŸKưT; ÖËñ27+â†Ü=UKpv¸-»RH_±ˆNh~qP§‹₫,äLè]¥r¿ßû᫈…Öܼ́m›‡íÛ®M,x‡¬v:‹¨{JAÛsÓå‰J‘ˆĐ¹0¸\ú§ĂÆ{{Ưï÷ÛưæÍ¢¢?…ư æÇº"—Üï$fƯ¢ Ô”Æ`ơ‹Ú¬aÈư €ÿđ¾!î/•Â¥FƯ5i·îa Ă«XcŒ6zë£È ЬÔ6/´oûĐá–€m†nlNÇ6*µáóđsëÁ0Àw¼.Ơ6· ‚sÁ4å™…xQÔ»»¥`õ¹ Ëđgf=l>W¸´b4™".¿̀ Ö¶¬̣©q)_ èuè!àc@21ïy˜Î4 !q}Á*^<¨¢„OçÓóÓó»÷ï^ooÅXHœƠ~ØĂÓ¢øXIû­œbiJ•S)Ñ?&¹lh!G9±lÚ)Z0RêŒ2Vg*Ÿ:.¯¯¯“2Êp#¡<÷â(“°ä#$}™9Äz•`ø>’Hîç¦{hÑÿ[ê.Í'9ÎúKS}6¤Á_Ùœôÿ´ỰœöÅí£G-m%j‡`,=óiGŸXlh†.Lî\z̃Dªs.rFO•»‰ef¡QO™üÊ„ÉtĂn‘uÉư%2EúÖ?­ÜÜEQ¦²ñü(@*ơÈĐH‚¸rQ„¿b̉Q»•G¾¾4‡ÓF»Eñ6,Ø•*ÊLÿ¼¡ÔQ ¶‘¡*ÔEFoó8! x^ZH¦™gˆ LO™l²‡1„8¿˜¿€)H¯đ“ ôç¿dÀΜ$Đ|xL¡MÓ6‰•€¡ÔW*¬ë¼öùư~ïG7ªøk‘WÀúÖzå?'C§X \ƒeH‹÷¿¸oûu¿^÷+‚ư;"DÅɰ:,œ̉^üÇÛmEŒ8‘¾ l₫–—D@?êÈfñê¹!¨·‘€̃»e$pqúZÁ³ÚălÏ…́à³̉¾h œYg´Hà¢QèäS¯XÿüÅ|œơŸÖW̉ l ‹̉¶æl—÷@3ß³S,SüV."Đvù[F^–Đßq¿÷÷í—ơ41ïˆå~?Dô/"°y¿°´`8åK¶Éÿ+er …”…#93Is aĂƒ¹́Uaô~ÉkÂ&#WĐÚkÎưZ¸¢®.º£–¡´Î¼ü­â§G>ÿ3Oë,5Æ£̣P‰’U óØt³“vÓiWŸqÛd¾çV¦^ÇáÊ«Ï5}uRú‹í¡ªooo~ươ×_=úq>ê&²Ÿ8˜uffè¯ÙB¸qΕL¦º¨$Ü‹Ở×4®¢LVÁĂ yü­ẺVæ w°ç‡,‰J³=@Ÿăƒ²~wßé²S £¯è\§ ,a?w ĐñAƠ¤Í«tƒÎ9ṣèóTQé@Đ₫JÁg€Ú²JË–¤¸ eÛ$ ËVbœ4™+’!y å©C¤P£¥¸Ú̀¼Vµß́æ™,\‘†$¹‘ù“ÅăÄàl“đƒƒ₫ëî¤tu¢ÈÖ BHúªNÚtŒ 'Sö¤uÁkÊiGK–ƒÔÜm¿ûîwß}÷ƯÖ¶£*%W%ùOሳ9ÿ²üLɦlQhP†5H̉9Â:́d”b³.b+E$̃/çïư‡²]J`‰›’:KZ°ˆtæB!N0‰!–“̃f•KÑVP è®uÖo₫Öårùß₫×ÿí?üpÇíí†9/= ‘›5I)y[UÓ„#sHü•‰¶Ö.Ûår¹<].ÛE›^·ëû÷ï÷Ưï̃¿{ï2uMÚ¦^âÓö¦¢ˆạ́ iiDVmô#GưøX ưgj)ŒË|S˜ÓÑ—É̀ăªê¶o\àè߯€XÿXÓAh,:–X†ËQ‚wËñ‚ÁfŸG³6f¸5­‘ªCp$ẂÑ+y÷LÙ}Û#âKôkÓ¦ÑwÙƒGömÛ6U}xÜÁrV.ÁM ¿¸(%oäBÀó́jïêå£Ë²E|¿ÇưvxÑÏ0ÑYb›ªhïØ |º‰×ÚJ{ƒ“¹áÉÙ¯=û©ù±ïû»wïzï^‘T₫(>cT8z Q8ÍàcµRGM¡=nn}×}ÈØ, èzr°íÛîîË›ÅTZ€íÑX¡₫²£̀ë]SDđ½hô Î; ù“çwÏû¾ßûË—%ÁV]W½}2t;¼đËhfM¤¥04ª‚ú_q—…O—×¾ŒD̀&^¢12E¼‚g6 đègr·Lz?|Hr>9¬2®"ȵC3¶iT噌êÂ2 ôøå×_^__cu‹˜Ç8$#Lq&›ô N€Q‹ÚT„Íơ|Ñ‘M!Ú”³ËçetªWS&\~\…­J± ø ?Ά ^ẵU“r2´d>ơÙT É"*Q“ÎÆèC²XÅ)#¶­IÙ̀"¾Àº{ FlsŒ£ơäÍʸ2Kœâ,ƒ₫=Ñ_–h„³»â ôơ9Đ%?³>úÖ7¯ŸP—:É!ËÀräë?¼‘EyeÏöẠ̀áÓ}å6ñ®¿ñ7̀ÎǾüáë³y0ßfy½R&!3Ë qͨ!87!)B'zÆ‹’¾¾pđ„œ‰í²Ux̃5iüüÊdT‹>===?=1ôË Im&ŒË9I?a<½Œáá—utr¿Èß|¤:…Ò®æ‡BÂB>qgçÏÀ¥¶èáSÔ@…!-“¶Püdùʶmïß½¿>]/ÛÅ0¶¾„};i  ̉ÎRƯ!Î/z‘«7N¤Ͱ%2}÷+*Élºí{x.—Ëm»E)Ëv¹#Ư¿Cºd0¿ÛPÄFaÂa ¿™çW‡«|±å ªI–&Ù B·¦M=0= jÄ̀¾ª]bHö@™/B;½2ÓC, ëlËôIHEK{™̣½í†·„™²f¡ç{f°ÏÄó3, ZåmKØf‘3mà;2´ÇÑ#æÇă₫Ư¾u‘qXÔùq£ 迬_Ñê æ¾p«»t³¤a †WHLDöK»˜Ù!Ç’;R¢ßÚóóó₫Ïÿùííí—_~ùå—_ä́½ ª Ê*đÆU–ÁY‘¦jVzΈ ñĂ<óẃ¶;Ê÷B@[Û¼<è°±o»ç xÎÂOS”3âØ3à‡PüsTăOTQg8´‰¨h×b«¼{~÷îư»×·×/_¾è̉B8Ÿ,ûÁdÊF}0‡^PU«m¡ƒ́HS–„\”‹éẶ†‚CS¶a¦‘å™íèPAH5¼laFÓm©@Ïg´hY·3d“Í7³§ „~™mQụ̂åËëë«f³…E˜2$I)G‘Lœ€™QÑ]÷µB]Ö¥Ys35¢`§ºÛêg%…ÓWO¡ÿÉL‡èĂ-“¿Å§8ƒÑŤ|üX¼4LÉ«lm #¶»qy#%„Yå…ü]íùaæ.ălÿ–¡ÓÍÜÚđ(EôËB$埡°öƯÍûqP—Ç\ú ­Ögµsf¦$ó}´pÆëN«7¹ qHDeØñ•rO ØzŒÿ¿&Œaœ°₫hơÈW^$®6Næ¡Q·_¿BÔ D?§Ô}!Œù²"xî3†̉a®*wø³D÷¨äh]$d ;öJ™x¸6¿89Êê«"| :Ü ¸ü\›à₫BóË£ư{¶RjáX`2ªp+6ÇL?¦G,ë̉“åm ‡÷°€ŸpÀY>´T4P;9̣te9+‡¼¾¾ÇqÜÍơ“Ẁ}›BĂkùˆ{±Î̃Œư fC̀ÖÚ®ûe¿\/×ËvqĐæ±@Nö«è¾í̃ ¬°d`X”†̀êGsd•T­ªï̃½Ûöív¿Ư?ß̣ƒ₫§4€̣¤₫„s@T¶}sJÑăR¢C-%êÄH´ [G­đÅ”äX)̉,̃‡ëÏJØä$ø+‹Ë ¹á`.?t¼†åSRUU@ÿbEü›á‹“̃ ß”»n\íGø¬™¹1à@ɾó3fâ?“}Q5¥küÇÑ,L̉CSª¥£¸̃«Ë@,€E`!°ûu»sî:Ê‹ăưû÷ÿå¿ü—Ï//ÿü_ÿëÿÀV•¢O.Đ_1±H3µ¨XïB¦‰6ÈÔy›E± Jn}·¤uùđpQA)đ±ËA´´ÏN®ÓH"›ˆIṬ"¡Í$k ¹₫½Äï¦2ôkÑ™8eƠ,[ỎbÍ]Rđđ_Œ ’Ùàư›¤̣Ö]/bú/^ÚÅưh.½¿¡Ê5‹ ™ˆ[ÔÂ/Ÿ……¢" ü+ÑĂP…¡Ñd„iÁZªs¡¦üoQG83çsQU‡Œfá»@ôÿ̀ă>¿¾́—//_̃ú[]É•rËÆ‡äñäsë˜ßÈ›N;Óª ¢Đ™̀s¨]!.RY†́»,9Ñ”s3ă|D(w ¾ÎQÔ†̉đíøüWú¯H¡Ê $0ÄùA13Bnâ:°…æ*Å>œ›v¹NE—Wñê9V>6N“fY+ŒZhÁV‹Ë&ụ̈Tœƒ¦ËKŒ§1><Œ'¼ê"^%/…O|4Z—e5—E¤H Æñ,:wøBOÏ$sÿËn}ø¤‚’BƠlđ ®Æà“È8d9E‘-êdØ̉<È'}ú/úߦÿ¹̉s(å)¿Úô²_¶};úá5ïQ«>÷ºálÅkJ>@vâ-`ø|‹½:B.v©à¡É_D¢Đ¼ÇvˆFMÏ}GCe|½Øt+‹}÷wÂǰYÓb#ëEæ&S”a…£°Ÿûq÷ú÷ă~?î=(C2†FÙ%b¦Á<`mđñ=Í•ªfN£o%o[3Í̉²™í—vqØƯ­;€*H¦™o­íûÿ´¤á€,J¢#¡-³Ä8&”₫̀$¹~}xŸ§êzEQÏömp¹^\MŒ>¢m°}Ûưk£9Z]Â4s –ñ) ƒO³#˜¸ËbÔ‰«ªî ø̣å‹Ç̉ƠZ. Ảk—·Ä$,\¶ «̣íl ؃˜®É:Ïø4 PïE•EÙ`Z€V÷trˆªzs:̃Ø<´%S;bÜI"8ùZ%‰Ä¸(3>H˜IÏ–©èhkEóxw›Â¡µq!離îƠq»ÎĂ¢Đªƒ]DuS̉mÛÚ~ÙÛÖp€ñ™¿À1-r`÷ ÀâVÉ ÀĐù!*“•™­ù`3tn¢Ü»åwƯDt–KvÓ6F’¾j®‹‡D'`¸˜ÄeW†—ơÏGê¹dAâ#æ}UµĐªîÿööæ₫"äcđa„®Ñ©eÓ[À:8G“QC»qaû|óäs.¦Wy–ª¹MÜ-(áñàÏœl•Â÷Ù² ¹¦Hêwk äíÅ<ÏUù… TNªNÑ…µ¶2¸t#üdÑiơ1X³–rA¢‹ư+Ôñᾟ| O± rjÈưBm†„=-),l„y¨êq~÷° púï“8“JÖîCçQ ›\ ƯEQ×ê<èĂóé(›¹> 6E·×"iyäXƠL'ˆ=€ơÓ+FévsBp­₫é°RÑ#…ï(G çµ),Gˆ€÷k¬—ïÊaá;bùȨª dªá0¿— Óå¡û¾?íO-ÔÔÛÇ^/×ë~ơ¶îf6ú¸ßîÇư€¡Ê¿ö́ÀQë´—˜,æ±ä¡3ƸÇ”uEBÁôG\¸T~ª™á;Ă»P99m¬D¼73w«¾Ji¿\/nóD‘<&ÂjÓ‘{GL®O×Ë墢Ÿ?æÙ‡Øûnºù_ƠˆăßöÍs¯ñ+ Tôwô–;çœÚÚ¡ù7ªÇjħx ÀL/´ơuè˜çû½æDÄú“+¹v·Ë†Êyƒ@Æ û_¤—ÿiT\*jØ~i;ôØl;́#^qÿ—/_₫ŸÿçÿcüüóỊ̈?ëa¥|Åá¾5Ç£’©K^^ÖƯ1®^#œƯ4Tx dx“mÇâ‘`»û4¶c»ØÅ̀Æ1¶¶}ó₫›§ç§ëåjỮno½÷­mRO4mÊ8ĐÈBÜaÍ̃¨£IKȨ^uÓD$vû£FÖ8•›MÎÅP·¬öFQGđ¬‘fwÚŸD0U¸St ˜£³GƠ!xDgiZ¨N¸™«ª}tï\öp´L_Å[̃>Ö̀ZÔx üçDí0÷÷  4ñÄæC2¦ÁdÈ!‡o—̀¿I¢ô”!©ơ­Ó‚̃†1€¥ÔŒZáĂ²&dyp‰Đ½Ù FàW)tÛV@&èo†W²‘3Y¯„@ήˆ6BỤ̂"\6ầÎJzºJÿQ˜4<‰ÖK+¬—@!85Â{í·Wcfi1øÀ ”LŸO?M·<­Z^pÚ¹RÄ’œGüÉ2 „²OˆŸIÜéú Ó%“ÁÑÏñz¶Vô0A ́¡î ÷' ¬œ́´å8Fèñâ²±¤²®BÎspÿm»́— û³¬{®O×ëußv19îÇív»ßî½÷²=gùíóz ÎIâ6§®²êÍÆ¿~ø¥µöéăG¯ ĂÅ₫9ú¿âCÜ i­m—ÍY¢}tëüs³FD…eAgæTtÛ·ëơÚ~?î0ײl¤Mg“èÓÓÓÓơ©®/“ ~–Áưû¾o^ŸÂđbÑ©!, @ÿ€Cc2Àx{–x¤ !ç¬Ă€ûÇLj<ÛưvÜ£Ç8Üôrư°#J₫[Ÿ “‘“l5ÉU„=-ü¨:C¦Œ”æ$̃‰ûu»ú Ư­·Ñºö6&Æ4́Ë—/ÿ÷ÿưĂqđ?₫`-ĂS\ü¥G8•`ĐiÙQµh9Ÿ‰đ‘í%•1?Îå{5Ơ{¿ßo÷£÷ûƯƒ&‚û÷ê₫£ßGdk G–¡ 8í©~Ø•äØ‡û™!–Q!=¢T– {[UE÷ë~u~½[ïÚq4i^.Æ-wLÜn·³Œªêc©ư›j¶U Y¿†ÿd⃃o>§Qfp-êຌ”̣&Çv¸Ë¯·~}¾₫é₫ôûßưî¯ùëÏ¿ü|?î=ÜZ K`®†Âç’ Œ}Cụµ)(024IP„(̀Ç9$‰ûÀ đ»Ü@11;Î_q wQ̀gI«] ˜~Tp5Ü,2¢Bz´0đ»)¦gm.'mÙ§̀Úç­·ÅH'‡#Ù‰.­da Zq9«ÄDvÚHªG“Ÿj̃:2R$²,8×â~¿cH| û­u£k†)j{K1*&hb6².x"éåÄ-Kr† °âØăuǸ— œ’́•€Ố’&Æzn ?ª­™†ÑY$¥–£̀ƒ‚ªL¾îûî>Í©ØÛo8₫æÚØ2}\ëc2£Ïz£ ?^Ó̀ù©¨yß)ø·é •ESMªüa¯Ô²íqI6Đê¢"rÙ/×§ëư~ÿå₫K]ºeæh•ú5ƒ×¦ˆBăeóÍV¼đ ³”*â%HÈa¬®Ÿgga–¾̀-~G¸Î)¾"å]LY¶óñ‹ÓÖ¶÷ïßïû₫áÇÑK5p¿ïÙzHvÀ F=)²ǜ_.jªèCÂ=ˇ}B̉Οd„…Gfâ¿^=úCoJöC̣̀µ=‹íó0̣'?ëà‚7i’Å`Ö?U¡ơ BtÚ”»²PwŒ>'Gdw§œFEèÿiÉ %¡™Dă©cílˆ£ọ…¸ÿ&₫Ÿ¯Ï×ËƠÛú÷ăơơơv»>xG€¤˜ñ„₫Á̀Pơ?Óy‡Ï/ŸÍ,øÎí~+øÇêóĂFÛÚ¶oÛ¾Çq»Ư<6}úÓhë­Z†Ái-a‹‘¤cœûv0ƠµSÈ$è½{`=‡oMá₫ÄD₫xËWZJt(ÜŸ¶mCÎa@ÿ¹m« `ưưó6Đ­ûz µútèïܰ™yÑOxÂ3 3© ŒŸcX!5 éYĂ½ä$J„†XDƯ₫ñ›Œ·ª̀₫2˜SÿA¬ÿơÇ´±n/ï™öă¬gÚ¦äOꘄ%Y·Œîzz~zº^Ḿß₫íß~₫åçûí́wÆ  êµ\̀0A)³*NqØ¥eƯZ·XJŸgÉVàô1¡óoÙ]³~yüü‘‹|ù:,éÜ¥Ea&@8P ¶́29‹r×u`¸8ÛiôÉ!ËsôđzS¶ÆÓ5µŒï:;Ï. ƠåÖêÀ˜q¿È¤ÇcLJ§/uªúư÷øá‡®×ë—×/g¾“…êLYaçÖ9Êg!yĂ×Íx:Y*löäN»€Ó‘ŸQMéÂưÈ´Ó¯—ë?ưÓ?ưñ?¼¾½£̉JGá ˜K}+:ϸáŒ$¦úßZÈ ~+»ÆLĂφ< ù¡NÂĂ™!ăMÈabđËơr}º1^__ ½„¾Å¬­…¯Ї,ÀÈÿfÛ̉¸^ÓéJª‰†‘Æ¿Î_a¶¸®`¶L,̉ô oêRby¦øïß¿ÿ_ÿ·ÿơ‡~øơ×_ă`R x¹¼ü¿€J$"#˜ùЬ°rUo¸®§²ƒø]»gåĂº½>.a¢ ¯¥ŸJø:_ß-LƯcŒ+ç-<9m̉- :1ĐsÓ_Ç^Û¾µ­ăN˜[§Ÿ†Ê@-guRV Óa-œUÁ¼v¬1¦9G€8®€œ¹i‘üµyÍŸËå²ï;JÍ́û₫t}zº>]ö˦›˜Ün·×××ûí^±mT2k]* ÖV惃ăÍá™çïèøËà«Đ÷Ë."‘œÚïÑX`¶ÉẲ íÄ'ÔjÙ1\Ö"Z8hÎđr¬¨Åzë4ßh(ÔăO¢Âÿ¶; ÷m-̣äĂƠưưĂ¥Öl>₫H“„AÇGªăjiĂqj{ÀO<î·nƯ¨Wø¹÷·ăívܺu¿Ï_gåP[~!)ZˆưÈ–^îg€§êň¼Êi94÷}ÛƯ0l™›nÇ86ƯÜЬ5k]z·.«iÀßûX}Ç °(.Èa73ÆÑK‘Ø¢ÁE´¨Ñï\©×u§ù_₫kưư»o>}øøåå‹ËÖ̃ö̃:|IÎOÏ×(;@§R6K!|¬Yy62#Sˆ8ŒưN½DIđư–µ±P˜cưÍÈ„RÔöî¼Xñªñïá₫2PÇE¬êö€ECÇËú­iÄŒÖ\rlyb·hd}D\xS3ÛÑ—:́UMß,=ö‰ÀÑYÔH+¬C\.¹´:ó©€9%󈤦¨µ.+‰t ïJ‚jMrÙHîÊjúíwßư§?ưéăÇ?ươ§IœÄăâY›°I`*_̀yù5á̀–ÅA+U% ás¨ KL¿ˆüEJ±Ô&­µ÷ïß_¯Ïû¾ßôvÖ9¸)Ø€M¾… fSŸ™£ZÅdèØdóÂc .ˆôP§%[> ¿Â—Zœ¼ 1¼₫Iïưíơív¿Í^/¸†*€At—O‚µGze"/s§Gf˹¢Cùå äÔ^<øü`¿=_{ÀËáwúôôôĂ?<]ŸöË®_æÊj̀Ú<2ï=¨ƒ—†qDŒĂrNJlrăØ´F ½âPL(0K|OR)i~‹F-Î Ö“ƒùŸˆ¡yC+œ§Úÿgëï:àÊQñ³í[óZ3û®»ªnºmû&‡ưxñÇÛáơK7tè¥Énw\ĂPØ`c¥ü%l¦vܼøH£₫áẵïÇqp€xmF®‘à#sß›Ụ̈Qă!~/rS(Í3[n’₫¬5Î/DëIzÂå=7jü{W¯ÖPÍH×xKk`‘IÍ-PíƠi½̉?‰€Ÿ½ˆøÏR?¿%Âưïư~ï÷cDĐÛÚwß}w½^___áÅ=ÓL¬mÊù“V\ÔJ¡ #Ä@D"œ[3 WDö½í&Öµ;äuœÜ¥#+Àci6Û<@ û› ø·y0—è›1¹®Yß×Ä–mC -ÛÙT@ ÍTĂe½4›†¿üúËçÏŸ/ûÅ¥vkÛ½Ú¾E±6Zä(µ h³-R×#P'ÎQ ;Øm ³xâ@“£zxNÜ @̀ä¥Ï̀4m 4©ÚXï&™Î#W$QJơûMEwÆ{8¡åƒ‡ €Äkñ¬,‹:­¬Ö.ÜØ~SÑBAED6Ù´åÈ3?x›èzäQS«„DH–á@ÛØđÔ+SYlE8æÆ§=Ào\Z˜C€ˆôt¶è¦UC ¢q úçƯ>ë™û¶=]¯¯— ] ) åﲩĐ2[<¸é5¸VÈN ÍØbê‰7 Á8¬ôchvË@ ¡Qû˜·Ca_¯.U–É™NV1³ûq‡ÊcurŸj|„ƒ‰å#­f ïrj¾…-7À$ëóXƒƠè´°æÜÚ†Xüºs…‡{—~`ê?ÀX\ƒoÙÙ!Ö)–…ÔÈù²¨!¶ FÑơĂŒáåơ¤–jQlư(>ÿđ8:<‘¯®/ûe±đ1½Îk > t#`á5$  ô¬£|EÏ¿êúÉó•™₫°fqưÅỌ́1¤À'Ù€tñ! †§ —¼xÑ¥¶̀™Ư¬¿­ø₫¢`µ ±<°aÊBHÙÅŹæRdk̀í–§Á̀)§œ(&Ù_6Cÿ=!§I«v³m‘ÑÇèĂÓ@«’Í̀"‡üîdVå™eÑ Ö‰¤̃aœă‹èUƯÚfjjE„|› Çưp̉¶¿;ù!­~t‘Ø\UÆTÖẈr³P: Ä I₫gâ=’ư¿mÛ.Û¥mmĂköGÓ®ôóD«,Ê ˆ·̉Eç?Í́Ïy+âD‹{![:@yS—êcG?¼·WƯÛ{Ưï÷Ûqó¼^ÇH·½~=â¿KWÑ}Û¿ÿ₫ûwï̃ựë/>|¨í£±»Î*BhI†·́\0ú–§,Âfç¾v/€ă­̀¬Ko­!á£iÛl;Æá8¹ÂS½̉ÿè¡̉%¡íDg̉Q¡Ô.́9U@#‘́l¥ªCǦ›eD́Ñß·£EÍPŸ ç&ưußçèň’H¯©ˆ)L»jبx2ç/N^“ñ· ª^ŒƠ\@Íè¸f¡‚Ëg̉ ôÀÿ©ˆÍ(ë9iZ¿~4N·7ˆ Z'G´ C}ô…ÊrKC[Ábªñêufê–‡D‡2‘.·‡ ‘îIK×/Zl€Đb̃€Í̀̀¶ ¨HÏ•f³ØN»…Ë£é²fZ0C|™~Ù2MQ&Y‰ ÓÓZKÚ!Ằ́Ó§O?îûËËg$÷8P̉l¢×´¹iáà›ƯMF>4 ¦(yǸ2™²›_26@†W_ *Ÿ®µ¹=°×½b ₫/ƠÉ́r4ö̃üñG/ú ‡ĂÚ!óÛ¿VSê ƒ ¹ü *s‰iŒÙs¯kZ§I;Ÿßµ’U™µ³PẂNè‡*ó9äâàÎ…A—4H–»Æ₫#jK<ĂÍÙ4]¬¦EÒîb6à ¹́&̉'}‰KR£GÂd"3ơá‚L ¹éÓó“]q€ôöööÓO?™Ùív‹jIŒAuI|~,áËA/$¢ƠŒ§â U[ûôb%GÍùT5É”ơëhƠÍ£vm.(íl]´ æ‹₫Ûf-'²ú6œ₫ ,Ô©́ó<È&̃* u±®E|¡ŒA[æ¨e\ƒs6èĂå ˜̉³€mºUÙŸíâ} }Øû¶_ö˾í[ÛÄưßïwdĐ.ó¿* vHÎÿ-À²~¿ ₫ uö­¦%Фy ́YóùđĐûq·lU<•l €Oc<Ѭ–et21¡•y eBˆÉÜú¢<•^ë†R·7×?EÎH̉. E0lụ̈ËÏŸ>ôªb†ÈlD\ -‹áæ à^ø˜¯4° ơ÷ˆĩ^~†¦=¦l†¡Ô¬ ÂjĘƒ"jÑưËĂÆÛë›z“¬\ÖjK´çă§#T|¥UHf€ơm´²œăÜÊÀçG‹y¨åî]&¼¿Tö_lÅuS§“­.Μ¡|_JđXG(,Mp"Ëj¦ƠểÈ\2 N\íŒéưÇT̀>®Â4³qÂ×.ÚöÍ̀<:Ÿ-„̉̃¼Íq$À˜„­mÏÏÏÏOÏ_Æ /f-"ooo0-tùf¶ Y† ú/j™ëë-›ªƠkÑúZÇÖhơɵܤ&×,ÇÇ ê9ˆBf7#0º¡Éă¼L2©°È…óơª¸s U¶@ T³®̀ºÁd%"Ô a?dî·̀Ë…̀¾¸´Ê„+ÿd¶tá₫|2ƠQ‰ªEÀ6ÙZkNÿ{ä×üaôïÔ†ué0¸‰éªuă»t„d× «¦ŒÉ–`UÚ¿^€ '¡;â[¶ …µù¾FRÊSbÅñ[+¤ÉĂXÚPV(/ÿ?Ê₫u=–$ÇD3’{ï̀¬¬êêVK#ùFçưßgæôô\Ô.Ơ%«2÷…Œw3œ X€y0[Øù1É`0ÂƯ.°…… ¨"¡B¬"~)[Yº‡êÿ­o^}d¢ÿSºˆB)¤-…a%ï…Hi™‘z EG ¦å "óñăÇËÓe?ö?ưéO®ø?îpö†)}ŸÈư'^ă~¿ÿá0›×ëÁa«¨˜û(µ^H¸§"käz•OŸ>}ÿƯ÷6í¸û}—èQ˜ăYÓ`D7¥„1Î/¤nb6d c!c̀ѵ7k=A]#ÿ/śAŸ₫Àª‰\xâÇ¿-ñëÊ ̃-4ZwÍæ%)Éúo¶ ›mMÚè£[ïêÜoí¢ºu I·231.l‘jDÇFĐ&̉€IDATœÑ[ ÆƯ¢®ŸßXŒ¶ç8‡E÷¦Â;ç=—xË>̃X”̃ïÉ#ªb|̣_ôeĂÅóDCâiÊ+'İ̀‰VñÀBíâ, Úâîæ²oAøb¶đ©]ÁŸ:§LÀe‡×2¥‡‘ ›+'y F²[·.ơÁtÅTËZ—©œă0R~<åF¥H<{»ßn÷[ơ÷èâú¡k9Ñ5âa ÊŸ<éÊ>\²<Úp~G–" ®Ôpấ×P)Ø̀VÖNÿÏÆêƯơƒÏq‘1‡FTa‚é*2)Z‚Gºzñ̀]&ïQ]ü)¥‡ñ'ˆªÓ/̉‡½ôëưắó~ë /̣øöÎgvÁ;̀Vùí2›…¬Oë„›+½ºơ=eÂé=áx₫Ũ¶(Íå˜?=?ư₫ïßZûĂûĂơzµ÷b\Ÿs± ·X‡®Í5WZ1¼Pܸ†qá7¹uÏÔkÉ‚?Æë{7x~đ4Ü8€8Kÿ»tD¡>èœƯhtónD%Î",w®^ q[¬-]£c¸:æ)¿Î³ơ匩 Ÿ'rMÆ‘##sâ§ăÓB̉ü´¨‹vjf̃áƠÄ€êD£q/Zɤs"ÑA"7-]á)3s³>’ˆK€ ₫tĂ!DÖüKú+ N9êÙ‰­q€°h–å5߃_́ZåÔZ“†œ`ĵh“Î@¿üèx(ø9‹–IËí¬ÀNO•…âMf4*öœ„,zéÎ@®=ÿ‚ÿ+~öÉ£Ờ‡'E[à??¡ÑX^ưë¤3Éæ6„ZÑ-9ÑŸUñ} ú\¼[_¡ËéÅưÂcu18¶è’=¤`ºˆµ|ĂƠñ®gËÏù§Sç¿{2é¯<ÿ?đ8›b¯̀9 ny…T3R?ñÑ ˜8OMåḮk¨‚½Œ̣̣̣̣Ÿ₫Óê—ío?ÿív»ùñÆÔü_? N\ꔹﻙƯ÷»½«¸(b*BFÂ}üu ̃‰ aë*GáUñÉz®_óÜx~y~yyù2¿ CÏÑ?́̀ÚƠ!]åơÓF¢Đ̀§¿]ÀưIÄU–wÊ´¸ẵ›ƒ“ÿp« t· Ưœ´ÅL->` È”JÊ'¯¬̣ʵˆ$¥º²>ÛŒ°́O/7‰ÿÀưoÛFăeôI1ÿÎ=<’ă“Èœvµ¿yùtd?x†ú@ÖâÑ€j•₫ÈÄ3%¸̀ƒ¸…4wºŒÏiZù}Ư>©k@ÀŸX ÷*}ƒeÙÄ´×Đe½́Åb›ïsn Ú¾ïû±c`÷co{{}{}»½]ï×}́¿ ¸'?Ç8;đ¶[Û¶¶IÔœ’¹[²NE$*‹›GÒ’×£À vev¨“›4‡©R$R’n•Gªa2±®ƯD‹ᢳÍ>;ˆÿl ­– Â_ùr´ÿáPyqqµ‰<{|PâªÏ%x̣¤œÖ–aª³˜l0æè­;°ƒøG´ăMÛÔ9ÛY×ăYŒ`pkỹÂİuÆ̀ĐP‚uѯNW¨:t4»ÚªêEà Ùƒ™+R#×Ṃ- Î@î^Ä B0]1ˆa®«ÖBü"ÙƯÙtXw壇TRYŒ ˜ V(BKâÁk.ÊwÛÑ|›ĐßĬ9_î†r­vü±j"Ưu/˜°½±°`r¨Öä!‹œ–ú ±W₫ú™)ñü{äĐ£.ḥ7s¢¤’0¸L’¨Ø{ƒÅW‡¹ÈđÚ†ˆ6—‡q°›,ö ̣€Ơ3—̀G~<’‹f¸8á0)è3¿Q¯ „p ^NjÓ΅F!»’óé<ÛÚ¯£Â÷w¡ü#(iÜœ©J›b´TF:/€ª‹Ÿ'œ”Ë́åååz½ă ¾Y lAíƠW9y>ơ]ÎÂïZD&Í >í¯¾ơï¾ÿ'ưiº‡…†x&×j¼sÎ}îû±Ó&œ|2”•Ä®ø̣×êjE­qâø“è'JU _ù Ó“'«Kǘ"P̉UN0‡³¼í€å̀Ö’Çǃó*á*/fPrû”%̣+ÎƠêWŸÇz§~_aœ_*–¨•• …B‰HAđ§Z«Ëéâ-_EÏv&Æ8XÊEÑÚû×–ÊŸNÛq¶̉G3W2®ä®U¢öbØ-”W§êïxÆ)3o¬ÿR µùǨ8²raµº(™’GÎ"YE£HÆGïëß®ûÉùJ‘xÄÏR?¹ÂÆvÈw*”ÿ²à«H˜ ’Úé¨U*«Gjb(́s»ßq`ˆqüüËỊ̈‹¼^ß¾½~s}¿Íaă~Üq ÚOb*—ị́ôô4ç¼]o ñTÙLTÎíƯJc/:~VäXơ,¨vL¦Ü̃nĐæx³¦X¨u´k@`[¨&€NÊN¦XëmÚJf] ä̀6Çô€Ü” óg¥tÔ¯>ê¹bË9Äλ¾ êg9ỳă!‚ùÔZ íH”?m6'½ª?@Ăưë)tÓªÿ{:щKÇ4%ZK‚kLSΑUV ̉ïVñF‹Iâ >BL>|ø°»Ư#°CđÚ´ơÖz³i_¿}=û¥qÆÍ"B•>†•@3ä@ûă«tú^ûöíÛ?ÿÿ‡ˆ½~{­g[2ÍZvDŒvơónh]ÀÜn ¹J)T¨•gä‚₫cy/Ä?ó1* á…±’¿ƒÉ[+Ë™\ß®Ç~Ç‘å̀₫ḥƒj¶:.Àâi¶6›<é‘&Ü—üÏ¥K?‹Xåô&™”Ơ8k>ÿ.R]Đ`Ăü̉}̣”\ÆƠĂŸ³’ ær ú₫¸ƠY…¤4Gk­‹ëé (,¿·¼µ¼»\Æ”t³ÙSóëO­PƠè„m¡Éáë*Lj“^s¦æGHw-ây a(9œ^#(₫åJ°ÔƒVœ´êÏæürÉú}Ëj?©Na!ơB?MZëÙÀ‹°¶Y¹Å·.(«pä´Ïx¹.‚¸UQägÎiÓYÿáEqXæÿÛë7/ê¿ßƇ åד­ăf1’ûîm¼vH@¯¼È)û¾2åk}2++p§æAË–ÿëÛơ¸xg¦Lœ@¿6w®TuÅU±&'¥¡ &²`]ûksè8ôèÖñ΀‹‚d’Ÿ>Ó 17n§Z §#™Z‚§•P©›mñypQÂeÆ„.¯Ç3ÚÓ; z3ÿæåùạ̊|Ù¶ív½a(Đ/¶gJEW“_™~‘"͉c.ËYGŒ̀=ØAeVH÷àAóăJ§dÿ±b]AÄâAZ³zá æ‹»3ªµ…WMU=D<±!Ḯ¹Ü2æËÔë½ÊäxQ )™Ä3<= …àØqÙZå™)YÅy¼ËB†+¶4øb”¡¢µîA€sơ˜z^ện¾jŒu%Ï’ă\ tb¼"猬‰¨LêPØ̉s>9Bï²ăx¶¢Á ÙǸTŒ‡¨„G—‹¼Y“öüü|yº\o×ëíêƯ‘føÉZ QÀư²ïu@ hˆ…; Ÿ“®k©}§ügÖr¹"M¦Î6›‰el§4†¬Xǘ„¬¢Îç#Z+.̀+đ^uê„û%ÿäÑ´̉³(§R•̃6yzzz~~Çøúík~–&ö:KÀËå%h.Ô\̃ë’́¬]co·ÛûĂD́v¿å½?̃”æƯU"dvÜăăGcI'b‘„2u?] $¸0µ´”L´aåè‘å{₫ø«ÿ8á«@X¬ª.éÿ¢₫¯gOi™nđ2Yî¯Y‰–N+–B (0ơxƠuưs̀k`ù­†ó¹FWü7•u›ßçz Ç¿Ewôṣ:JçƒưñÊL×ôЉr4@ÿ‰˜%/̣Ä₫àh ơÆ]`IÀsK±ÔđŸñ¸RËüO¶ú¢PÊå™5½7Nu ²ô–¥›Q/ ®œäß]ª%¤¦¡2wd¿öÔ“"ñ'8†vE%eư.¯j ÷™ @Ö́]" ñLÿ­‹¶®¢äƠ™ÁRRáYă@•¤„₫ó8ă~Ü÷»WơñR™ó8æq?î(đ?ç„~Í‘Mæœû¾K:«å¬₫‰ˆŒ9Æ>đ'(a · ¯aâœÛ(f÷j®R|DkmÓ-k"ák¨°Zo[ßàPm@™^â{áĐσLÂ9ZÔÔ µ ®§>”3èDƯ¦ËBàTgô¿ó(dÏi6“Ÿ+æ¬Z@Ö­V8_µç¹á+Ï-tëy[€øæCÿđáÓ‡/ÿxưă¡]ẵ™f˜L£æôr…?¬Eµ:­Áặpc*[¼‚ó•8—>D{q‘¬ê¸0C±¦f1Ưê0Èq?\VåC]äÉÅ)7êÇÜmG¹±ÓÙ@L 3䨰Ñ"î ,”üoK÷̃¯“~²UÜH^&đ–‡/ª³Z 8JÖB›Úp¼̉'5STgø̃Ÿ ]æiO,]tyîŸ̀ỳƒÄ9•T3W‘cÆzNh}ÚKº êÅc‘‚!̀=;,QN´‚™Ÿ¥Ñ ¤qÄ—hp¹\.Oû±ûZ‰¾ÈKâRÉŸ¿^²D ;Ÿ ²_J$ν‚ÀuÓ+˜®«A°Ê×2—´N믰wü·34ư7ÿ««₫đ?ư+8̣ JÀ<ÜÎÛëÛ±üìœÑôr¹¼<¿ÜÚM̃}×ÔJÊ ~-¹é m_ƒï§›*s?öñåËé<^đk=tÙ›Ëë/{´Ó[%gé‰ü«(đ“ù©-zÛƠB@ơ f₫Ọ́₫uÖKfj½wÔ”…Ÿïr9¼û•AÈùÄIæ±rü|?Ÿ<±ƯïŸđ'µpƠ5öÂZ1’%–{¬¢“ø§Ä8At-lđ•¼lrÑPûäa-ÅZP̉ ÿ[kÀj|s^< Î)¸dP©¶(†‹²§/ û ơ*[ùư_EÿÑ+“/KbK3å×$Ưƒê¸c€Oæä¯SI|ünä ăă›ˆZ2úÎW¹.Ÿ¿ƠHó}Ú8n.øiO©̣'Ü'u]WQÍ\Zä#6°@3ÊÖ06ă‡ƒûƯ¾öc÷j?ḥe¸;*óạ̀󷘪5 Ù÷®“́-œ9Ă\!&= 88B|7UkWơ¡†ă„!„ M7Ị̈VUgzƠ©¾ˆ†+c½.$Ü›]ñ«7@aøÓf³FàD’-¦GψMIôÜ'¯É6¢%¤(ïEh†èôÏhDZY^bh–©vé^&hÎÑÜịéÓ§ßüæ7úóŸöcÏĔ貜GokÍ[ªñT©1«ÂÊ“‰á°<]>|ü°ïûÛÛÛ~́8/ƒöÚ‡iƠærÍe`ä40ma¡Àas¬̀×:ÉÄ_ÇÁS̉ä‘Ï ×* Ûc9â*³,Œß©å+7ÛÀÈÖ¬çN4-7X¬. ¥éÉu4±Ă4‹a1«’ç\}†Ơ´iW·¡QV̉œøB«è,º\Ă Ë“%^yzrŒ1®»Às,’Ę ́—a¾¡¥‡q¥?—‰“ƯǛÆ1è[Z¤¸`±i$¸}0CçÔ‰µXÑáW¸OÎ.ëäÛ¼T¥D*ôµŒŒ•j6Mú*AÁX™ 0_¸]’¦#"¬ÙúG̉’µ́gCèë¹Z¬,8~øi=ăr©˜'ÙW‘_߉k•ơ:OövßĂªÚ½èqB˜,"æÙ¬²Ụѹđ$×›¯ ̣Đ˜5"‰ëÈÈ[Û“Ư®›©V¾ª¯¬W(UuĂˆVü–§&qg}&ÔRæÿ²]ZkØ Xëz°³â±rơ™¦®:™ơxr·èa´Ø¥è³Qqs5ªiëNQôâ p@(:_fGrí‘Àο*Z¬´s¤sūߤÍÔ^½)Üêèï¶Ó—äÀV¾™ßp<“‡~x,Ç]+&³Ü/];nÆÑ!°Yÿơ₫ÇØ/Ê¥̀j³´–éÿđ®˜)î…Äññ Ö7s.e=±¼Ä§-ºkLbü±â”óNÅ;!H]ËySḈR<º–¶\„ªEA`ê©·O?¡8Á~ßkµŸS²/Ÿ¯•VCĐ 7ë ›÷Qs GßC3ëBŸ̀¬€ny?öû~÷¿ó~`p‘ôjpËx·³ñ —£î>Zà1DZ¨ Tm#Æ 4÷¦,êSEjk{èưÊ(ỡ·[\î6ѹk›³j5¤´¨|ï?êâÏæÜ?ä̀1evëtR-Ô„ 7VC_ ‡U¥/³Ê4E|‹ ‹…}OĐ\Ys‰zö©À3?ap¤Qôâÿ‰wKx½¾₫üùç1À™ ̀¡ĐCUƠ‹åwí9¢-JF ZLîÏOÏMÛívóDÀ¤(TCóª!fnÚd΀Ffmm’ÂÊTylK‘—â’%Œ³Ô?Ơœ²¸ß}`)À‚ Gơ?Œ€,d©p%º}TBƯ>#‰̃¤Àzâ€úæ'´'¡1Ë­ZlZâøGç‘úåŸó`PƠưØÇ1îû}9­(̃˜ôÓ}ƠaÉVÍ%³ë́±œ*ZɃÀ2 s¼ºÜ Ëy®× ¦ ‘âÊœUL¯«dG,o—@¤m—MEÑhLkVÀH=CVºµđ·‹'CŸ$‘Úw‚ÎT¦½R$Y¢v¤ƠNIµE§…´̀4*§cZó¯ÖuXç‘v¾>hU8Ë„₫DuÀÖ0bơL_¸Y&aUn2Í!w>{eü|Ỹ¥ư»v Í[ơcµ†•Đ´¡ÏWBáæZ ‚{̃² 2UZ÷x₫Ø8"IÿSü#’Ơ`RöSjü»¦ŸbqWMÀº:̃̃ ˜6>‘åej&@Jî zMu"̉I.uf’ï5¿{mIóm’*ÿß₫ö·—ị́öööƠ¾úPS󌵻…1Y-Z TŸùdWIùû¯˜IA‚5Cpôõ₫Eñ¿Ï}¬?₫2Pá5₫ááó[9#¡BYö<è¹ü¾̀9oûí89²ú*ÎwUƯ4óγIysO &û¶Úü˜¢ª^ ˆ‘º“ 7à\ơ 6ªb[öŒÿ6Úi¹Ô{6Ô:ôđº@Í%SC*Ruél\s *÷ÿîc &ĂÓ N¡½J«Ôă!̃ OÂrÑx®íôº7>ĐÑ1àÛë73ûüơóëơçÁ67¾×Ù̀C‡EQo•ÅSÇPPE]í¨ª)6¹+ \”ơ7¥°̣èơ°çPŸăe]̣t÷ä• Rf4‹ÁÛX̉¢@äN¨3%ºp¡HTÊ×£(çkUµæ:¡âH¦­)‘¹D»>¦˜Y•0Üȳ9+r`‹¤2rEc|¿¹EÉ̃ÖúÖ»ơcH«W%Ÿ̃]̃úûV(éởyÙKĐqsñb# FC™tøz÷¢e)¨ÅÅP7Ÿ'æh¥̃J­X˜…\Tñ511 JcÏ Ç1pÈÁ¢F…+WÆ@{–F|-iÅÙ!îẁ§Âü“ŒZ”¤‹ûÅl`e¨’³(¢@Én’­–EG('Đ£çđîJÈ_½gÏ}¹Â`JUúEQ2)‰˾à™q́Çơ¸¢w MM…‰ªúá㇭o×ûơíúF|_/x½ÿ¸Î¢Ẁ5¿nOúÆËR|/\YŸY@sa1;SbÈU±›´ÚœDK]ÂÔ©ĂD<ăï,Ú´}øđáÇßüøñăÇëơúç?ÿyŸ{…₫Ơđ’=}˜Ö FÀÊÓÚ£R«-ªhŒ ơÓëÑyä“yäXvGMÿ­Ùúïvv·̃«ÂTÓ@9Öªć̀|×U¬OÜ/¥Z¨‡%k56“²–â «‰k̉úÖ·æ|ù‰©´6̉ÑPröúvç©éWQ›^£ç‹Ç 8ªaˆ¤}·”!½Åœø·A ÓÄ“jàŸSöă„·x QFÎIü‹•¢s²xŒ ¾*r¸Óc ÁOsè8)é´NyÏÖ·ï>}ÚúŦƯn·ZT›ví}ëœÓœ;fsƒK9"çB7‹® ™₫Dâx¢$=}«âŸ?̃û}Ị̈>ûؽî眳ô—9Wøn²¯x?GLPhè~ÜƯƯ‹ˆnBi(É ÷«@£q‚₫-—pÆs°*6ô®èˆ½ y]¡„§‹]kBË*HœEr0DAø~èèÖ3?˜ = «Ÿc@œSÍ„ê,É{Êzµ§4öJ”zLcBP¨X s`ñ>û” ”ÿz}½̃®®ﯳYëÓ»†5mm6Ï^G¬ÚQ˨(Ä‹™+V÷>ç|{{Ă²ÖµPw-È(Ñ.êܺ+#₫h©Ó>ª¸â_§óF±&‘ºXT'̀.´)Ád/¢ê…×Í{÷Ú¢®|¨®ñeÓm̀ñ.6BHît¤–‚¬gmS;æ‘=¡D ôOCu¦Í'{¯pâlm#‹Ü,³™kQ‘ âưªÜ?®3É`[^V­³û¿"XuµœQ¶ ;“nQ ±¨´Xÿ±¿—Ä»‹ä䳄[8Û”)ŒM L!¸Ú´I­’eRcà‘¥ h‚ŒXܽ‹u¾ˆ¥*6%ë\MĐ — óÅ1z"‚ §'öÔw{”bẂ»¬aONöU#tZ ïºë•/?ÍOeGÊöH WîÿñâÇ÷ûeªƯÁÓẺZûƯï~÷ñĂÇ¿₫ü·Ûí¶tq–ƠŒ”M§ï¥/××o}ÓÖÆ<Æ1NÈ>¤œö¬œ­Ç;ƒö®aÂ#P(,)¼rºR°©ˆˆŒ1¨Zyy~ù»ßÿƯßÿæ§Ÿ₫̣׿₫WÿNaƠÿî.[©ạ̊4 Riö»­çªṾ(g¼†Ác9j‘ 3ªđÎJă‚,4u=–ú₫‰VAæzSDç̉2àëdtuđ}jưIêG {v˜*ñ%nyrïÇ&¾Ø×dXqF;’¥€<—` Éû  5¡ưV÷ hÿ́«`U¢C¹¿M Óͤ¾3Đ!d• ö=c°&[¾†ÎĂB9q£ÿ*`^\#)0T Ư2¼–Ru’úQÊb*¼]0½ơ,VÓ±GD[œ“Œ¢LÉKÏ,y=È08ư‡Ëư)úG'/œ­Ç_œ±í"gŰª„W逈téS¦ë‡Đ6¤¸¬ÑÅIÊ!À ’ bu \‡V,{‡!+€ùÁÉ4TbÑ:ú©ˆzë ‰#àPàÔÉ…w^­-P¦•bƠèlJOÚ£µ6lhˆy|Đ-Ï6Û́ÖQ3ÄK„jcç`œ¦ªjÍthoJhÏ¢>¦ê:â0+÷Û~¤F{fÂe"øµu@‡P‰¨N5éOÿÛH$È“¬ya‰ ‹¾{B*êÏ´H %«¡EƒDÄäắ |¾jK’ªÎE€Èú˜Gmk@He9óhNŸ¨¢¤‰eV@ƠJúî.`·¶ơ á5 ¯·Ew0f³i­XZMĂêp”êîào[fáHøK8¶§hó*R¾yM==Ơö†ÖëDdÔ^-̣£EKü!è¡A¤ ̃G;´7UE‰-ö“&KÍ5À•C³Ăó F€̃¯±¶åĐz“ú]B=¤ÿk(DiUn“F[9„8q°®$}¡íOÍS6çwUûøÅ—ÀẬeE`¸`F=­Btyb $„O"â%b¡º3_HÓÖÚø÷ÿá7?₫¦ư×₫ÓO‘‘»ø´/’*¦u-Ÿ˜£*¢ªŸ>}zz~¾^ß>₫l%5…“˜›¢lIG1fø2ÊØ² ñô‰KóMIoJ‹vy¹Pjfs̀}ß¿~ưj3=Ă‹H’:V Ăb§G(ŒYéUà-ú«3»~PnƠZ÷k.‡¦5ăÛ'³± ½¯0åÎè™JvÉíy.äµ̃æyXZμe\¶£”e Ḯ¯¶úŒÏ`í$Pä^"g)'Ṕi{ÚúVÑÅX„\@Gn~-'oaOƯqÔ9CCèø¹y5ûQr?gÍ*˜Ư[S~mÑIÔÔ2Y²\d¥ê?»˜û!Y€¨®HŒăÏû­ƒĂöt ²GƠE‰*´E%¥}?æ¼#`yÄßrsî8¹¶>r¹Æ 2Ê!‡^À"?hpéµü瀰ÛÖŰăvÜnû OV[Dó’6¼îJæ¦[߶˶mÛ´y»Ưn·>=átd›¤²¿¨­Ø!_¹́kƒdÈư)”â¦È1 Óº!aHÔÏkùÖLm~À”cP}Lq`m₫zÿàH—mŒ90̀Û‡™º½‹I+”à”„äP•HWNbÇbmÏ–±DœnŒS₫Đ6 уK†¢ÉÔê¬Á‚Ó×ï:ùyAó茙¡nŒ7Öîå¬9c¾ƠR4+Í&>“/«±'è(pkÈT>)Y´·Nb*qGœ¾„]#‰$‹iÈ»Yå½̀5­“WƠØ€Â"]&›•ºwߌ›qJ…§qU%€Ï(\©A:l¼̣¯ Zêù•¨%J¦éäÔŸæư]ô¿P°ERÿöd"<©>ằ€V)ÓH<ÔÓ"ÍC}¹*”ï1âFÊZ¼œ)́V²¢ë)˜GEÿÁ823˜iªIBŸ 3Ä ŒK(§)8®¬ó¾¢ü“_5 %‘¬n’ ­1h–G`Œ;µ‘¸÷’µ˜ÑX¯Î¡ç>½½¶̃̃̃^yÔö}0+qZ̃ƯrR`Ëüö·¿ưñ·?₫ôÓOŸ?>U]º@đpå&ø.Ö+Σ¹[pL­£×² FÉÿ_ lç/¥]ß®øĂ¶ị́úú­Öûz?¸'sZ7ÚëK™£$;cÛZ÷†̃éú ô¾’±ÅøOv‹iJdTdJzuºDN\ÔºÁVh~½åŒđ§Âp守?G©Ü7k1 ƒ!4Wµ0+C"„*];¸ ºˆË’(rvÚíX#.₫q˜m›ª±Âë"|́ç…”œi¯Pêç¡Vñzeư³„X(^c%‡x) Ä.ÂÑ àÿ¡C(₫R]™-êeơÖ— €– IËz'U=å°µ± •¿|ù‚ÏĂ3ª@Â.]Î¥rÑ€ĂÊÏà¥k®ÛKÖßæáE>ë‡çûRĐß]§v\o×·û2ƒ™ˆGP±¯ñræàN›¯o¯û±Cñéë’®”WAeÿ"ôï­céV΂đ²E·ÏH‰M‚³Í"ߣ²* ö{đơLÔ“¬™'è´àE+IÉù`1ỉæœHuQMï€Ä=¦MxÓæa‡WƯ¤Öö:®1Q¸¸ƒC_Ị̂H8EéåQZåă¨m”Ïô®̣]®4̉7ưW:)ôg­̀a”ŸêTWÊoÚP°ÅÓ tvímwEs \¤2.<#¹{©¢vF*…Ga’‰7À©(h³Đâ“nôÑäÍØ;‰®’^ĂPêg‘x›6»öĂ1ña:Ù( EAÑj'‰Ơ‡r³R‹™L·ơăDÍû₫QüZŒTeaëo«Å„‘̣È>ËóM?ûưS6 ^Üóz£ú§÷ Đ6tté®̉l&àgLdÏæƠ¤uéĐY©³ÊJP)^y}&ƠWÉàÊ~[äón§å>´øtÍh@z .\…ss¶̃}§g–ˆ1[$<ípy^>®µRï¬(¦I6tˆzÈ,½ÆÊ±t²Ë₫½s†a3% Ođm5¬Óæ–D¯gF¨ùT’°Œ ¶"ÑÔ¬#^ Æü ¨“{¢Ă±°ZkCÁtúêx¨ Ë8)Ơ€¡ïXÿóê(̃fdÇú»E"Ky.é•Q "‘Q ‰n }UƯú6ç„h0gP˰„ÈA£8ƒ'n¸¦Í6éz™3á°y§9‹46“‡ªÄâQƠ|Í}R€Ró»F‡gÏhÔ"g2Ïă¤ä·́‹<„r‡?́¶íu(̉9P=5½f‘x£+QA‹h3Yt hØY2¨î¡à[r3å×´h$\+ơ"àâ6S`¸“»x̀c‰zWEY©€ù>êwÚ¼[6ĂVêA῭\œ4ÖÍÄzï]º™uëe"àé©x®9‡·~=Á¾´/qL¯[#½esN›•́t¡ư@$Àµ:S­™MsH,¹Ë2Éû@ù­‘vâQBß,mÑ5­çw¼0R4¸:O 8kv¥†C4́±Kz¶¥¶Ue4 wWgºÏéƠư·\ f%?[Ê₫MDP Ô/©;Œ¾Ưnu%Bçµ±^˜EÁQÑm\h¹5P0^]m£» ́ø¦ÑW¡©´jQJøùå,xˆù§Ï¨Xé˼̉¼0¶à˜²ˆ£ª­Îă°¶kđă1oJU§Í¿ vŒºIs,?=—J+SX¯6Ѽ9C¯x¬isü¦²¿™đ@ZŸŒj®̉XK|2†Ô,‰€ÅâI±ƠV.¸v:‘ßñFÄKƠb×ÅIJåA°zCdêQèsT®–œ«¹U•­¨äK)Ç´ÜQÓÓA¬º„‚9z„₫9-G€ïSÍ?ŸÑÈ7̀ºô Z6măs®ÊU]0è2¿åRê¹PƯ­:§©·!KmÖz»\.v“3}.p¿₫·üaæÉ₫9ÏâŸ́ ,ùäIw´zm™$“«½å½;ô×Ê₫̉™̉ÿ³F²¯ÿú™̣Ë–^(ĆÀÉ́Ÿªè„epâF2C1Ü""ï ̃¼ xỢacûm¿ƯöJÖ¬nÚ–jÓ—cÅwbó₫»fvßïa.Ú»h~´÷̃Utë›FîDu¨$MèªùÁPæ6)Û?ÑÿZ€‘«Xl °:á¬kÙƠK|ö̃m„–]¼’7î?KtÅ6‰̉ïÏ”A+́i:† I÷ f)«´1œ´P‡cËÓåăËÇă8>ß?ĂÂ4,AĂ²¶4²`…Ư…,ºÀ Í’)] †æ©†Đ¨Zu xïàbÓZwu2Ü¢€?溗¢½l—ïø¾iûüùóơvÅ̉‡̃Ú́xw ‘gŸѴUËîæ8ú4I²ñAŒ œ̀¢ç¨"H" Ï  ¡ £IÊ ?®äĂå2«•a¦N›lÔÄ?VÁÛçơ‘¨'®‘ñ_”5¦¢đ%h¾S…•vhÜ{Ç~̀>{ë†Í¢f ƯHƠå’hPŒ̉v*4.SÖ öÜzÈÍ‹éA3J MVv.ÆBFÙ#ôT½A]RE*½`s+Åôe)*/¥ë׃¥œ£4+}Ừ ơ13¶P!Ö¬\c 1qË âât:Ă¼#æÖ·>|üøqùåË—3ú#ÄS&ä¸l——/(W—‡½ÁÊW‰.›¡¹´*N¥â'ˆ•™-¾å‚0¬.”"K›âưXZê[–uÂ3`æ7Ṛ[»?¾™ëôØƯƠß.ȯÔü=¹n*ơPZækâ{‰à$ƠiâỆ eÈËm%%¯‚<×­¿­P•”s"‹©$iEÓ\Ẹ̈ÿiP+lM H7ÿJ̉ÆV_EXó¾œú₫vM.ưbbÀŒàáS”™À¬ôoi`}‘đ-T£sR=HÂYnöx/Ú›êGùù ₫h-̉€¡È*ŸƠ*ïƠ„(µÊ3^e­ ºµíẹ́„Z₫”ååIŒêÚbI-À\Eô¬.].?î¬ÊµâC6¶{rØA3Uq?P“£3ªư˜ß/ĐGªĐ_Öw–Rđ§OèbIqï đ»z9ÖÄư’@6¿vOT=±₫ø^Wáûr'É Ư-YÑ?¨ ñ́jµt†Ù ‰×û+ñ‚(÷¢^Aơ°­¾n÷Ûư¸1²JU›”r†\ÿa9" ̀ú°ÉØ›n Äo­Ö‡L yƠy^Æ­8i‰CîO³¿ØF̉D¤Éæ*χ’ —Y³îRđ­ù^uq‹4Ö!©F¡Eă§)³ơ–kZg³6ḉÚ=ô/.ÁâûJFê‚pßH4ÊVr¸C™ơϹ²%JÂá™̀ -›¨(Đ¿ûsqÖEA95î*Hr™)O]P³Æ$E§aiđ>›´Ùgר„Üi.…ƒçùù¹ië[×Û{…tJ¨½Úc‚ZçØYh^T̀&')¹ơI‹¢ï3Ú¥©*ïK%é·8ư—ë4[Ü>¼²–h˜ˆtëp[ˆnU‡ÅïWϨ2úCçRĂ'é°‹íf§ÍÙƯ|đ¤|Ñ—ËÓ¥i{ûö†€™·¤ÅÎÊ|I%Iå2¤–ău9k>E0„=ÏÓĐÙsÍÅu<#•y,Ư—tơ.µIß¾SMr Á[ö»µ1Æ%Ù<å4¼iâîxM[øºmk2å‡EѤ 2rå[Q˜ƯB ơñ¤g& ‡»ơôüôƯ÷ßƯo÷/_¾¸­Œ®À̃ü$jçC¹gQ¸6đn›v<ºm~U&4zù|9ûEÑ[~úƠé6O ơÄ8˜ #‚YÖR¨ëơÊur>Đlù-Ê~¬NúâB¿[ ~E~y%[Oh£½zç¡yUqÿK/‰ùUN7Àq¤•‘ªêyNgaˆ̣5ͱ&q k‰>z#ơÓ9ï¼€O>_9ƒƯ¼TñïO8‡̣,ơÖNa¥Å†yX̃ˆrmÙiIäkÚºçúa¸&ÛUÚ¨Dr,bṾ©x¾|Ÿ‚Ÿ̉"€‹§º ˆT¡b¤ÿ½uô‘T6±¡₫§æ|?̀̃²sĂz —{Ÿo U"öc¿ßïÓæư~·(×Åïß¡öI‰F)OJVÎá‚™¨iI&–"‹×ófÏHUY–ÿ€̣¯¢ƠÔ«<ÿUí³ơ Nä₫‹́§¯â–V¼,¶ åhź‚™Ó¥SN0̣NYu–̉₫ȵE¡O¯ơ‰li1iB]÷ư¸ßûơ~E½ÿă8ªăÄ«ÉdÙ/gẸ̈+̣4°°™Úëô?r!'Àç%’OÜm!Ê8IÓËvÙ.[km?v 3‰'B?PtƯqñăæj FËCƒª—6ÍuA¡̃FơÀƯûƯÇa‰-#w¾™¡õ1@L¦N$Ëh€¬<ïíØ̣ZC¡»|Éÿ©ën÷[®Ơ %³f¤‘ =bf‹a:QÛ4ól$< ¿Æ›èíy¦oëj^Ø₫Okmè@ß´­mÍZ3úS'₫¤™7¶â€†Ù÷]KOPJơ4ÂU±ïÔBTcÑ@ÛÇ*Ív ˆE€zÍ5ÙÍ;AG®‚®%8Í)I|ƒ'Óc–H‡bQQ…úÎÉáå,¥fé['çóµI“.˜lM‹̣+Æ Ÿ—¨1*‡ U0sUÛlzxˆOö©o]E÷cŸ2g›h&€™í­Ó+[@m˜àw‹´+d4Eóơ•Îq~n tÉN v;ùï?æ(̃IgØ¥Vg¦k‘)'.äxFă1ÙÚöñăÇûq¿^¯÷ă.ß«uÅr£ơơEÅ}ƯæD|n%¡&ÍŸUn·˜Âl7Á.ÂN[2ùØ4¬g1’¢qß3ÖĆ©óÇư~ă nÚØ¡é„Ôư53 xy€ø¤—j÷îÊúóåtÉÓơÛ3IH"\Véÿư¸ŸÓäéù ¿|ùr»Ư<*3nr¦V¬—eâU ̣ÎhäI«­Ad́•‚µÅjÄeÇđâ MEÜ,²q^-ß<'ØsÚDNFŸ}Ø€ ́ølÙ/£®‰?b2t\¯×ûíÁóÈ)™æâ -6½Äư³éÚ°á¥tR:FmO®‰0 ༡v  ¯²:µ·LùeZđaÇ¥]<3í¢Æ\óă8~₫åg½Z¤“Ë ]tƠu œMy¤T \"‚Ÿ‘`VH{%-÷É tZôέbé¹ù†aÍSF*́Ó ',¬Ç×üH{è́ă×0ULvƯ¥€Óùt"³¹˜«‰t:çu^ij·m“MtÓ1Ç<æ´y½__¯¯MÛư¸o¶Ùæö ÷îɘwóÆÆơ¼w—=Ø\Đ®'Î5¿‰́ 9h¢*3Fià²yÖ.ÀûLRp3§–ǰ±ÖơCkO)U†´mÛ₫î÷w½^úëOÇ8¼gS9›ÿ±ç ¯ÛiĂÆrÜÔ‚§ÓWªÂ$ÎKß¶Óµ@f¹ñưë”)óơơUµÍ1fTDu»©*—ËÀÊmªÈ”ëÛơ~»‹º{êă_á»Tÿ€₫m§4¬/[^cVêêTHO†ñOúEB)y­ [p̉#ë1ºX ì8ϺÀú̀ܘDÿ>S1˜ÜÔù×$, ;c•`>½ÉW¸6(ÖH*†P̉GºÁ_5ô™T·}ùü²Ê^ËéQÖê#c̀–5"̣tyú»¿û»>ü—ỵ̈_XLI ½Tt´${dÁ+÷ß[—àq,Ô›Çq@!]Ơ¡’bº5kEre2;åoªÜ¸†z§̃¯2ß@Óơª hÆß¡ùâD 9áïê Ô‘ÑœGè…Ư× NùCTƯ[ß¶íi{B¡6)ñºÇ÷çeTµlÆr \çt»Q™!ÅdÖ́/¹₫¼æö©t> à{ Xlvo Æô€ZÔ–?çX-éeÖx³XàøK¿Ôœ÷VÜŸZ RÜ“Zt¢̣h\€Èúå>Á’ÇAí,ÿ̉–(ÏlQáç8ăØ÷ô¿ă₫˜M¦6Ơ®@ÿÇ8nûíz»^o×ưØÇ₫’ódÖNxZB·ØÓs?2MB>JS urXäû.îW xTŸŸø₫‡mÛ̃̃̃®o×l“Zcơ´“¹Æ£̃º‰ˆl~BH¥‘h«¡4³Cª˜!ÀSÓ››‡̉\‰\ătäiü„F ™3=>»wc¶9æđ̀5?x1¼q̉û4Ća໥µäÂí¤*¢s‘b"Ă&: ‰^ ₫ÛæÁ¨k&-XRï(©+̀ă­K÷ë±0ĐH ˜î"ể[ßlƒck›×ÄDÖæ¾ÔcqúM‡SÎ׺Ơ¸œ\CË.¼<¡•* ö±*˜#ÙY¼OUn‚Ywg%K¤făW'%́å¾jym áàU$MĂ­%¼…¿Ưç>m.MÖlyç%ik¬ &†_¿¿|ÿáûŸ?Ư¯÷¯?6ÿöùo×ëơi{âbêÍ̀“̀̀ ¾_îŘ;gyăđ£Å‚ º4Î+÷²ăU¬4:tH˜̀ăAU¸±M™˜T)öø­¸t‚+̣KR÷ÁtjïưååÙ̀¶Í……¾"o¤î¸­ñ$dƠ#̣ÿ‡w₫¸åI0;Ê/Pæ¬₫Çm7¯Püöö¶ïG‹¢CÉ+é¤₫G|…yxÅ:$¢.u­̣ƒ7¤O©_‘ơxùĐZ»ƯnoooöëZøßJöÑâ-Lctí4eV4Ή¡Ø£ÇƯJ˜x®&5rùÙâK/.A–Jg̉đÆ©“^đR¸ë\Å+-[u@ø)}¦äT¾½€l­¢ÿUSë§Ø{ùc²*K«»ÂçÓ̀ÆmăvQ„óxrKøµ¶&ÈüÈ¢Q!Œ813Ûï»… €;WÅ««qA”[5ÎÓ„¢I¥á¶ÚC¥£‡äfẒ…Éi©¦î.1wÑöœˆt~ yÿrÿ¾uuºḿtÿ°9̀ ÊKtqBꮩ#¬%¿…c¦:ù̀)"ooo×ëuXt#I< u·L<[TTu¢y°£ơ´àa ĐŒ•±ÅÜ[È+c#›™¬‹4E…ö…¦Jƒ&ç|[ :µ!-ÀYUtY6˜'½Ôư“h@Z‰jB^Éf· ¨y„Dæ¦Û´Ùg§ ë̉%â§d§ª}ü~áç̃£å ¶V3•̀*•̉³ü‹óA³;Xk¨Fâ¹¹¦đ—<áX£t` 5d/•Eñ«z.V‹Ÿåƒ€ê k‰âúxïɇ?ßç₫èÊŸÆ!»D­G`Q36¾Ư¿ưíËß̃nov··ăíh̃?¸®Iä ›Xo]º¯:‹Z¸Syæ-üGµñ̀Çe¿°zGîJ₫ú¨êidÚ† *]ê2ÆÂíÊ ›,ï)C ¶6ĂÖ›öùó—··×c?$̉¸+Áéơ "5NEæŸ/Lơ?¢p2áÀ{Vº¤{Ÿ³c@¡‰§-M4>‹†b2lxE]˜éB&|´{°sc@PÄ;ơr4Vƒ«P§@JœY¿5xX”u#̀z*wWđ‘çÏ{¢0ơy4Ѧßÿđưo~ó›û~ŸÓ3€sê~øđá₫áîÇ₫Ë/¿TC± p W‚Oz–“F¨J Ñ‹üúƒÎ†0ÓcEĂƠP<.?îY¿¼Hn®Fæ¤ûçëkœÇvMư$W-Q`3/ïƯYĐ*y¸TüƯ8Æëë+öK=†êHê)4Ù4ø®nï̃ưÄ“-©SV/øÛø+÷ßy^—y\ø~V.ª)[Ù¶ïL èUª€»l—̃;ª¨°RÓ%àG‚¯Ÿ’S\cγX`)æ7bq¼o-cà¯jömæøÎùáă‡>´Ö¾¾~í½#ưĐŸ Üטc;#ÉúO2Xh)Tjq¸H1œÖ0<̃ZĂ'ÿÓ,ö¿µÍ‡$ơCʯ¿€å>{oÚoñÆ´÷3dW×ÀœÂ®^¶‹“¿ăXø\ñS Öùqôr™̉D-6@üßî·û~Gf0-v%₫Oœ<í9 ©ñ5µ YÿŒœÄ )꿯E½*ÙÏ!"ô¯V‘···×·×:Å\“‰+ÖƯü₫t³ºiÉ‘b“ôƒƠá/à&°8̀qŸƯ9ÈèQ{DƒÔ_¤U䇳hÀCrÍútôï-Ăæs@6“̉ &Ǧ½£ă,`ÄÇ¡y óœ9f“x€>‡#Î4s3CNçÔ‰Œ|svơĂ*»úCæH¾Ó×J¢4̣€{°ơ nÀfôÓ×›©S\4<'ú?;gWK@̉Ù€˜jŸfª&N –ÛéD¯X‹fÆL9̣¤ Êç%ƒ!˜ .‰Å:”đn‚p`MP‹i„CÂâ?'İÏư°ƒsÍ­’ŸT„,}ËÙụ̈åË—/_.ị́ÔŸû3 ÑÖƒƠ~²'ØwâƯ,Pâæ̣ —HẪÎËP/W%U¸/ñV&2å#­;÷M9́PƠ1‡ª"ăœç4kbrñ,ŒØƒƒ LLăøé/™Q*×óL_–lZüéO"Z@$»¦â¥–H1 T¦•Ût±íŒ̉´¦b¾Q= ?€ø×iê³ăơ}¿ă<ăÅ`¹\¡4uBËíQaöîC ˆ¼÷¾ïû“—‘úÖXfÎHñ:Ío­Fê²Áy‰¦’Ÿ>~zyyѦ۶amK𬭵Ëåéă§O/3 ;Ôók¥@]LJ b@,zDpẲ.U;s: rK¦ÁéûóIf¾^!œàPË­hRkùÉC·ªœ‰2+}@Đ¹ÜÂ* ä^¨Íu’Ă%nï›å=₫ïñ‘WâŸ:\g+]]©jX &`Ä`ùU8f5₫SQ¾U)éÔHªêÀRsmT'­¾̉çúA™S-'^pÙ.Àu–Ñë׸”©<|J¹…eg‘ (›¦–H=“(NÛ6d9´Öd»lØ›̃›vơă*q́Ç8»äøÎ̀¦X@hX”NƠÚÍ02Äê~häïnmƒh ø œ£Ö—¢YG ‡Ă°…{P‚Ni§|=i[öÇ4<<Q¹ƯoµsV]fØ̣YÜóđ±ªĂåºß&(0jj÷ăNèáëœej,¼Ô¢®3Í/GUKÑIå¿d÷†WÀåíß·eË;ú×Üœ2A=8ê®Ü«{§·æºJóé̀–xˆ`1 [K‰’g P v̀6»ơä%E´€ƒ2¯₫g =-BÑé9ƯÖŒb6C4ĂGi­¹5g£Æ°f›*Ñg4Ú¦.'(mYƠ®t×C#À<âÜPÖ3\ø©H !±'QÊFUÍ@D_¨("(ÿ~úfC4Dä̀‡®ù%Ùx5 Ù™™²0I9!pD¦¸¹‰L3iM#PÔl© Ú™¼Éœlu€ÑÊk˜æÓ†Ƒ>¬º¦%Ç×¼,Œ:mQrøMtVÇ¢:2€öªIÏÙ4ƯmçÆv;*́»–î9B•Ôz<¨ª§̀i›ư»üwÿø÷ÿ8îăÿơÓ–d¬Ë¼øÂ¶‰\x˜^,V=`R‰ÏzII5Q¶ ¯+8a¾°h₫‹n]»3îÑP°v~Ôº…G5½‘@HrCļ´qô‘ådI4±Æ_1ư˜pi°,óʱÍûå Ö}G…H ?kág†²v9ÅÄ„MÉüÉf§×0¨5£…‚ @™øO£Ê₫¿₫A ‚¹A×wj9—RÉ„³(í(_ĂU ̣¬iûù矿¾~Ư÷ưÛë7? fÀ—i¯¯ß₫ơ_ÿ08•Ô3ḍøú€0Âle÷Èù‘ú_WI;€ÏJ ؃b§Kî2.ö|AœÍaæ‚7ÑĐØÔSœß/ª,Öơu/åªbÏ=ú ÜÑ…Đ^<¯º<Ÿ¿ï ¹ơËÀ߸evVE ªî̃î7ûµÇ):ZâçZcla9†Eóƒ–s¥È~¦¼>W ,ÀIĐŸlÔBd滕ÅSmëØV!hlÏé¤LËœù®|ÄÉq:ù“ÆóQ…%ö%b1¾GVâ—‡¤¾Ú—/_ùsyºˆÄëP¡À Í9]Í24¢qi ƒJÔ*5C3:§ZÙ¢:Ô5•Đ_ûÖ6‡ûê@?¦ù¾lYE•êâ{æ₫ªhÍ÷]"›ô x uÖ´¹ß÷̀ü4§±˜|.đ?äHéÚñØc·û QÔĐC#$‰½]#5c›ùÁbÂ5VM‡g´ḷ•è¿Eb~ḍ`!ñGî)üRñŒ‘RøA9™yÁéESÜ·€±'’‰ˆläuR`€,:5„ËßOS„¾Íû&à•8̉ jÈúˆDcơØúÔÙf35ôÊM§Ÿ²ï–qĐÛ Å»ö)ÓKAimƒµ Öùà1aĐRà„)–¹Î¹Ơ øÂFQ©–o£¯¦H,„€à»â‚y¸Æ jÁÖ³œ—§ªsL_̉T´[G™ ”‚Kà”[ŸmbCâG¯¤­k?YRY®§‘¹\.OÏO"r½̃9 ^bÂDT¤kw"\ÄtNQtơsÎ!³É™Sa“†Vø₫å眨…,”̃R”¦Ë>" ¥(ZPó5̃m½˜Û`ê t‘©¨ C­̀:§Qzô ̃ |~ƯçƯÛ>løxưz½îW¢4·éƯ[l²‰‰5ë½»#Ư¢¢nơ׋Lk·üÇƠzøACŸRµR₫·Í³?i¹U½ÇÊ,º„JP}tôaL _â%A1Ô35@[ 0í¼]ó¬q¯eÁ(̀ÔpF‡jÁ¨û×qÀÔ'¹Øuë›—Ø”-°x[;TQĐi„‚•ðv=ó53 g˜¦Kñ‚c?œ$ÖŸbE ”^É 'Aơê:¡ M¯·ë¼NHcµˆ%đưưzÿ<~>ÆQ<ƒ]~n”Ü |2µ‚ô_æFé̃̉“‹Ø4£jƠyXÙ‰ºĐ6I¨Ç^₫H³©E:ü1¡ËzªÇ„sÿQ ‚8­XƠđ‡^bËÓ~ÉkyÏjHLhQfWv0ÊhW1₫I”̀h^Ư½÷ççg8,VQ-Ø#§¸¼ —¯P̃wñ`Ñ6Ú´%´ÂpÓI5đƒÓ”®Z…₫eB%h́¬;Y V6Vw Ö©!¥(ÄÏ‚ºơÜbWÏØ4VëgƯ”ܹ¥$¨4é­1ĐFUqÜ÷û1ĐÀû}Ïêơ$³göüªôv­üSñÏ;[F—_I”‘u}Û 2h­¡Aó€™9¬}sY •?h½Ñ7`x»E‘ÎÓ₫¡ÅcYÏ„ÿ³€ºRöÑ;G…ׄ́ÇôQç‡[q!ßÿy:¹“Áß"Á—¡¨g 1ÇW²BW†dteujÓƒé‹{lÑŸ W0¹‚Ùôs¢ör]Í*‡iE9—UƯ±%•Uø'u˜{ÓL0‡Â1‚1=Æ‘“„Đ¹­²”,ÔÀcÀÁ™$÷F3ªm6W¿(0=~Bö¾^%Ñy|ÎbNuT\j äí¸'Ä*2>̉c@*̃ç ̃ˆ ˆO”×Ó+S“W€«»Ÿđ“¥£B–‡¾ x[ôN}vëĐ·©œ¯KL9́ªÑ|óŸŸ÷»¿kMÿôç¿̀·k,m± ́¤;êB| 5²™Ø05i‡B­ØL¤é&:£d|×xÀđ}÷ƯwHIüóŸÿl£ÈÔ¸ÙV17‰F&°2 &O÷âÔù´Të¶ÙT”ƠèëÈÜç½zeơ;4• [^&7Càëơë/_y{}{Ûßf©ï–çAÍL đ_E ü…)LEŸUfùX’ờÊ“Ă©Ë= À{Ô¡*êζ:·Ơ³¹D—2Aơ¼yDíÙÁ:Áºy}0kƠ9(€›²luÍ 9+ xGˆ($•°µôñ GMYñĂíÜtĐ?¬J)$%ø)’°!¥’µ·Fé®-¥̀Ÿ‡(®Œàc“à x†ÙâNàÉ? Nàçœûî…íª!€‘w¹‚^¬Ăø+_Ed»l&¶»ŒLÓUư’®jÀ"ơr;óô!_å@—qæÍd0Ø’¨¢¼ÿù›»6må̀IvÙ‰}'·ª^meeå»ñ€Ye-¡³¼¼\[cơÏBVP HQo™—åzÚ•>h­].—L›a©̉ ïe œ/5†́‘nKÇ+î¯ibxYöL©̃5á¡Ơ‘Y=ÅàJ£vÍ©ª:cÉư¯«¢®ÆØ”"…"eÊú¿ßï¢̉·.&¨IÇ>÷Dÿµh(¬v{t;ư{_f­uI”¿ơ­KÔñŒÚÿ5ñ÷TƯß¼€~{©eÙ4'½zË•n¯ơ=ĂÉ©@ÿ^ÈL  ŒAÁ,¤G¤“Dü„ûqGˆÂz‘ó,çBèÏËH6s 1]Đ̃u•WÑâ₫¥ÙIö rñofD"}+gĐ ưÓT!Xöx́SUƯh¯ó"Ê¢1És—¶¾†!ü8±á)öô à°zC1°Ú^scºüæœ̃$;è43(àù ó?L<¼‚L¸ÉÙ·Ïaˆ¢¥5ÏgȆ&Cv–¹Ñ(â9¢­µ>{ ¥Í᫈„Û¶FZI[­bĐ'XÑ$8Έ¦Í­m€¬ơ$EÊË¢û/XV½|y~ù‡ø‡§§Ëׯ_o··9¨”8¥ä˜(QRV¤¦9MÄùQ>·Íl9­5‘9-"ªMÚ?₫ă?₫Oÿñz{{ûù矧,§̣ œ̉HTó”Ñ„ ̀ÖàrG&€'}j±øîœ½Ï;èÏåmW-ưèŒH”s `œ{ơÿ₫₫ïŸ~ú©KßÍÓbqZ»»yáW[t9a{8wn=)ú/áéÊêñʱ%½5₫¼™‰uïîâ¨1+o^—µSW=M#k"3Âq‚CÛ3ưPô*æƠ½F·B°•c°–(G…jE_$Ññ‰è.<£˜{Úü&€²Çñẻ.ù²:bĐꔦp¡4°jjʘùWVB¾`U,p¡¼́ôLE!üJ¿³)—„^KX·ÓW#½XæsÉ{©ók¥áˆüøÛ[kŸ?₫úíëR T–…Hv%“;ó¡åù‡È½\ƒÿP£ü%èÿz ÑPTÓÍu¾°éUó\×úX•9Ë̃<Ñåy¥ï°ûËËNu´¨x Êùh>#Ë•³’â‚ÑO>…-›ÔB-]­ç—´¸ßÅ »G-QÚî!,Ă¡>}SÇö‘¡ga™ï¸¼‰e½ÑÇùËobN™æ›íađ—‹Q×”ZèÑkê´E‹Ÿ_wb` DNT¿ômCƯ¦>æpô¿ß÷}ï[ỏÆû¾ïc‡–˜§†k-k€Zé À½™M½ÁÎ9o¨*mkÛ¥_ºöM7Œ^j¨b/yÀ- O-¸?Đÿe»@öƒû¥¿—ۣغôÈ÷Wđÿ^d¦übôđ•ƒCâM¾?½Ư«ûÏu²l™²ºy%”̃¼̣XE•Ư_$Jé$zéôó{ ¢œDƯª¢BÄḯsËXqµx'ó{ÄÆ]¥•XxñÑ[1YéFĐĐaçqÈ2{Ë¡'«È0”¨^f×0Ehư”m)PÉêN°\ÀK¤ûúP×ÇCÄdd O|5O\L¢¹º0Ñơâsp>¼´1úT èm¸€@jΨ³̃fëÖÇM´₫Ç<ШyL¼¦[á &§2Ûô„ ó¾î>¢<èồăÑƯóÁ]#àØÚÅ-̀ễăPcI1®ooÎ÷ ×2̉¤ªVz SÍ-:ÅLƠ0Q*^æàÈTT:ÑƠlsØøĂ¿₫á¯ư+|¸&íùåùééIDöû~¿ßA›Eÿơ{dăđ¼D‘lmØÀ,×­ëgÆÔkzØQODúZ{“™gÏh)¥—߇záv»ûѵ#D#*Úô©=Y³Û~cl1r‚áÉøa_ĐkI{*ÚtÉâúYºØœÂ%e‘²ê*!U-ÑÅK‚²Y5Yê¦4¿oƠ"=¯>îïă ÅàAÊ™&µ÷)óz»ÖS₫8ÏM ëzÆØƒ)=&vßïCF ,ö²5¤â¥Îdº‘(æ7Ă ¨ÖwLă6ÍT²ŕO±́%’Ẳ9Qú¯ÏĐÁă#YI®°á•‡Å&ÆJyO”鬘Û}›i±Đ™Á ·Ö~óưo¶§í8¯_¿bú M©ˆªn—MT Đ]€ÈĂqUW`n«"IJMKü%¨G–bf*½×É5×öăc}̣äPµÂ %®s…ÇÅï«É’*]£UNß¼¶̣Yơ’ñW!Pó–@¼»XøS–KÉH¸6đ·îÊâT»‡—q(ÅÅJ\pœD€₫÷iZOÆ¿•æPîưK’¦¹Ñ<°Đ%ʪp$Myi ¼zG₫]V ˆÍȉV‘S?Z1̉±N2²\ ÷á}ZkÚ½æ´ úOŸ>].ß^¿}{ưv¿ßkc{»p#̃ÅvÊ2đÑ•½ÊĂhƠêyj)Úµ_Úek›—÷i}Ó­¾X®̃ÅưEư{¯̉Ïúm}ëÛ‡¶mÛ÷}ß÷ŒöMSm×\KûŸÜ€₫¶ˆ±xyŸ1\î_êÁ  Ïé/yơ¤1˜˜‘¤̀:q¾Ë<X/Ëüuw,%ưYĐ³—2ÿÑ–Û«û#JŸÂôÓL%ƒ#!s@ÉÔ¦~ù%1ºFŒsm‰×]._Ç‘ÎaBÿƠüN›Ûi¡po[ä8{ÛdB ´£̉,bÚ”Hóá0` ‹mĂKa’‹¥Á‹÷•àoÚd €÷7µC„½ä“M<¹”Ä*Ä=¤!Ằp̉{‘AQË::ÙÖ~Q5 åBŒkiÁLè³#™àÑF;́€ŒÏ›€è̉Ô S%J°rư{´x DôIè­6¶¶!2`æ xfœ8'¼ëơúç?ÿyÛ¶·ëÛÂă0ñ«æ¿J" 1±™(¼#`ªª¡ÓÓ†@"QæXM÷ë~¿̃á2‰få% ½o²k<}JrH’…嘡¸pF†®ƯHåJ´,P‡’ËÁÄ6ư%$Bù 58l¤Wbåyè;©‡˜&»\.Ömê¼÷¬ĐÜçE.fv‘ QQZÊkƠ‰-0‚§ơiç«oUFRå?Ơ¡á)=áßbf›´¡£(5¸ù)¨ªNOĂÖđcû!=—ób¥¯ÓŒn\vư»&Ĝ˾ß.Û”¹ï;È^¸Ja܉]këM÷LBHKb(È-†Dy8ÿà]<y.öƠ«´é˜ĂSÍ$â-Q¯–€faY¸rP)ÂÍ8oRlº¢yÊ…—pAdóơÿ`fÉÿ].—ççgûüå3̃ßN1N|Ÿ ÎÄ-o'VN=NŪ©ê¶m¥ÔC¨Y•§ËvŒö‚Qba.†ÚX{:ª${™ËrH1=7Ñ%8y_±UO±9'¸_Ñáâ&ˆœ̃¹…ê™,V´È„ê°scpÍ"’¹ƒÑN(`HÜK)bÆk«í/«µ¯ô“U¾ÖCư‘ï&[¥YƦ"ª" iuÏx'—[”,›ˆlÛöôô$*·ë-g¤í¦¬%Z«¯Ô3…ÇăÂ8Ï”¤y?™S)8É¥ê'¬_ô! ưKéÒv¯;²Ơüá·­ưđ›¾û₫»ă¿ûùo·ư5)W—;2†DÆ£,…k̃]œ'ߪ6 %ÇÏÿđ̀‰û¯ÿ¥?°•ç{jưùè½o}û • ä—gjăƯ‡-F2ñ䜠ÿ!ăÁ(¼ƒS„Đ6½'Ú1=©:¥˜%™Ømi„¦ <¸;€øh7„ơ=[C5÷yÚæ.AKǀ߇YYJø×Z₫e%3¸X̉«0'œv';Âv‘©Ï³N²€ÉxV+ú”ođéÛ»KÇ 2$ÊubÆ“À¢”•»SQn€«¦÷ûLUT¬fNJn€º`@µ°Œü¦ee@è¼ơs$Œ6fT4gn¤rtåq3¸*×äÙĐœwrÿDÙ½^l„Q-Íđ·3c] 9›‹AøæC§¨A¸ ƒKép‘n#XY©·5GÚèøn¶1âaQ©kÏæÁr¢’Ÿu»̃₫rÿ‹„œ zG‹y,4O]LóÙhÊ¢°u#F]œÇ^rMlÚư~WÑ9R¨#ÿƃȵåÁ\g_‡!öcjä8u1w )q¾Gó³– SMjưÜj…M`°ŸÚÖfŸ»́:ơº_ͼư$ÖöùÖ6B€x]UăWÜ´yIEÿ#²èÜNEØùép¨ü1¤[?ôàNÔØCÔó₫óTOŸ}À üÀ>}½™ ñ׻™rÙ ô§Ó X¥‘)£ÏdbbG+B/·ƒ‘HPl QR€̃%ÀB¢âÅPH¼'¨F{iæ@¶ °heidï´ó´¼™̉Ơ*~º½̃¾½}»Émß÷JîN›—~13Û đß̀º¤ȯª́à…æ7^n“EóMdÎm«¨—»QÓcIŸ‹ç«ª£ÿéĐ¡*<=rÍÔzïË‚9MVÔzS&QØÄ ƒÙ%¹;ö[¢m“̀ XB Àëx¾µ|Ơ,r¦àÔˆSCLxäF ±¸à8æœ̃kŒ‰ÂH8n. R «‡åAÆâÎWúSưœÄr D0^^^¾ÿá‡9cA ̀ éø¡¿ZÁk"rÍ`Ñ‚)kƒp›öóß~6¯oWL"́?ÙV<è7Yô)Ơ \Đ15Ó&D¡ôZj”€×Ï÷±(ëÎ</iCˆø©ÿµƯ•mÛ>~üxÙ.Ÿ?>œuË'ŒæÊ·Đ¹%a%̉œ¤w%iA‹ºư„nk6a₫yÙrnÆăúáœ>Úü4¹%ן Ü ̣Ăb4*=Ă;ï*­‹×{w̃§ñÊU[S‘#jñ¨ˆH7ñ­¤*†)·xy~ùđáă8̃ºMÛ¶m뛪J̉A­Í=„YÛV¬Ú¶„xœ2jªÇNg2.9îÜt³kû¿¢üi½aWîûî07¤,f†.Ư¿ûJÛ©®Óæ8ưr‚'ơ?Ï£₫sBÖ„¾ iƒæç̉/—~iQCÜk}j‡ûïÓ|3å7º}-`WUUï÷;VÔÓåéååELÆá́u¬Â…ô‡@q µ:ÖgAÿû£đ E0Đ_̣eøQ/?Ü6¾[5,•LÉ¿*ñœ‹¡k­dú] ×dzÅH³óØz{~~~~~̃¶íz½¾¾¾ú[!₫+ôOËVL+Ÿ¡-]P+v₫Aµ¸ưđá‡1j&Äïm»$̀Jß x̉•~cáÁ—œdă+Z3<¿<÷Öç˜û}ÏÓ]·û©ÅăÊjö@ªihÈ…´à>û°Ñ†—åIuMÔ&Ÿ¥††…4mÚt ³‡„ây¥pÑÏ+đ¯ óÛïÚÖĂXÏÖfë³SÔ[?æq̀ăzgÔ´B-!îï©M§'¿â¸A¨€˜Œ¿‚Ÿê½0l s'U@pđ@,Ë7Œzç¹<ƯWˆÍđÖ4• Œ ́Xn¬ÑVV6דó:‡W:Ï_©èÊ‹¦Ê\ªTµÏ̃fKà_÷±ÄäÍ–(¿Á‰YÊ]ªÙmÚ.Ûå?ÿ/ÿùßưă¿ûçúßÿÿÛ?µÙ6Ù$|γ¶{33›}bNÑ-Ü eNHÎ̀l˜#?M£Æ3¯s ¤¸µ¬'à—}RH‹ˆxÿæ-fÙ·÷^ Vú™lÄ^^_Ää¶ß́*¨:†pĐ‚Ă$¯×jÇUÀŒ–¸"¡Ăn€æÉ?^è3 q,ă 8Ă²o~&¤6(AÉj-̀U´kË÷¦$EA¾’çÅXÁ½£T+>ÉÉ5³ëơúùó/Çq°•­´1Á€&ÂuWƠăäéå©·~ÇívăkK9Çß½~{2ÇuåÓå~ôKb ¯Ø×5…L ÑÉÊ+Å‘«?J(ï ¾gia¦F`ÙÔewû‹Ũ÷ZF-̀l‰bn§7¯/̀´œ'­`Êx",j²₫âŸ^¯„RƠ3ñï<·úèñÂæ(ù ”5Ÿ„Îä‚Mp*!p Yæqú>~øx¹\æ´×·7đ®Í¥0ƒu„óͯ¦M´!Ư'…œÅsÀ‚i£DEMß^ßî·»¿Gó* fW$“=œy–¥Ñ˜0@­‚Ó§2›´Q¢yps«ºÆ¦îư9Ö ?kÂUæ ú_Cÿ?÷SQ´7bbû±ÿå¯9æñùËgU½<]<àp̀cûÜ÷cíí’Xr-*G×= ¾ÂM0N‚R?OưÉq¿zg_pü€ ,î ‰oử/¬ù“å>‰ü£Ä¯mV§ˆÄBÙæµAô¯²Ÿc[ḯT¢Œ~ø÷–¢ÿª†̣̃ÉÅ„æ=Tá“ †¸)L÷5&UñŸ€nÓ®]›"=Z#;?鉈hñ”d¿Ú¶ị́|y~zn­]oׯ_¿îÇ^ÆÆ¹!²9"Åf­†²j‰H‹C]. í@ÁÛ‡íĂÑ̃ú>v`SGÆ…ø¯4<ñ>5—~ ä›Yª]û¿ưñăËÇ×××?ưñOµ$7yé­xç’£…VŸúŸ1¼YVÏ¡Qu›¥x®ˆŸún¦çräxÍŸéUOˆ¡ư–F|ÖH¾Bơç¥ÖµC¡Ôµ{( \‚c‡Àữÿ/ ‚ƒ -,i` ™Jóđè̉df£ÙcçÈœ67uO€Ûr¨óđ®­v¶„§gÿô }ñf ¨¹¦aOÑ·M10 ûjN/Û vpØ&]©Á‚¿ë§ÛN~ÊUÎ~RĐŸD:k³6i²‰E#´å¦:́8æQWosưÊĂBÿđáåĂßÿ₫÷ø×½÷qŒç₫L¯̀Bœ|pó₫à¶épŸ×åÖ…¢Ư£4’Û—a‰ö]ª]SÅƠ‹•QOGá™:™ë­ôN^qAè­‹Hư£‰o Q¬ˆ1 U~“µ2‰9óèwâăji+ñ¿S§~¦ª* Ô₫´=mºm²Í/íß¼¼O~ú8µÏ%aÄƠÏ<ăíí *ß1†MC¯4ÿWZ›aHÓ˜%ï™c(¥Đçé›àY˜-Æ™ÍárÄ\³ÉIk‰¼-åe#ÜÜ_ŸÜÚæ"Äâbáùê às̃÷̉/O/OÚt?ö9æơv=öcFƠQ²?$¡h6ñ—X¹6;áú²ỄÚÓE/ÏÛó>öëưz—;JùÇq:ăOK†F!àq†”€HreÇ(‚@|±Ëw?|÷ă?n¿\₫øÇ?2ö₫7,‰-¹›Å§ƠHù¬ä0 `4_@0è©ç³¾oɲB“!ĂwN%¸l­‘_¤!®d´ÀÖénÀ́€₫tÆÎë ¯W3l€ă¤ïDóm¡l±èº ™ ‘E@ÍĐL X9uvéb̉ZÙÆ³đtP cº‰,p<é̃Ù!N8¡dƠO ̃™ï±)¡A ñ$«g̉é£ëeWƒˆ×dѨ_é=Ú¨né±aÈY}ïvǛ<9D¨xØQ§+q^Ẹ̈„øåó/o×ë@»̣đ¨¥TơaƯL¼-€uWYdzP€¸|X¡=%ʤU)0'Q"~…ƯW`‰é(±/=DD§¶á»,"2ÛÄ)Îô,@·è Ï¡¹ÓÜ=UÔ”EB1ª¹"(ê{…®B`ûœzTá±ăÚä,`= 3Ơ7Hs-}˜‰ÎǘS”̃rá¸oï+c…¦ÀÓ |=>˜ÇV¿ŸáY†¢®?ùX}÷©½¶'Ŧ4TÎB«-z1ë·iÓÈÏ1_5–9 %̉"…æWS; ₫9g†AÂLѨ7²˜1øˆ+Ÿ$&g¤z)ñ¦l)¿F>§đ`Q‚f /Ư“¼ 8‘ă8®×kë­ơv̀cûơv½̃¯÷ư~Œ…C¸Ús+µ¼÷J̉U^̀ưImư?µ' fæ÷”₫ƒ₫¯ÊŸªùñR?ƯûW ¶DT̀†Û~³i®ê‰´]Ïj#‘zÉ}̣×å#ĂiÍ ưçD)‰ƒMsmƠô`Buđ*I¡µ"péùÍö^è%—…PèÓ+đÈ@dBpÉQöYN:ô][ß¶§mk›ªûñöö††ÇiR"Rççfl‡ FwsºœûºsÏ¦ß ±R Èöaû0móh­ơ§₫lÏ·ư¶Ïư°£Z^ Nëz6đƠBå 5ÏϹÍí¾ß§XÛ6GÖ2b‹⸀̉²À³N1³7Aít°Á̉Q® Ó“i8÷ÑöX"¸Á¢é'¸{IÉâo¾MƉCsÔp%ñïô¿½ơ>:’†UÔ¨ªƠ<¨· âÜ%5­ >{6 °iY[Ôóå Ôâ¨fåbOKYON&Ÿ±”$¶h!—½#˜bˆ³¨K#̀‡Nđû©®2«V†Îç’ɧ~’sW¤®ª́øÜoTw=năö™I“·U\éĂúßÿITÿúן°6ÆÍcÉ£ov‘K’Q¾ÄrjÇM₫¥xj/LÀhĂF<f„>­¿I+r÷{4 ¨@á Å•5yTQê!QKÎKH8lP̃ÇSä[s¦?m}ú̀Y S»ïu{jÎS>z(y*!Íû­¸§¯‰uëÜPÀzL Ñ ]†Ă9b> Ï₫ÉC@~ƠüœˆF}îÓ£™uëñJṣÊm±«ÇyáöJ¦ưŸ¬ÿY»hăäº?‹)>ç=îŸç—F)ÛôÆs$*½ơqŒûmß÷£EmºW‘zaRñJ”Pä‹-JQs³đs}9•ÖQđP’¹ëlJf…äG×{¯è%9+Z»º³Î$.ÅVÜơ‚)ó€›́åGBØe»N`æi×mÛ¶m»̃®¯××ëí å'kÁJÖŸcNG4wëJÿ7m—~yÚ¶¶Á¨¢Ö'}­ùăÀÛÖµoÛ’́K¹?Án’q&̣,;‰×Ãç×ư×è EÿôSêC¹ÿ°ÀæK®gΉNÀ5‡X¤Èºb4HŸgêB‘¼Rh÷Xâ“ ,óØCtÖºLó[rº|mlúüüüôôÔZ{{{ûöùÛ±grNœ;–©†ư‹)«éU‹7–á YC¦ơÜáá°=oÏ@äè©v̀ă©=}ø₫ĂÓ‡§cÿíOÿíơí•Ä3ưY ó8»†hëV§—Ơ³¨o£6e¾íoÿü₫ó¿₫á_›´û~1́¼ ª±BëB³Îût8Ø"¨¿M3o ö ¸]K÷ ¬'¿ló₫ ÂÎ#ÑE\B„ê™j’µ±ó ²ơđSu€Ư„g̉fC›äcX[ûØ›¶c‡đ† dSp(É’Bnåù®´Ó˃¢$(e”iÑ%Đ9kđIZ̀ÊU³˜§ú).¶È––0Hd†¸#‹cFMg¯Mv‘à¹ü:+1\':³mÚè\D Q FÙ3=TÁ¨(8%€®ª÷qdσ“ ¾Ñ~-ióó/Ÿÿ·ÿơƯ÷ƯW—ª‰ƯæmF±&₫µÇÎ́æPƠ¼RƯư´5)̣Ô½Ë̃˜$˜ŒZÇzQ¬x-Ç0T@ˆ¿÷̣ƯËÓ ’\@UyqÓ1G×>³8 Lw†8¾y /¬‡¦Y>?| ÚÁg^‹iÉ9®ï“…\ƠñtVï10eEN}í‘`Ÿö‘äÆ+wh >o1²°“=ܧ˜l—­µ¶ &fT µH4¼‡¶. Fë.èó2€kËN,Iº‹“w,4$Ë?pûd™X§í±£||Ñ?äa8&`.êiió́‹ø,¯ëJåF+ˆ¿ºï–ù_Ñd=kë®×­ñ7+ÛĐí\6Ï B´¸JÆD »¯§û¯\ÏûTƠf~oqº Î,%‰ƠFZjYq‹‘. ơ?ÿúåëízCŒJU»ô%¢Âj‹taw̉µsTµUjTµX#¬ï¤i(ümKđÇ9(”7çƒvKs¦æZ†‹¥x ỔO(Æ6ǹȄR^ë¾£"Mzh²¶  WuVöcßư¶ß®÷ëí~»w¯Û6O¨Xœé̉ƒ"³åúwi—.½YóJÿ•ûïÉư“̣w¯ 4ù:%ûVíï%†r)đ¾#®̣}ÍĐe^Dªü™*mG•úxóă€ÚÓ¥éc7IûYC–È‘´K’}qüGM‰â~ O-)ÅôËƯ«lzÙ.}ë}ësÎÏ_>£,²#r‘KFV…uù¢¡²†>Îp ‚UT|r U2+ŒV«Æ¾¶­oĐĐ÷Ù·¹ó0µ¿ÿíßÿîïgj÷ë}ÜÇ>v“Ä^¸¦)Ió̀Öp]̉ÿÁ(5£Aỵ̈íË··o[ÛÀw"]Ơ©âÊ»”öÀÆâqQ¨Ơé„–˜Ăûy™tíÆ÷ {¢( %ºú,‚ª­Q¤ÈøœU‹B¥µFŒ›₫=ă(~2t` AB¸ï nt– B0úØ$ª©q­sœÖ€˜áÚa¾[o§­mbâ®Q•²Iô ¨̣rđŸ¤ưZûñ7?>?=¿^_ùù₫1´Ư舳nAH…V§ Á©ÿ6èÎ½ĂŸ•çyÀ³å“Ûúh ÉE₫đc³ °XE=̉ǯ¥u—û1¼ạ̊8TX¶Ỡ÷ưç_~–è<{vƯå(î\¸X¥…—5Ø:˜îA?ă§·úrur9Ë•y׿«‘`‰Ñ]êĂƠÅ«̉äN¤„µ$)̣+Èx3cl¢ê¶­f'”r,`"b¨­%‘đ ~çn#—Ư9óWrí!UĂÏ€U~¢çŸ.OOÏO×ëơíúF H’ưô *Ä/X‰J¢|¢éœp¡¦¢‰ˆ!q|à~!OªÙ,̀Zœ N=ơô₫Œ¦hu:|«R[,Ñü1O&3–F!/ ÷ 3Nƒ³OAшÖođ₫d£ưÇçÙÈ…_x´?•ơ—/rkW,¾´¸ÎÓG/­ XI¾¬®m€ËÇË#=Ûí: ¥́››3– W [²µ%7Ö|É%áå©o.¾-‰|Y±l] |Ùp *Ö9{ø•Q\ÉyÓkˆ&i{‹cXT@gß ß¢äG̀I;́º>É=^_ïư}ç¸í·ûư~;nà₫9~W ‹1£åÖ8v©|úgŸ/Ư¶.Áñwwºv&ơú3½Tư/Y¿I–·wÿÔf‘ŸÈÁ ©ÿ<́đºŸÓ‹9> À ûXdH›c˜*øÉÁŒÚÊ‹;Á"?µëïô·‚ø%]ÇÖZ—Êßs“fæ}­wԔЋ<„;4Kùh“æÍøă¸ßïÇqX͹§úÅb¬R:ảBÙlPđh¤tà…xúă›×”„(Y­µ&*Ÿ?₫îûß=}xú₫å__?¿¾Ưßö¹{®j©”’‡F%LY—™T™íêñwphÖà•stöÖ7ÙàÁªué Ç‹óT-lT+ƒĂí¤»ÎnƯs"¹ÄAsLơ¦§ÎÀ1M;œ~€×.)¨ç.ûNă•. ·L.B5Æ6›6$+ƒơD ¦^2HEÛlC¬ƒHøNºL'â-®•jÓÛHYcyPë6fdñŒ|€.]Gz(“iv†Ư ¹3Ư´ưö·¿ưñ7¿ùùó/Ÿù̀çë‘¶LPäó¹Áj Uđa©ƠƯ3Ϸ΋R¨ÖP7ỊP-,¾2ٱș|}\HWîïv8Ís>*z<Îb0q³'ó=m̃Ç=w¦Øl“K=Ϙh›§f,§3 “ ·î¥~¬{ê%e9Aî¨x”ĂDEqˆ¸₫¦í~¿_¶ N#Ô]…ç,úhíªƯ©ă`5ÆJ#Ŕó¿ªÉáâzVƒ: T°"–c’¡$–S+!̀ḥ逯<óÅ=¶˜rÈ!S6ƯȈÉĐÑ­ĂÁöT#¦ZÆJ˜́ ÎƯJ#;Ú¶~t‹ödơ$ăë±,'[—Na)†'ú?g™£· Wlb ]=„B[h$Ï`ʤ6ZXÍ‚‡Y0¥ê‰To®»Ç}'*h‰̉’R æ g6ξ? Íñ,°/×í©QÙƒ¼Đüü/v¥É«…̣Û¿©qç°̀ʸ›,?̀…VQGd™Wf=o$Đ^~œ,öø(²́å5ëh¹›§‘RÉá?¥JJDÀÓ-ô±Ÿœ‘ü>p|åéxåu@ø&î„D·Ăå q.˜º%é%!ă²Jc_¤†ä!•¢Nư‚´XÀ> ¾Idi§ˆæ—q÷Ûư¶ư8Đ̃Ơ]gÔî]:Œ#Æawüª}Ó­Kg¾/ư¥_ÍO+Ü|éKM{åDç³Íùô²›Vrp‘ùÀ,ˆŒ̀q*øS¡¿£ñÑ£Ô‡™ÓüÊÔáY:WªËq‹ö2ÅÀṛ AígQÿeº7–ÎAh9•©‘éX2bIØ8Æív›–‚Ô+qwÖOL½T/¨61eK•˜$a*`Fl_̉̉l0ÁM’*PWg¿î¯Ÿ_Åä¹=}|úØ´Ưû}Üy 7`Ạ`ă°dgPhÖX&ÏÄzë.̀jjfûÜ]·3M$à©¥Z±VohÚ27¢Ô†÷¯ME¤[÷¾]è+dF-PMÉE@mh íMoÂôi]<@Ñ­K‘˜CÁ< x5?—µHm̀¬à×Ú²Ñû́MÇ E₫;½7¥ø'@o“Œ VÇXø¾fÊ_úeÚ”îme,z*3 &mwH\¨ŸK«]ÉçËåûï¾›f}ë¨ø[×@=0˜¾Ük=5 ±6ML‡Z·f­–J Ơ;q!}ë?~|zzụ́åËŒBoÉöÅ!áF£t Ø©%'x–LK <́ïí¸UË’n˜Œj‰ê Dm njŸ{†;zÄé¬|E-¼”íÅÊ7ûÆîtz3!`̉Q”ÎÛY^Ç—o_ö}WƠ—§——/M4Mú®cKĂp̀÷ ÿƸº§gIjb$[äôfn€fsoÎe™mO‚¡"˜ZĂ>AjRÈ@%~ËB₫¨đĂ.éÓäđ4ɤ)Ç8û3v¢;đd‡,z0±ûữzC.D•Ÿ²{¥Tûá¯ĐsZQÛƒăHq¤åÛÑâÆ9ă5èG“Â]à.K,€IDAT-XÑä¸âo3€7oP»‚<6ÓQ÷ áÿס„&÷Ó¢0e‚.ă ự²27uƠ₫< U)àÛÖpSÆ,5f£ ‹euĐË…ÅÚĐU|•\Q~[Ä üƠRí'Ö»Ô/óUÍ‚­ÆĂn³™Z.ñ-¢^_•}W—Ϲ¥Ơ5ê8Ư©|IëemƦs!ùYËçÖ¡‹Û™Ñ}üÄß[i¶=-k5/ ´.|O7ªEđà$ûYdưÓAü”û‡¿ä†9ªæç÷»ÂªXQŒ–ßeÄgTO2ÍÏ$Ù_ôưáàG+î8^i½].Us\¯×}ßÇ1˜–;ˆY8%Cz´œ¡¶f/”̉çt‰®'V¤PbÇ=ØäÊàƒ6Z=ȈM¬Íöíë·ư¶÷K¿}»áđ»´Ëe\P*t;P)-]=₫s“̀|Y ³Q˜ßa±5s2`n³)sÓ ‡ĐBp° €ä”K‰üVö×B‡:£EWŸ}Î%ƯäĐ£[g5=–ë̉h£ ÀƯÛ©ôîc˜¹vV¬Ä­æTá¦fôÇq×s¶ÑF­k÷ăØÛ̃gßƯÙqDXÚy=é]œ€ åÍÓHeJ!YÏC$f`v° B~0ç(ºUpˆEdؘcÈóüă—oßîµÛŸ¡g¨¡l¡ JÆÔ,º˜‡G0Ú€°Œ™roăÇ———üñå僈|ûö- “·”˜ ồK!½uá–F,§£.7½Û1—dĂ$œ¥JlËyf!°¶Yđ1«]EÄz‘—9åááê81fây+˪«_à‚z+bÄ<¤ vçæ‚Ø ƠBuª½ƯoX0Ï—g´uD¸`èÀ¨úŸO£¾ó¡1r$uUd TW ?pG ½ñ¤Ç.ª}«Íé̀Ó$x¿J ‡zÇ‘¥zä ^=¶ öÙÄ!ă‡KœĂ 8ÆÑ¶m›6µárAlçÄØ:E`đíơÛëơ•EJĐ/}mI_KÙ,®E%#ùä²BO<âƒ?_ ‰PS8^̃ëäåâGt¦+«k±¯…î-K[ ¥0T½°¿™"2ư¢["ĂØÂ'ă‡ÄÏHöÿ®uuVäÊ­±@ṽ®æà'…\-ÊÊ”zx3†Àay@œ¯¹³™ÀŒL>œ¶•¦q´ÖÏĂ—́ŒF§“™¢åç0O:]£˜b –¤`©áßĐÔÑ·©^‹ö¦¡{Ä7œ)NeE^Ç”Cbuxï­µ~éÇ8î·{–Û¶óUY|aù Êô‡‹Å¯ixƠ+W÷ …èÅF ÿ)ó8}îÇ8Pđ§®$̃₫§Ÿ>~ü¸ïû—Ï_8€)nÖj}n}£Pù~@|Ïî½÷xrë¨ Ê„×ºyûÉ(ÏTüŸ‰vê…(꾪¯Ï0T‚a¡́ô¿—OeJ±•[¢d]¥>îN—*ŸƠÍ®r×»j: ư+æ.Ê1¡̀NĂfö̃ÁYÜn74{Æ€8öà6)5\Ư=ë@BU¾D0Z£ơ¨û‹“Bjé\2A"Ăª=̣đ6[̃:tnfĂnăfW“)—~QƠK»ôÖŸúÓ>ö{»C„ÊMi7º£Wt^ƯiåScÆÛ1¸›m,çb\¾yóø@‹ÎÇưËSx i,´@PƯñƒ‚¯9u£ én̉á5#¢²»FĶºa'3G{4/ËÑEs̀ÂPä)¹¯Ó6Ñrë÷²†}íñø‚ÓÚFmVç̣5*óBX~.±c5h4;ŒhA–’[Q»J8ç,?â¥f®Æ_YJà ¹äèÂÆớƯÁJË Nn©ÄØbC*¬LÂ~qè"ÉoRøc³Óđ>8“æÊºX̉ ÿS¨V*‰+¼ö?, q½\ÙêƯ‰¬Ï—ßä„d»J’iˆÂÇÓPƒŒ̀£9Z2wUA¯~øđaÎyßïăœĐ:2®y(c”Æ\ómë%á·Äˆ¤íâŸ.OÏ/Ï÷ư¾û¼¯§§.‹ 7ÔÚA¯NØÉOX±2đă ú:Û}Ø1"Œê°±ú‘1’Ú~ûÛß₫î·¿ûúåëë××c§R(uÄH’ơ/€«ÿuë½³«ư´ènK4 ôâk¯́M ~ÈÇ»zC’́Û5³Sd  h怇èG-̉¸T ™åû¸{£ä>K¨ù›4|/P†³Ú¢ñ‹AÄ๋‚ ²tvºyZ:'^YEĐùà1r|=èQlKNœ(†Ư{, ÷]—Ó¾X¬ÍíˆoEÁDÔ+¯l,|ÇÍQÑÊUkQMø©Ú’­m—v¹Ïû>÷ûq?äXêi–˜/­3IÇ´_¡ív‘ÆT2‚~†{׬]Ú•øqÅVÂ(Á0±9×én‘LœÜاkÎZ‹¸[?ôđ²6›̃É]̉æuÜÁ/Bw„K‚Lȱ>Ê· ‘gN!/f´C>;̉ÀÊ·Ù ÂoÁ“ îĂÍTÓƒ%‹üK §³ §“RÂålLrj+q²ß÷ư¾ŸWæƒÈ5ŸR¼N>Z¸;/åéØY4– ‡k-KŸŸŸ¹ju‚Ó‘yºR•S½¾ ¤ídÚD=q—ƒJ>@2Xơ4-áơyÏK.ƒ@uØ!‡HF–¢îCÔ­ó€Áû2³,ØÂY ¨ NÄ*O©éTÆÀŸ{9ÚHåä[]ï×/_¿lmóxåXVG4('ĐF‡¥'Ư– ~lçn}´¡S»ô!¥¸Pst₫i+ƒë°_uñ¡ô\+sÓä Ë •6Û!‡ YF~¸/q¹\hØ" ™Ư˜_vb?Iü½rÅZ{„Îs8©:À-s›/ÄM)  .³Ç±’“Dª´ uÔ.î›;ÖQa*pÀo¾Kp`(È»ê“ùz·ÏrÍ8uj¥¡듉qX“88&æî3çVt¶ÅK̀ä|•ï?ú,‘ô–|ŒỌ́ hwƯy¤ÉWY‹èê·ûơèp&$}à7@½¶5¼*‹¢Çỗ} ÔĐR ÓC”åw):-Ú˜hÓK¿üđưc/_¾\Ç•æåt¹i*W“Í'«Oâl ˆ =i¸îđèGU[o—ç‹©ơkw•í³xƒbºyä¶(_B¡­¢‘bfî¶è ÙLŒk†à ̀ ÅTÚ¶¾ÿáÇœc*Û?É™íÂ3Hù¥ÂŒíÉX ₫PóS:Ư ×e ²VÁt6°ªz(ơ©?¿Tó¬¬?°‹ü,9ĘÀ"ñ'€¡ƯËÓJŸµÀ?)v*œă/â₫¬rôPŒK"áZíc'Đ;æ8öuóf-EUÚ‰2(‘åV{Ç´úr•&Mp¦•`X2ê™jTÖàó+Dw9@ÿD¬¥Ki“ê6çäÑ™¥…Â[13íjf³M:mvíG;¶¹ís¿èeŸû>÷ƯöĂGưh)¬3•-u ¸>s)ÖÀßgƠÿ»!–”p)ùµ,óUưX7”Hª]ñ@ü”/óÚ â«·öˆ€)v%z‡sÜêbæf$́oXVi…Îv}èêÀ“+gÇRC’ƒ`ñ×ÛåPåW܃F¼BÆ„¯!ôäüV¢zaưil6Hµé¥h¨>(~hK°Q%?}1’«Á¬WK¶mÛß?ÍÀ¢y¹N r²¢Jú¶•{‡eL®Úz̉,lƒo>˜«}*¨Ój%ç¡Æyüî¯C†|N›1Đ”*Sz°nTDĐÖĆĂôÏËÍâzïsÎư¾û!¥éAF·‚…qƯß.íqƯ¥_ ûgñŸü¦÷Jÿ§î¥<8¼x¾Xοfú.mk¶n8°u¸_/¢Q;Ô49ȱÍÙ<Ûsv™´¾4sªà‡§Dÿ¥´åæâN₫÷¼;¶‰‰̣?†;¢YBÎ́̃Óö´m›×{Äd@‰? )ä²åƠe{ÀK,A›×@„ßx˜GdC§Rä“ sƒWO™]ºvï6Ơ­C£²év™—cw½ïæ¢ ¿ôđ̣.Èó;™˜(F©¢Óëå4HÏÙ.n€ûÜ5‚<Ѷè‘ptaá"ÆP£74ăruOˆ“ è˜&Öf‡#*m^¹XÖ—í¢M‡ëưzÛo÷ưIaê Ët @À|ñÆ·E *xw&ƱMU7Ù(ö¨Kܱ”eä ´Rà-Êï ÂÓ‹G#V¼—å‘F¬‘ê±ÂỀˆ½¾¾̃owkª̀9kBØÜĂ Yå»Ú´BØ$ûƠ‹â×Bơ₫CïăηM6b=ăÑC&&Ûeû÷ÿîßúîÓŸỵ̈çŸÿúó´y·º§ëö&́è½ ”o‘¥z¢]Í‚¸@¿Â)ª‡e@àUâ®EÍ€ !.!ú‡tg¢jˆ”0Êwr<¹`¸%½$T$ag“`¶\đÔ»ƒá “TtÂÜ–4$F-­#º„—¸” ´çrØ 1¼­7T{PR¡!&©I„–x‚Rë¢7¨ ̃ü‘œEMËb³„P ¦’ŸÂ4€”€ZØqÙ.úA—ˆ×àÖÜ%3_Ÿ^‚yD~Wt@ç°zrϨk¥¯¥MM̉D„nŒ¬eđ₫ä;|̀ Ê OîÓȦu!(+~–Q%—œtC!ç\´¤ưU2Ns ’4Y}¼8c×ÁܧôÅ<*î16^”Ô(z’¡^va¯äÄFQJ-$"6m¿ƯM…;:WlË•£̀ˆóƯ/ j5b#[T©"0EIơd‹¹ÑÆüúơë°qÇơv×yÚ2uÀ¹TênJSIr ±‘¦…©đn^”́N:;A…7>~÷ñ»¾•¿üô—¿üôÆj…0øcŒ?üá?ưå'zM\„n²₫«èß»çû²¾grÿ¥Æÿ‰íâm/̀E›‡5³3·…\đ¤̣§o_‹Zj#₫X4¬*™‰jK©ÚTF4Fđ¤™̉­Ă‚h‘Ä$TG‚ÅxÔL÷ =ºë–)¿uä̉ÖpËœ¼‚3“û;½î ºU Ëữqö˜#E·±% ûot[-~¡J×û!øC´kóMj«?Úă{_üµª©TÙ/êÏ8ks² «‹ÈQ¥?PưºsÑßg¡§K }^h-é=–‹ỉe‚¬_‚éY•¥Pzhº́ô:ïùåN5ÿ\o5‘Al₫®°„æ6óP ¢̣"jÓ¾|ùb*Çq¸S]̀Be2ª¹N’Ba:lû-³´Ô¨y¢t̀óPÇăù‡Åu±´ËrRÅ ˆmú5qÑÿ(¢ '­)•?¿ûø÷ÿđû¾ơaă¯?ÿƠ;­áD¢&o¯o7½Ñ·÷M„̉pÚj•ÏEñß¶sáȶ,ö¿ ÿ†X©öä̃cSæ8²u——Q‘e\‰؉¨Ïé¼é…à!§™#ªÎhœli÷$*äRE¥´çî÷Xá~)î™@Óêÿpé̉Øb•"?{´zÄf̃3*{’q·bñ"¨‹‡)´ỞjLVæ¦à̃¯öVHj[ØøÇ¬‰*¨f$Ó£#Ÿ˜Ở6$j¸"ƯReẓÚw•×1%ÎùÍÖ¬½´í:æø̣úe?öÛ¸í²#Œ~横¥óQ_"ŒNoL556s51´'³QTI7iÍ«—z€¸%/iB:̃R‚½ÎÇ”€å¿á™Á€}c/'AV₫6mlÛFḄzLy·DI-½][kÿ₫ÿư§ï>ưå/ùå—_üdUØ‚₫§ơöñåăÓËÓÓö4y»̃Úlø̣‡|§wD­çAM[™ê~q ’Y&½±0ªPL¥r·ê4 $ D ₫·ú²„G§Ă¯{́U]NåÖ¶!å;S2ñ¸HẀ(3Oü±&œy»7ßÀ’œf ÅàÁ|·ÑTœ§W ¢·ă¶Û3Á³äùåùÓÇO—ËåË—/¯¯¯¹̣Og‰ÊÖ·Oß}úÍ¿y~~æ yÓ1̃TGï+ØpäxMK½²s{¥;5÷ZbJÜn~œ—#̉‹¦M†°Vl¥*ç˜( ŸgzúUüaQ‰(EG§oÔ¿ñ”ô&ØG}v‚Â@µ{QQeă*q¤ÈĐh®´ÅƯâOe±2¤_gà†5ă‹íö#dMđ̀ ²̀¬uoÙQƒ<"…ï#FĐŸe§Å ˆº%Oḱ×L.c₫#X)d^S#s˜}j >¨!¯Œ›ñ#N¡€B.̣Đo'H’­„{_Øwô‚đ%j~©ÎqÈtÚ́á–q©¨—e{Å28Û÷Øư0øo‹,®ŸåSh ç™Ö́ ́Ê|å⩱-Uă·ï#,ÀœSÑé¼…x0úWÇDC᪪)Å ¡P¯!¯¡ŒxÂUâÍ…0́_¿½ ̀â«K %¬3°Ä¶I b“z’¥xRuéZOC3ÓÓäC4c”xh2Dó^Ư}¸ÈÖư._¡×z/M$,J9ö¹óЦmk}ë—§ ²+=‘4®-WˆóâxĐ“à@_ôâ?3}Ăp—»/=nưmO7®™¹.Eñ œê&għS´đ²×\ê{: ƠVé ̀ÚA5tPw2zÅJÓ¦]<„¸mzÔxé¦*J‘Oíà‹Ü_°c½Rÿ¢Ly¨<®í¾ßï÷;¼{•!3«F@™ưH)wDƒ§óÍPw“xÚ¿ËŒ€È‡µ¼ ưy‚d5M¡?ë.hé+Â@Êæ>¥1‚ Ư…ª—”aè̃ûÓÓÓ´‰ô1Ñ®m¶ßưƯï~üí&öÏÿç?₫ú¹·¾·}ظû>÷*A+ÍÓj(+m¬·…A·1ll²a9nm³ ¬Óc|¡–v´-Œ!ˆDüWM½'ÀlsÎn ,y ơdB@sN^ä´‰8†‰wQØÚ6Û„"CÆ®8ºĐR€!˜—/?₫øă±ï­yGí >©iC¥qŒă~̀1»öçËs½isBvª¢\œÖu„1qn§Lkyx˜‰¿qçÊ:½)$öx€Ft»̣a¥ XÚ2rO§Ü8u¶Œ‹Kc‹…ë™R.ĂZ4»"zס=À ?½)ØœîÁơ¥Ox₫¿åi'ªC¯óJ›-&ÿû¿ÿÏÿßÿüĂ÷?üó?ÿó?ưÓ?íûî¿ZÏf„₫ü—?c|ưú5ïBä°Ăæ‚ND#¶±‘i]{F̀$b…j ©0z~–7k̉h­,2˜(âƯ÷ÔI>ÈưÏl$ü‘¤á‹ç >¦½?—}¹ûL6ơ:~΀ƒ*0¸êJqd‰;P9Ó‡ ĂE!ƒ¦Å"k?=²P}Ú ©‰—3ɽwÄÜu¨HưH›ÆïŸ/Ï"2ï™LÆUÍ¿`ỏ“ ëL$¤å_UTÇ:#̣z±M¶ms{^€Nơ±I J¯|·Ó₫’å{₫*₫Ùºv¶rGP(Ï0Yl…F$Æybwñ6aºªfiª ÄĐ³ê®íë×[æsZZÂyçZ Ä÷]yPÊHË_F‰ă“ÊŸ2bơO2/üOÆ‚èc ¹ƠƠn¨¾g™%ÙưóCĂó{g Ơy¬0byƲcQ“V‡h e¬Â];[HíU•ĐŸ5UœÀ ¡ˆu–zq¦óÊ’é>—’D@ ¦Ơ`KtuUUrü¼B|ÖqĂ!„x́‡¨ £àÏ1¿ự·}́föơëWx¶Éë—Mº¸X…€C Ë¡?+~†Ê¿ëZăA€ø&Ư³ÇÔ÷•ëÇÉxöó:åûZ²û æ0pA£! ™Dü9Ơ aô²q‚“#H¿(s—__P]êv½Y´ɺ₫ä¼Ơë‡Pm”k̃ZT~?æÛơíz½BDă·º¯,JQ ]MHØú•£˜Ø°!#3BvEÏá´³Ü&`S‹@yâ\¢¹T‚hf~s¥<üÓL¶Íocze d‚zÍŸø }ŒC÷¤Iàâ7mO—§O>µ̃>½|ºßîûØ{ëÇ8¶mn`©yp ù:ƒ64©»Ơ`ßém‘is·}èđj¡m›}n¶èP×êéééÓ§O*úv{Ă9Wư“­U¢ºùŒf½Ófm¶ỳc´°‘¢”™³ÉW©B̃Bë¨IsdÖZs‡xÈÿøÇÛíúíë×. €C€>m"wê8›ö|yæiÑgסôL¼W@œ<ºå‘e‡Í>g+5‰çDbÀfIDHĐú$q5¡[Ḍ÷}¯à›vÏđ¨]ÁT(Ë(2G´™GăjÎÊô?Æô ëF{Ê'% Ë(ª²êôæØ9³©j›™cg˜D¦̃Ç}ñ¶mûñÇÿ?ÿé?₫î·¿»ïû¿üË¿ 5YmWyÆívû¿₫¯ÿë_·ưöú >6¯Ǜîó˜D¡C®K^—é2PÂc ¤yÇAG^4Nz®”DZèïÁŸ©"¢-<¢ªQKµœ‹%Aáod€DCêªY¼œî8€Ñp\•Wíœj₫n]TÆ̀“¦Na¿È¦ox̃3MEø[r{'z3`uZÄ×vkØQâ$eYñàPZO区Ÿ;S Íơ`Nÿ°8ºu×,HëE>_iDüNÅ0§Ävl¹ªëV*0®R˜ UH·(8è0´°B.úÍ]3ñb?‰¢q}0́wo >5x ư92%“2÷ka‘Ô‚c±¢%Ç&ÅWlmQ ¼‰ßMS+0ºî©Hºå)ÎD=l¾ ïăm¼¥ Ú¸NÿZW=…%ÜƯI>{³'û¬. öûj" £ä¥”&kU6ö°_ˆøÍ2ÄDlÍrKj öÁĐ âß"æF|_¤ü₫MÑOđ.NÁcŒO„ ç/…€Ù¼lU=ÆñôütyºÜûÛÏoøí1ï£:Ÿ₫ùË—/*Jjùä0ÓÂ×oêNóSùÓóÇ̃;"̀÷e- pçÊXÉ8#¢tœ\UB­dư²w¯û·`ưYđÇ<€¬?!ÿ1S‡`Ns0j´¹‰#æç§gÇ!æ̀÷ß}ÿă?̃o÷ŸçÏÇqT‘¿JÖXê‹›Ưtë[ëçv¿½½½ƯïwDrfôcÉêFLøÅ£áAdBBü§’E¨›¶­oO—§ÖÚ8†Cḥñ-ÍfÚ₫P©U%­-®¢‡ÙÏ¡²·Jµ^ÉđÜø¾èØ·ØÍå@ jîûƯ)đ9ÉÍH“}ß¿}ưÖ·̃¤=ơ'wÑ´ư$Ñ[ &xÜÿơẠ̈ƒ™*̃æûV¢¹Ï>÷!ăb¬›M7€₫Ö²$â¤ß}úNU÷ĂkVêTö-ÊCQ­ˆ3¸l€i ×y@ -E¯²–-*ÏÙZ;́è̉i€¦Næ×buë üéÏụ̈ơóỘïüœP•)2ƯÜwía_s³©ê>ö@aqx?ø¼ïí¢PDb·›Ñ>Ù?xÓ {˜Y×5%£·=m?~üøáăß~ù:Å&¦a l¢1Ö'a„”ö·Htæ~ ¦F¨^0QS0'vüd¨Ç^µ¤Ë´´³Dí´fƠƯµ¿<¿L›¯××§ñÔŸú1¿üü—vṔP¨w^__ÿô§?_¯×¯_¿æ;¿÷˜s~ự•øípIN™đ*°đ¶ôÍr\·SzÁX4À†53zn—k‘K rÚE9>́C^´Ñ¨ưƠ ¡­á¬aư=#ŸD%=:ØưÄú[:₫[4©˜¥ß‡ˆX,‹åÿ³H<¸ü¸N üd8Ø©ç±́„¥̀¤TC ï jÅ™›¦ŒWrƯ7~ÍôŃØtû¾ËO–¸–ë”â:‘9—gA%ºË>m^Ç̉–• #\w7’ÑR£y¢ÿá)ÁÀ¬[˜ÔÁ×p?F™ótBD±7Ä]đ#ˆGå¼9…Idºưø° Ü-6¼éßÿ₫ï/O—¿ưío_¿~¥_Wï†âÔ·8Ï *m"ú§ç=orNti™Œ«eà«^pzD²\›Ơ³«FœA/:ÍK ÷[Iæøc1à@{䳸=!‚ÓT̉@…§iÁ…”±h”»xA|.p§+T¬dôÁj¥î?’æé!¤Đ.h/Î2\–gĐió>†J¸TRtTö8́½÷­K(…zï΅wØÜ¿Oï˜y¿g ƒT¡²¬Ë[¥̣/];*üd¾oß6ƯZÔ•OO wøwƠ ›¨ñ¤”P*‡Ô“²±uö½*#ư×ÊS—mbú1¿èbẬ˜±5/¹ºŒÎ32#Æc7Æđ~ds>|†ư8æñƯ÷ßi×··7ÔG>êj×ió§Ÿ~Úưùéév»ßï÷JÖæÆeT A\Î`̀Á8@îỊ́u“M£~n.ă33;ƱÉÖZC _@OVx€x+OH‰%«xÓk¼ç1–g&̀ô¡Ú»ƠNà¡Ă÷ăÁÏ­K±5‰ZÅØáÎ Îúƒ ÄŸtéXÛùô-Q>yñS¥”ú·^֙ΓX)ëµSRˆ4h·ă1æúà̃G̃ä~ÜaBû–]‡©+h­5kNAQC²úQú S^đe}Ÿø'ùỘ(ê­?mO"rŒĂ!róLª¤ÿ!ƠhÑ¢N3S«Å›œÄTöÖ÷»ß}øđáz½~ưö•1„ÓƒK̉ÿâ[ûÇ%a¥(ªï”µŸ½2²„«É—Ûj{ç2x ˜¸₫–P;?ˆ~é(²1¾4Ëúgç‰2 ʾỤÁ‹¡l§KZÊBÄ,ÓyXnéAïTM™D:ÓiẶ§–£©0?~Ú÷‹km,dAPƇº,¨>V±\ú½“E; ɵ̀Y˜ưûqŸ:ïû%RýÇÎ&ÜËÂH^îäk#Pæè¿]Øè÷Ôå7{ưú¿*₫Uơ´̣…}‘C¯X êŒ"ø™ó°ƒ9¾$₫Æ22߸>j¦́ÇÿJfÓöüüܶffÇq4ö¾U¿Yàœ­o^>üÏÿéÇñç?ưù¸{áo™r¿Ư瘽uí¡k„f–ºÇÑåÿgpo¢rǾïû¾¿¾½^¯×ă8|Q¡dbŸüäµÅEÑh,@I¡?́C6( ŸÅ‹Ø3Êñ^1í<å3ºU(]?X«EÈa>:Ù̃jO^®ÊÆØ–D5=îF§E§ 2LíTg üÿ"·Ûív»IÀ;¬3Ônë³C^’`?ÿ$*NOÎuoê1Ù=+`ظ؅ú3»̃®_¾|é½ï÷}ŒÑ¥[³9&øơŒ ‹ˆx„÷ñº^ ®1= ÏN=œûÇrB…˜bjÁa¸,O:̀1ÜC–N#q {ÓM¶1†v¯ä¥ÇZơv´C HÔM“‘q¤ís~Júßæ´yi—SZ0“xZkƯ:±¯ª^¶Ëßưđư÷ßÇq¿̃ï7O·â'’ K†~áæb– ú?{AÀ2&PÚ2²(Ë0”„ïL;G©±±¨y†d`^ôfª™}x₫Đz›cóøîĂwÛóöéùÓ83ëUơ:®_¾|ùúơ+>‚ŸÙ¶n9åÜđæ™=¶EÛ»Û¸ÎE!ƯTÄSc†¶<6p/°§—§KïƯ“4T₫ªlđä_gi®}ÙiÑÈyX@IyÀôŒ1đ=̣×é†-% %é@¼Fi—L=ỐSæĤk÷êQ)‹~©óRBù¸~?æ̉}}ÅH’q€ çƯEÄ\~æáSP₫\¢µRXI“9f –±ăÊ"«xB›ŒLÿ8›sÚˆ<Ūb‚KĐ`¡¤¯Ø+‰›ª7°lÂUßVN¸Óœƒ¬@ÏÜ\!_©¹¬UƠ­oÛæ©{~ÈÁä·âü›æ-ÀÂç×"+gb¬^ ˜½Çj`åå2ø×öZ†àËÄƠơ³amüîZ24ÚËÈ”•-?`-êấ̉8ùơ5×;·êrv´`CÁJn½åđåa$SùàéUXéüư¯Ä?}pÙ%Œ†/4EIÄ‹aÓ¼ ¤Ö/dṃ£đÉ{s7iÅAkܹ:åÏ[¸vÑ!过¨ư6²ˆv¿Ç8˜1\7 F")•ø_ó5U”ÿ¥_Xâʘûë>@pÿZÀ$< %$•Q4 :Ÿ₫©ø^]µiS~½™±z ¬S×s¢@₫;ÙMŸ_/Ûå¸ûmO”\´̣@M/O/¿ÿíoû¶É´_~₫UÚ÷Û₫ËưB‘B“s}£E¤µ¶]¶mÛ̀l?v¹ßï_¾~y»¾y"²ùS)'•;B“øg[eçÅJ6N‹¾c'ôo#ñ3OÜ2åÜđÉ̉Ö]IƒÀëñoÖlœjùU$HI”ÚP‡¸ÛæĂËUƯ÷ư¾ß´‹]E2Däđ-nE#¡’8b› í#3x;†»|üxʘÀ—¨[”º /A‡ÛÜf›£Í6d¼¾½?̃:xØåÖ›˜ Âk•4` ›4`¦ỉp¨ƯúœqLï 1P?ô˜ÇlYưª–r‹Á6\a/Ư£ÚZĂ*‰ñ¤U™È¦[®p93rä¡̀>|)ó8á5€ fƠb¾ïϸŸnhŸ›lX—^#Häơơơú£¨ụ̈Ë/÷ư¾lQ(E¨aú«ùe܃GÏ*(œ}†Æ<í¡k&YÖ#¿ˆÚOÇsU€‚X “à‘¾ßö)sîs̀ñåóÜ₫Ëå¥MÛ}Üïă>l`éçÉR<̀ªM"%øpѦí¶ËđÎr€ M _}ñ4V+q†}ßAN°ŸkZYô0 ¼}¯EZ°ˆè,{zøR¬̀>vü÷ë•›Î(Á¤»”1Y%+è*…Bp±E®>Ỹ^cÍ9áF¦ùó®p”P@¥]q(bëÁoWQ¤L› –\/Ô’œ3ɺ9GaREºæøù7uÚ„•®̀¬[Çèe¼ô¡§ˆHN…L•5Ÿ9}¼Â@³BuAë ,Ÿ‹É"©,¤ÙÄ© Z+U¼º¨EăfQï“în^ @=ïƠ¾m©"¢ÿ9æù/ÿ¥ơv½^ÓC[üÂĸyLe µ{ §4ă#Ӝܿø"̀ÍÈQ¡lEWû̃T©̉ue”J`É_ª -nNlNW[ăí‚dÖ­“ơ3[ÔAƠKÉ?‘<èI=rÆ+Ô¨¯_³Ë&‹̣eXôˆWÎúŸsI ¥¼‡™¾ôÊ€₫Ư „ĂSëôû&:Á}̃\î–“Û¬KîÁ¯=˜ @èå«¢§ÏY•?µ‚jȨN."É¥]²Ô†Ö¿”ûd©BÿdÄ Xô™~@ÔàÉIÚàÿ±Đ§µPÓ|Ù\ƒ·*3Êù{ờ‡öÀƯ¯÷ч C 3Ê÷kŸ2¤4¼~{‘ëëµië[”ЉÆyO0hB±;ܧ­oÛÖ{÷. 2¯×ë··o÷ûư¾ßq0²d‘^REÔ¤ƠQ\¨ơdíª®¶ ø̃ÅKªZº“ùZpMѶ…4ÂÍ’‡¿w!“¬9xUïÄï5- ß>†„|{êOX^¾·ÿïÿĂËËË·o_ÿëư¯¹̀1«æ‘!uôÓ,%ÓµëTƯ´Ï̃fë³÷Ù!÷ôƠ&#+‡hù߸8Ùܤ‚à!|ar°™r̀9/rÁ&Ī=Æ‘̣¬‰:^ d¶6Œe^©æàÔƠjÎéí— }ôÑÇm45/ˆ[ «‹´­5mÇ~xW3è%Pó„¡+Â5¬cdc³:ÏQƠÍ ƠÚcƒy›§y 9`÷e$UWï¼Ïn¡Zö^&ˆ®  C“¶ß÷ÏŸ?«èÛơíØ®ø Æå!aV@?_E`¹~²21h‹(ơE¢”LUXơ=H±°7É)¡UmZ/ÛUT•ƒFû­.}́ă˜Ç¥_æe¦è0<¹Ï{&ç•][ăAÎQÑF›n³{3{«Ÿm5ƒtk¶ÉæÛ³5ª̃M J~'BØu+c°F›†øÁ,hK+%#Ö·„%eù+ñd}_‡ÑF–:§?éÿà¥pó&–å\›Cý‰QÛ ]ù®2†n—ê)‘P!–[̉GñJN™@öoÑEX‰Îx€—P¦X#ºÖdÚ²(^à•>:îÚ¥b*zŒCÖ`"9ï ÔaL§WÓÿä‘°œ«‘4ê[o€(E¢¢́™º̣èø-u¥?Uÿ°æá©Ÿ]Íg:¸­ä~hL®DÇPÍ wÍwi”txĹơơ•áÍ…t'« CZ̀• |#¥¤̀®3™S4 ƠÆ9gơSú‡<¥iV/2ëëW^ĐjƠ¸³ èÙa•Ëvi[›sîÇ~‡E.5J„I ÿ-AÓt9b+ƒèÅ(×̉éœưdđØpzºµsnÛ¶mÛœó~¿S›Ê#‰P‡ùQV²ªM¬¦¨2 ̣}—ç¦Îé̉ßµ.`[½—t$¾Ü9+->XơºüçuºW‰óT=@>S*X×ÿä´̃ û¿ôKÿtí­´¸ª›1‡ZBÉT(?Ä‚ gđ¯!ơa¾/$₫üÊ-“&™ÇÁwç‡nC¨Ø¹¨!lg@WÎf̃¤ưí¯?Û´·×ëÖ6¢ê´:&¸¿µ¶m[Û¢³¯̀)óúv½̃¯·Ûíz»2Ù·Æ‘°Ù«…Ô(ï“~Ú¦ H†²đư­ñ|l­„_n¯HÔ™ ñ ²‘̀̃aMØ’™™síçJ€øÇ{œsn(Hẁcij—Ëå÷¿ÿư¿ùñ—Ï?ÿñ¿ưqß³gîé£́&8úJÅ-´e ¢Æ)€h»ö¡ă>ï,NOJ¸ÆIM¥ Ë"µ.M^°¬Ñ¼F^&hn³Ïn½ITäDœĐưî™̣[₫Í؛lù¢.mºÍŸ~ú‰ËŒ=†êâ¦Ù¥“Œ́{%ê„z¡€*­ÁÓ¬°(̣êdóR]åÖ³%ä2³M[Ơc&†<́¦­Nÿ§'p´«]q='”P?]‘…è”"́S6Ü—₫5 ™tÁ4U °äè” ‰$< ¬ Ê»½N¬Q ¢Æÿá;ù¤"`ƒơwù™*A%ÇC¨y5³5,±End2‘êµ/QƯ(-W³:€ (×AEÖrÂ}ÊÆH}EN$_Sụ̀´*t‹-á8ilUËöIRd>¤–9[|†¿Å 9ÆÑ¤A¥àÎØÔưØUµ̣²"Eº4 Sj|©ˆÅ¥€ÎJƠí "ÈNƒjùôVô¾rŸø6I‹î¶|S±È¶m///"¶~ÎéÎ@€E (ŒÚµ‰"H”»@á èÚă,Çœn¹ảø!_ÔuN\è”æ© èƒÂ…’Q”uÓq^rṆ̣NWËß̀¨BdfOOO½÷}߯×ë;,»êvÙ.—‹g1Ñ+&ªÙàÚ\äÏ;Z]ôZv&ưÿ‹WîÿdÀóÇ&$³Ÿ_^^@íßî·JdMVU½ªP~´"ø±"Í#«ªs̀ÇUQ'º^j⑬BƠñĂW7×â.}Ö¾D½̣R+³²Åßɼ̃ô:bI0zÖZC‰Oê₫{ï›:ÍÏó”ưxñ&xWf¶Vˆ…í~-Îc©jv•‘ Œ¸¥=Î)¨%>™C\C4Ëñ5üá’ÎlSôïº₫́ÀóË/¿Ø´ă8¶¾¹Ô_sB]œ¢Ñ5º5i‚PT̃n·}́cŒ/_¿¼¾¾îcwEÙô¬eîtÍØ2~ÄWÄÉÖp–̉Cú3đ̣ˆF‡!Y ó¨ơ‘ £´ƒ‚d<Ø69‹2zĂÑ?ơuÛ‡§Óæ67Ô·QÓưzxŸC„"rËFiÎS-ÂEx´c6k[ÛxWQ¤P„<Ú<+I±'ĂßB”}D€½†ŒcÛÜ.í2l̀67Û¬y1&à"WØ9~ó¥£ól[TUŸ́“`æ™ñuÎÙGg ®~̣ ²–¥X’sf=´(µƯç™éÔVÙ¢¢Ê`Z0wÄC̣FöEpê0+…JÀúû…ucJ€5óLkm›ĺ&“xºÄN'îrLbă7'>©>©¬-(5̀8f†©ÙRh>ÏcK‰ˆ–P»¸æ¼ Ăè¡¡ .³©˜’Uƒ(m̃´ƯÆí>î² auƠ¹&ek©›UñḄ;Ê zXn**Ư ¹€¢đ>ä>Ïîi ¸`ï=®̃€YD¼0¨… #üüyí¨© ‡ø§³¿¾œ8ïM—¼!xnp-óR¨Dàl|e€UëÚ$VO!EÜ„ñ! «.4̃J£F !`]¨™ûhb῭è½D¿ªîÍZé<§© Ç-󷬜ˆ’7k(¯áǪùÅ3ư1Áfü‚+Ü,œDl…J¬´PµV¶Ô±}›s,¦½ Úi¶B¯–¹f˜¿j“ô‰r–½÷O?ưă?₫ckí_₫å_<†CÄ?ñtmø Élkmé›%ºÓ8w¢¤pV*¥&®ªTkpÿÆÁŸÑØ¥î0(JW‰z½ÖÚ4w§-Uï’[Ḯ:Ai‹b«¿Ç%¤ª¿ưío?~üôåËç?₫éh%kL¸‘c̀fÅiå,¯G‚LÑ¢®KE‹àxÙïUa\èí“ùÇL©èËˡ Ê¿Ưn¹;fJü;CæåYsRE'?-æ̉ ß4¯o²eüu¹ ܸ[JS$â_¹s+)s‹“û‡èÅ8́\i5‡0NJ#y8K|^ZáøµS÷_Ñ?á©a ÒúÛrưÀưèíEÍ«ưd¥ÿèm̀óË·yD/Ư(EqDó®¥Ñ³Ô§±G8[It‡4ûmÇXmÛV]8f¦:7½\.Û¶‰ÊëÛëq;´é¾ïưù¯ooõx¸¨È(ñZö£d¯.¿Â ûؘŒ xî‹ ºkªWY?]Q€Ä q9"₫₫s¹†œµöÜ¡e¿']8s‹¥ƒ-¶=mO˜ÂÑ}̣₫ö—¿½}{5…SÁw)›œÇr¦–ƒI½¹5Â.îÄÜMiæ^ ÀÓÑF3/:64/~¾PBVCu4â²ìØÆz^Ỷ”Ú2¤K—â]%R4ó´“É>Epơι^p:4TmmAK¢QîĐïÁq Xÿy¤N&×€¹û‡å£,0Áñ*ô¯j&Vră3ŸJ( ©£d¦ª¯¯¯x &₫DØ|Î)³––_rOKÄL(Êœ̀ë0w³ M[7HÿU6½́knçEÏhQà¬y”û¤n~0’('úTDà!ÖFÅ*µ¿¯Óü²ÿ@Ÿ&¬qQ–gLR¢×dHDcÔ–1K²YË¥‚Ơ›s6o×´í€(È#ƒÚ èÚÛhMZ›­I»Ï;Ê^år}¯ØˆR.w…çóRA'yÑC½-@¬Ä`§ºvOTOwqÓ†Nz<ÔIÆG>A­0.I¸9đçÇä(tNĂ5Iàlà¢Ï4ôoC¢„? Ùd…̣&f§ÏnÍú́îü˜;Nliœ–G5½đ7,2hc —åçăN&}ׯ›àûŒ̃ʃo˜K®`ˆºÙW*Ỹ@[¦n“Ó)¸3e²R'Z-ƒ¦ØÆ‡i‡îƠơ9@|ÈñmφÍ'ùăâ$Ø´·××q<‰ Đœ« ‡1ªmî:Ö4ç’<£EÇ2ÑäHÖ³Ñ"ç>Ÿ›R»Ë%è·B†r²2…i%PEưë’(tƠr~Ÿyñ±ËḱA!Ióu½^§Í·ë[µ-§»ó .É09Y-ĂV”.–-8êœ₫ʯN ±•œ{Û÷ưíímÚ¼ïw"iê”ĐDªè̉igºúœÜ?)E9…î=%M‘ø5 TAÿ§7|ßßBëB­|Uü:?ÆÀ«Ë”̃éê-'ú‡ [æơFL€úxø-Úê!=”ï–₫ 1[¹xj~@öóp˜´rÿÀŒ¤ØQ‹†¾₫#₫¤dụ́®É§¦_z̃E(<‚̃f÷G°.pzĂ_áÙƯïâ˜÷Ư|ïûưz½Öæt;³ÖEXË*å÷<:¢t8́ªúüô ˜]÷ă¾ÀÖ³è?í×~̣ˇ—ßưöwOÏÏúÓO(á‹!D\'¿åSr¡.È?¼Ơ™•sñj¯ÈæÑ‡fHr…úôi{ÊmixÚßâñ0+ÓyÅi°1£5OJBØ=d µ i:;Üq]À\’¤¸³}'1¢ ¡¡«Ù"H·ơ ơ‚zëƯºá1¯† À 7WKKƯ´M›Đûà4›sn¶¹7ܤLp™¯EnqôÑî8ȃêºù–Z ·ÔÔ ­fÆ Z)yŸ3Û9Á’B2± H³cMw!à~衈 ¿Å¢ßdƒ:hÛ6&²,‰üƠYḶăI£¡Î’`™çycw­G[ÊZ<œÌQWsèÆQ îcÊ,™†4V/¤̉B)À‘^@u«ï-̉>¹º Zk½m°·tî°µ—×—1Æăñ¨Ù¯Çx#₫®K$|¿ÀĐ`˼aW’8pÙ¶Íæ©ï/î˜^¸Lÿ@­˜3˜=-´Đ:^ÛsăI'¶Óëă8tÓÊ•²ƒk…/x-æøoˆ²’”9 U+RƒO†”²º80ûºäÎ̀¸N¾}ûöưíûƒ IöOK‚W×b%­Úès⺠“́o?x¾R&œfi₫Rs+ÿ[¶î»ă³¢é‡³'¹IúÍW €dmyŸc rVL¢åWẰ£̃jœ˜Ù”r®f¼îuGă²Ó3¸sB×Ê{!2‹´ƠIIXÑô'ćקOS)¿,,_Xs ѳă.j_Á…à'e?6¡¼Hî?<Ăc}q3Ă‹¤¿gqơ_…\–Ä«±S—œUÜ7æ™ÁwŸRµ|SaD©M=ahf÷çx>ŸÏcHæœ÷Çư8¦dơ &5&T©_§ “4%U*Îc@&3xƒ?üyÛ¶9ç÷ï߯p¼´‡eE‘ •¦íơơơ—O¿Ü^_¾}ưú¸? }̀ô'%·ù©§]ñ ‘ƒï/~œµs»/dt6x†₫hµSlÚļ°Í6\6„@&Ö­ăUºô¾ơׯÏÇs™iơèB—³ç4Ï*̉äɈ[6[đXUêË1)Lằ#¹ú+HPÄ®÷­̣dzënb°ÅùĐkaäB›®®€*¢@D“>{×~÷Ç|œ6êyØœñbƯÉà& ÇÔhù7NE†;Ñ5J–29w£+ƒTñ¦xFâÖaçz̀רÈ×]ó# gUuß÷———Ûv{ܘ=́wrơ…)ÎM?~üø|>çá‡Dk>|8ÇóùÔ³;ƯẼpª;đ·i¨LơñPùKq̃ùơ\is†Â9Q-_ Dó.'Øh©ÇrAŸÄjrư'Bå‹5TZŒÁâ‹3 HŒ¥02CåïSM&x#±ó:/Ûß¹o{ï`ïˆ[Hª¿§$Á_•-R„.§f8[öx<ϧÇÿ̉ăA^§ ?ñ=8ß«s¶,'Uÿè<#ëm)e.¡²”éVmÛX©¶¢ª'ºD"„WdË…Ü‚åĐSfT…I—˜s& ˆs™Ä‘áú@Zxôœˆœ™¹tb¦îĂFÜàœ~œ®ªô°¤S/’ëêĂÉÑÆ̉/z. Wø¬³k¶‚₫ÓÆÄY•ù‚A%$e ¢>q̃üÔ Ç÷TQ_wƒª< Ÿ®´ÍŒ^'ơü SµzC¸ßßX_đ­U›ÿÓ`/uo‡¤½7ơAÚ”Ó8>aᨈ”H̃áú}(Á Đ¿ô›·ÿ¢-hBǰèŒăïÉưq·y¦Đ¿÷Z²Ø·=å₫LLơCN‹ ơ)Èc—-Œñz<¸*O'€w!WµXQœ2àøƠ6¿Ï¬h) èƠÚ¿µöéÓ§—ÛËăñxܼÚVLQk-ñ 0L`­µ)Kzë̉w GÆ5Œ¼'ñE*æIVRuË—ˆú‘Eù̉ö­mX%«̀q`ox›r†éu;yñ]„k+—Wˆ‚zëjª¦l‚¦«.Óˆ‘Äđ7âT»”#wp….e[¶ ̀è­ï¶cƯo}ëËw¸aho,Àù/Ë.+8u•²tè,z£3tAæº ê±¤V`k5`¹Xßă½ËA·dK"é%kë›JNNđ̣Å,dC4x©Tq›Ü_Âû=¢v̀ümµÇÉ…I0“íˆ2Û¶}øéƒª̃¿ßÇÄî-Œ ßWu* ~-_ èÀ@íÁ&ÀXN´˜?W¯g@°Œ¬Œ:bˆ·ÉS†] "- åB°ê­6¾½0Z}IØŒ₫\Oï̀[§´„¡MJ±¾V'¼`ÿ„œ? ÍÁ¦†q é«›±j'<_’Ü3”lv$ƠZUjD^r™MD`ª *c R³üö.7¹÷₫‡ßÿ₫Û÷o¿ưúøËµÖ8†g¿”eV[cºªªWxô¥´oºá+¢‚Q½) ôDK¸á\~5Œ¾ÿz­à?]ü#₫Ố́`›H(0 _íz¤É)%àoJ¾l ­TÁÅM₫øñă¾íÏçsYÁîi(ưY«“O³†Í@K¯¯¯½ơÇăÁñ)\Ÿ¬ÛœP¬†̀÷]?@«÷ªâ}·Ç]½r:đÉRŸ̀hÑíê٥ߗ·ÍĈw+-Vû^[¥ ¤(Á¨¨¥ZÏj@ù¦| Bơ?ạ́Ya\²’Óú¼|C]K¼Ô,C˜Û[oBn,¤z0ùAû*Z©­=%Ñ®p½àø¶ÆÁ¥Èç2>]­”ÿ´”#“D'èg7<Á(\E|â4ÿ!¤æö¥é¿:ÎF€ˆ¼SeÁ&ṭ©vºæú§̉«¯¯¯[ßq<ŸOn̉$nckàf»ÏOLøú< _«e¸/D"e«ˆSÓ¢¹Â‹cœ(ÿµ†K¥E‚†S‰^‘ĐÖÂD?‰ª³l:f Ýåø£Ú§¶ù‚¿g çBO9âĂ_â_uÚ|û₫ṽăë?Ç<æ±ÂŒè}êNUyæ´eÜØ©)¹Lø¹è‚*ú‚÷;oEmùMØA‘}&…ÊlÚîßï™é­DZm­Å€ÆéƵÏ¿ƒNơlÁŒ̃åL°+;_ÏV¼æ–Ü¢'èä˜₫kj`‚·µåBỸ-€¶W'K¢̉Twi=JåBsÆ¥Kö¨¢:Ø º½Yó‚w₫kWшFܧÏx39™ ¡]Ó9enºm²5i³ÍÍ6 ₫& t¾ç­Q–O ¾ăª3)²tÑ̉¸­æu c 1$UÉơù »\¿±^½LoĐ µÔ‰ …ÎŒ̀(k‘CÑĐ¿/)S5¥̀ƒ‹I%̣¦­–7Ü”< Ư,(¶ê¶¶1‡6Åw‚.E,Vyǹ•0, Ók¾ëOY”ñ(3q$ÓÓ?u5.XJÊQ *¯•rpÀ„Y>jÈgp°ểkbÙZZ‚zo ê›GÆ”mn}ëàœ¸ƠüàC¯·ˆ;Y™0Ķ¢/*¥y‘ª̣Çλ_w»Ûb™ÇeIÿ{_M"œ9Í›ÿÏï÷ï¶́8ƶà“ÈÙ1Çí¶ùâư *c ï,öGy¨#,XK‡øV X5¥ø¸K÷–›h ÈÓ½tZ4BüƯGP¢–zƯ(3 Õ±+J¿<Đuư9ç5=Î_-§–ªKUƠ×—×××W³0|$|,sï ¤Ë»cP¥¬–‡ñéYÜgjáP¦LÍ-ư£µ!"-«=P₫x¿o´{̉µœÑtEPŒµÆÆ¥²æ#ïĐ¿°̉pñÄ©~–I:Í›Ø~Û?~ü¸lưúë¯̃ ĐŸ\•Ä(€,eœIßÓ¦V©‘ª¦Ê§ưr&æk¯û¡t¯îA¬¹÷?hX†D1Éʉd!â©3ºó7đw9SJ*œƯ×ö`"+²w Ü¢'R¾-HåË\ ’ĐÖpe³h¨€œơ¦!Q;? k6RªlK°“r†²rïZgÍ__^_^^çx‘5GǹN_(\ëß ô×ÂI·‰À°¡5§̃Á’í®)”ñ‡T‰×Ù5)Üo¹¯¡œAæ@â¿¶h“ª ,öÉĬ´¶o;çyµâñïÄA ½âû:g5Ÿ̉xŒăq<ÇóxÇáỪœ7Œ1æ̀f… M5KÉK’ü„@?Ó€’teƒ“´Çư´ @Z·’₫µ—ç˜mI–ë%ÜVÊ­ªzi *­úÓâÓđ£ », Ü^1”¾ÚJ:qF7ffƯ0Æ UàZ”„¼ ¶­“sB© h-[×@|†ïPîfn9p °AŸJ¥ÿO{¾RÅ5ÚJ”ûÛ ư˜F] å`oû°±éF‡PïK¦ØË²c¸u÷ÿ®UQĂZq™æL?· 6Ys¡j–r = 5dơV¢̣‹ELB×oKÑæúC¶¤ÄÔ Çö.CGÛâ’äWCár*_CƠç–‹’ÄtA,ÿm¶µ£}₫̣¹iC tj¶Iæ\A¹A¯^Љÿ€K(?Ù@±Ú@@¦Aó/?—iñ×áEÏÚKJyIÖ[kP¹Œ9̃¾¿É´7m³Mÿøsô#úc’K×₫6̃† äŸ <&°Œ-wP>qØÈ®ëRá9,n=ÏBhØr y¾”oÏfh…OVR¥æ‘TĂMh»Đ¡=Û·ï߯1̀lo{MDóŒUùñ<§ÿ̀!×ư~¯pÇŸfà(»ª{)évưVî̉Ip1˜˜w†D=ĐoHÈù’ȯ£ââ¾µ˜ÊœÙidZµjñS|Á;3«r‰?ù 5O»\ e=œ®A/>̣èQ­l“¬§û¨k>ñ¤¨>̣P†̉óẾ8;ç$ÆPơdMĐÏBA¤„uĂBđ‰Á•û»´­Í5ÏX³¢ Ë\S&4lÈË.ơ(l5ÛÖEn!̣ö#<Ú?Ü>üá˜k₫í·¿‘„:ñß–̀Ke ø¯IøI:ˆçsd¢UƒÓ–¥/ÆkäïlbÉöƠ(!¡—pî¿·ÖƯà ±|4M³yă”CÊ»éBçå8ä©=¦éä;ơ<¿ ư>|zc‰ßl“; ê˜äx<_±Œ-ï£ÿÑ¿GxwMÏp®^ʳK˜ ̉Ûƒ :çú¡¡¥÷¾o;kRÆc³̣ë¸û;÷_”?­ùœ¯¬'÷ô¢©\̣ùJm…äįyNö'À„”?=‹]¼iê¦2לcb–@öIîióIơÚúm»½¼¾x_¥(?Îú‡Ó%#ư׳ŒèŸ•+s<·ûÛưyÇk̀19q̀.MªÜ)ç^ ¯ØG–EÑ»XzÄX_v&TƒE°ûữ{ϲy\†ïk¼ Ádk¼ă.ZiÚrëi,Ñ"D2o¥Ë·bo₫¶zđ§ &Û\“kôZ¡P¯ à—5ơù—P·ok[¶†, “T©™f° d‹̀N‚í£„ĂJ́óó€dµåă¨ùQ.¡T3ÂÆ|G–†¡—0³Ăúê«­nŸ[7]^oªM[·nÍ›|ì â®^Å\§™Ö6[æ*/TÅ1Ă‚·„g3üÔM³ăĐEz"†y$£}¥—4¬ 7Æà!"S"È{ÔÙ½ËØå|b¢ôXvbë±Æ_ ›nº…;D·'ºå q˜4ʹ¥’² |}­Ơ{ÇhÉzvæ†o®€åÔ²€,Γ¢*é70¶ÂívûôéÓœsC0CM]âåÂÄájg;¢»Û¦Éñ¼o÷qÏ]ñ )Jsä,Gñ;` ̃ 2f˜¾Ưz‰}jĐb„S&¦úqƬ»fgèn—³JME3÷­;ƒz³qŒ}Ûu;-³ ƒÇß₫ö·1Æóù\ki ½®›—ïTcó2­Î¿fÜ‚–¢ ®=«a!B_)›ïÓ6± Á‹LƒÓ½½ÜTôq0Ạ̊ R'Ù…pËŒ¼Î¥̉r0à*h qK“¡,Yó–M>»ûưnfăơLMª ª{O÷f(.jpçÄ‘Æ à®°hơL½´\ûªL™ü–yíTUµ«NO<°oưöáă‡eë?₫̣̃£§·m… @âRC=AÛ<ËΪ*j6NDZiü%5*جIKư)æ(2ôà.:Ă_dsOo‹ûI ¦̃¯~ÿ»ß‹Éóñ“̃û̃wODăquI©YåÇÁØtï;;—­çñ|»¿½Ư߯Çqœ®ÍvV†1Ÿ¾æƠæ}ÖÿTưÛpbæçç°ÆơCµ=ûŒ±‘BªN\&чï!?u;y븆¸]©j—ó‹®%Z•²´NE·cØ8ºü†PøƠƠƠn ÚÍ–AÜ‘rµÿ5®04hÁ$"´Szà\ÑI¡97Ư\­½‰P‹aEáUh¢¼dü©Ơ/iÚDrŒ™h½ơi'¶S„©ơ!Ü\@S’Dàó3¬- ±µ<ß #Â-ùj‰9°Vđ'†Í›¶µN£p! ÏV¤@:UT¼*’n¬— µYÛÁVDgˆ…)Púfb›mÜ}u4KX§3Sâ±0$ạ̊oØ™ËGnܱ­‡UüxzAâV¨ª·°Kẹ́Œ%©R¦Îpx́n₫Èt ¶nï~đwÂ=ÏV­Ê+DóÓ6¶mmMœcxÎçQăoVˆ‹”œp3O\33ƒèR¼æ#ÛÚævïh­iʲƠ©Ô ™‰IÑÉxs'B[­ák~^3L²°¢"Cd™r¿ßỵ̈—¿àÊODcYÀ¸Ï3¿U4Ă“Æñ±ÆêWđÇ?—p¾ç´„º̀ úg†åÔØÈÉ ̣¥ØiÑæ³«đº²ûüªE)Å)®Ü¿úp¡Í̃nÇsÁ5̉¨:½đT¡náT a i”›bƯÿJk'̣8ÿÇÉDℽKG¢»RÚCÜóekß÷OŸ>™Øß~ûÛœ“ƯÀ€₫UShÚj E²âÏÿñ̀>s+„ÂUúOÁjÀ×o_Ç¿ôPæ!Rgfł׳Ä`ú„ø‹È;$.ùå±{e[øâ¤n‚b¯§¢–++̀ä¤(/ffrºIâï ?95º\PI¬ûe‹n&'€âĐ™öó6_úKëM9Ö‘s3)'N­d!àâ9ñYZ!Ô;‘µç/Ö·L̀À­Jp̀ëÏÙ2÷ׇÈÚÉù”đóñ”w}đ́usoŸ0ûßûNyè ú+ô¯lt¬ªrZûÏá‚sm?\ùƯwAl*²µçñÇ@ÇđZ'ˆâ_Eó"Ăª¨·¾÷½ơvÛnMÚ¾ïhưBí"?~4,ˆ†EØz¨ÄÆX¢cÇñx>ŸÏçóñ|ó8ˆe#Ô„@K¢…kç̃wŒÍ©è?Eÿñ‰·ÿVÜ_²89[s²™Ó¨²Ä‡—\ƠôĂƒûÄ T}]É· ˜Ÿÿ9¥/G¹‡~vS¥¿³É6æĐR· ˜Ö¸´2àƒ$Ë ¶ËCÜ?´$ y•¶XOQ̀ÚJôm•e%á'y„z:]]UbÄË™z‰WF¶ô×Oß4” ‡ ¸ynkƒU¨gÚºuO´Á*‡%¯RµSj‹ßËÊŸU¿ºŒqEÿh…«^'ùG€‹à‰áÎØ\ o©–¬¨l¢KƠ|8€L=Í+đ⦺€d® ÏlZ¦dÏÜ;Ë<y>Ÿ8Ư=oié€FLïḯÜ `Vd<_aà°Íb˜|£à[¥ *>•Ö¢¹âzr-đÇ/u|s~ûîå²pÚÁṛ¤«µ>zk­ÍÖ‡÷Đ̀ak¾ØµwéoúöÔ'–̣VÛIê*¥Vö₫¬Å7,s\"çĉ(Äçg´º"WùĂB4ñ;cœSÍEèă÷¤bå˜i€µÍ0{–zVnđ# êÎ5à{„ẹ̀¹₫]ëÔ‰[Y%ÏlĂ†Ø½Œ–.[Ơ3Q‹@ˆ¯ÑE‚µ¼Kå:/EȨ!Y}.ïàé‹̀px6×MÁ¬€ñ½¢s[nA]S)-â‡À ̣¸Y„öPµÈ §‡›X0^!%¼åT†LƒH&̃å%‡*hc-…57úÈ̃-ÚXá¿„Fa¨†c™#yñs™6¥{R¢óÜ}c¤b¥‹Ú‰Êt1¯₫3 PgơK ­üWÆÿ+wXr~ư³~›Qơºl,–ô»ơ•{3^Ùv k_LSÉñKÉîèµpy¦¼{u—á‹I`˜R÷Ï>Ôâ˜ù8K×s>]/Z XùfYd¨l7Ó{”dd X³Jđ'謦…+ë½È¢bû½¿̣ë|OYü“û«Å~”EÅ/# ăưGp’¤SvR₫®,àÓ)k ñE½½™ˆ Nµ”Øk¸N(‚ öy'ç™æFŸ̃^ˆ”\ñß]ü³ơí¶ß´.½m­ÂèlZ 9’÷;ö`,! éÇưqGEâG¥›% ßwYrù­uí_?~üđqßö9æó₫Dô»ưGH̀i§¹ß KE¢Í“Øh\ Œº|R$¸“R¦¦H‰’e91jq.¬zi%5D}µƯE$=oÔ6ư˜ZD®1-©¦#°D¿üC—¹>䔘Í6½+¹HÓ°jư--—•[´ơà ÄŒwœĐN=R²wç¬XÂK€âä Ïû,”2_™EÀûÜRrÙ)ùfăđ&ú¯›”ÿN^“ë‚₫[mÓäƠæă1nNzÖ¹zjz®̣ë¹ñ X.K>ù9@j÷"kJ\× 1dƯ!ʇ?›Ă¨Ê.OPÇVÏ·æ^¥ ô‚Å÷H%‰ -:…àé!"¤>›nS'ÙApÄœ— ¬9đ‚FtÓ₫H æ^+r  Ăz""3Àá‡ƯÁ~D§¥ko€:#ơ5Y¤Ơ₫#eá1̃2ơâéqÑ<èY"§Öåáo\OơF¦,ïÔ¿yb±8*½*.ä“3À`a]€cĂÊÚ̉5Æx|~̀5׌ÀÍ0|í¿j‹_qpée·j̃đÊYXñú<ÑÿẺ‡\K2G4»ª1!bo½Dÿùgs=;êƒăư¯óL’èáư< /Y=‘h®¨X0„—ä0?y?Ü­vËÈé÷"M"qÎSŒ9` y:ZK]A!Ë)¿¢5åñ!µ±q±îđ{‹̀Ú>›ëÿ µRHCâŸÜ’^>á©a1f!™µØ&Pö3a˜Kÿ!úĺu€̃«âö#ßsÅ̉§åwnơÉ‚<Ó₫m÷j.‚î¾<^)oádÏ25AÓ©•f6ov+U&â^7PƯdƯÜPå,T¢Â»E»0₫ÏSó~ bh)Ö xŸđ"Ô¥Y®jb¡ww÷· \@(çq+êkhæ^âͧỜûƒMlØ@o@׿} „ q—V…z@÷ÊZ³üD|a1'ˆÉ@R̀ZO3”8̣¸.¥úNë{Dâêgró̃>ŸÆyaô\pK½ç~Ÿ—Z3ÂA¬ L¢‡2+đÏƠ8QïzÁåtÁ>ÄCÇ~Ă'¬ vE»«-[èÍå€5F’TCŒå„ç5çtІ‰í_Ë—Ï›Qư¿ ·, ß§¥ FLzëÇ8Ösü!N ¥nÏùL3VqçM_ä¸}SX2(Iª˜Ø±+‡]’M·)Ó“+ Á•ºÖ“œ¬•†Hfj¾„ÊC₫ ÆH̉`3û•ç63¤Ó¨±ËB…XÓ†ÓJ ¸R`&)W3µ­mÈá)ưg†É4@=ØœbºgÇ«ÚÇB–F4ÆE{Jx$Đa!J™¹ñư:¿ḅŹ22ơîñ _N‡J»1¤<+¡Ë;É÷›/}ó úăgGü:®jÁ­¶,ñ9êÎñ°kü×-rdÁ'² ăÛđ¯ü:R-&¤Ü²§\E¢ UŸÑCÇ)°ÅˆGQJ^âE¡[̣@Æ„œô•!ê諸́6̀|á)®ö”•i¤|7u/3-±‰6–ñ$/^ ̣Uœ:¼B*Í«(U6ó^ó“ărg2Ó®û·Éj'{¢VX-¥À£$±÷̀=¦ wè¿ôzfªl^¿ï_ñN’”0Øéúk×/s†âZ-Ô|¾-°-Z>¹s—ôàºTpÖ.[Çq`í±?ÊM$#ḳ­Ç¿YóA?ÀjµYÅs¿(便“ø¨¤Ñe:ó+’ïºϸߗ¥¾{$!½%+äRé‚<đI¥Búÿc9ÊLúü;₫$±èød?F!‹ÏƠs)#¶wÍ•6¸¹@Ø™¾ÙU&¬6­è•qiÛ-y»¹ xÇü0 _ùôúŒàÖo}s£Ï.Α_5?-…»‰;ɯ…£yÅ4b g$Tø;'̀ÓBTPUƒĐä:07{9·-ª1û–ÍlH]ömß¶í¶Ư¶m»Ưn·íƙħÖÿâ!AkNÀ:_$c•… ÿ{ ƲœŒ°ḅ] bÚ”gë?üá^o¯ÏÇóó¯Ÿ)Útƒ¸}>'‹M·¾÷̃P°Ø’¾)][y‚œÙ¨“z§gä8̃B¥Îa<× U3µf…§fÔÜΛ—ĂB)­Kjáimr’Uä+l|‡„nŸ”_€z´xJP™¬zZ4Ïomư]µ¨^é¬Ï…ăê₫Đ( 3e"­ÈyªNH‡W¸¶‰øà¡fA?ÀÊ5Ï£A ¨<àæD=‚‚́°ÍÓu˜ßVÓ¦]½c˜¡¿÷ÊüR5vô€FRi{¸·Ré© ^ˆ;ª̉!ﱂ%<·³Â2OVÓ6uf ­Ï̃¤µƠú́]ú¡Ç´‰ºä7µ¿9Ü0¬,Üôá·ăQµ­5‹O¨­Í6®?è4̃Çe9C[jÚÓZûøñăœsŒÛ-¨ 8ÀêNΤf—…LH¼RÁ8¹LZªN¥̀Xº¤‹ă–Û˜Uͧ¢¿6 ƒs…#£¨ºé†:À}̃½±I}Œ—ÇØ`V—†«ÚKbµrĐ;‹÷ß §|¼V,Úºxđ è”Ø¶íåå#`d‰˜{p9¼¼3ÄOÜë™À! fYPéÖ³êÂ~€&VÀ@Y5×6¹̀QÜ|,€Èù‹ö¡̉›³m‚I~ UCRÈû  ö}ßú6Æđ`sWgb[Đ?‹¶5ô'́«¡́ï|œøæ –p${îT\|&À{¢$Drë|R°¡Ï¢ÁŒêêfö'ĐĂZq˶ăZ àJ¸Ưn/¯/föÛo¿­àÿƒ̃9•pÜ$úq¹U‚©jĂhENËG­^^g€eẠ„\Í]hh–̣‰÷Ù́»GSŸ‘ÏF2g´‡ ºæêyÀQ‹”¿¢đƯƬHRp‚<ó̉øăË£L”iüéÉ–CIj3Y^ŒBÊ¿ô‰®â—Ÿ²Ÿ9y¤²3•'B-ÈÈú Çœç—LC9†uHûöVç:a攦 [Ăsƒó,£±OÊßËÄ+—0Ȫ§.sZ‰nËz ÛCôﲟH™k5IÍ`ô9µŒª{¨}N)Ö:¥UsM˜¤[Ø@áwˆ&û¾Ọ̈ѹư]èƠô™½4ïôƯ·Ưÿ̃6pÿĐÿl›üŸˆp¹A2Kä9æá…t†”Lè¿f•¤ºY@ßÂr)8ç c¬̣ï?ư₫ăëÇo_¿Ư¿̃¯Ÿ̉!ñî÷‹ï½iđ­e•×㆗ "–„ï¥₫É(¾¨ơƒgbl"U+óe–ÄÍÿßYơ½˜t™÷jBàĂZ ưáü,I/ ±£“»ê:u;Ï?‹ ƠÖfy1}5êù@k}öC̃z›m¬Ñ¤ ÈØ”:JJM4ă®-L\ƯbNFª# n-:S₫¤.–®.•nU}yyù¯ÿí¿>¿₫ơ¯÷·;KxÉb”?ë–rg…ừ¬ƠÔmSR(L4¼ê3¡g314u­Mơ’6<×bMV"<¡Cà±ñ¨×œE<×j­ñ@̣$G\CH”s‚ëÚæ{QùÎÖIË—Y¶­o¯/¯Û¶=î ṿÂ"4kS¦b₫îe[1ù¢9¤›ˆÈér O¯Đ~$UÚuêÂF0̉¥bUĐ,¬FY¢±öé—OÇq|ûöíù|Â@&nF’½”U´÷₫éÓ§Ûíöù×ÏÇqpÑ2Ô ơ2ëq™PóDRïÍà~Œn­T@V/¦iûđáĂ¾í¶l<‡ |k3@|Ô¯p=ÀK'ëo…qF¿4àJ¡¾̃ Öÿ̃ïâ·”¼¾¾₫áXk}ụ̀e±Á×ʹX¾¢áˆa”Ù¦’Ùoøº¢ă"¡HlF̉Yùà,s³d$üâ訮 %ß?”“êªî3¹Zƒ+¿ 3Îg|Fơấ§[ñ—Ăf‰XØåφ“̉8ÏA’I®×Ïó¢Vêï̉2W_¨̉#̃:%$®ÿYOÖªæ›%Đ¯L¿HÑ@Ÿ‘ O »[;©ÿ=®ö Åa¼£mÛ½C̣̀eó¡³oaù¨,—Ù JÆPå|oE ₫ưS(1XH(ïùƠOk5Róíù%­5¦«ü!ø9æ1lŒ52X©Ûû(†Ä…||̀#ô2Z®vs•ˆBóMkâ»÷}ßw—ứ74₫:9oóËv[4U1ƒŸüûñ‡É Ç Ÿîyá½\&̃óƒự̣²o{“6Ç„-e³¦¦]úm»Áôó¤Ó¶ơmß÷ÖÚËí2T7 ßu=1Yă=·í ;j4[|*Ï/•™g,/ÜŒµÄĂÛ%A_z_P_>hM|_e\Oü¬ª±÷)pæÖÂ\™r^ /KÛÀ)»Q›ơơ£n³yÆàẺD£LKĐ¿|´đ%¤å₫Ó²t‰úƒ9\À(A‘|#Ägơ$˜([̃ÍX«ZbJ.¶gÉ̀²Aú¢ôC„ªª"N=¥†v@$z)ÔQÏYî¸Iăë O7·&†TI[ ÊŸ¦­¯̃µ5†ź†°~¼4“Ec‚˨ư ľK‡ŒÄưü£fÓV[8בT9AÁ­á|¥7¡çÏ+)H1a0A•׸laa«è\ùg’£k©êZ.Bàµà!̉H‡ñ¢æHƒb¡ˆ —€C¢cc[×̃Gßd{®§;ƠXRø¾ƒVƒNÏÙJ™‹£h`bĂf @ËíÜÚ/v† KÄÉÚËZÏÇÓ*ạ̀å;:“@[3¢é¦Ch/ÉÊ&^¶g-Û?º9 5ƒ5\Đ#´3%–ñÜMxJ_ J\¢%€Ÿ¤qm˜¶­ư₫w¿Ç4™ă8á{ª°œAIiG„¤ÿå¿ü—><ïÏ1¯ÇA3Ó§P+å)R̉Eÿ©1Ô¸D§újñ¸ưøáăÿéÿøúåw¿|ưüíß₫ơ_¿ưîgA‰ÈßËUän´ü¥k¿å0{ô+ưÿ₫ÇÇǃ¿î”B¼K'xSúƯP OXäÍ›§™(Ö§Æ…Z¹$₫§×uiîn³bñwùG _:;CIç ÉÆß*öJ€x—yµºæ"¿¼U­J6WkS?tH%Oº̣¤² »,ÿ™ơçc:µD ê)₫æ‡ĂǰŸ?æ1ç„‹<ùéc@ÿ>]¡œ¤)ơ9›~™ä™ë|¿¤.%}ƠẓœôóÏ?¿¾¾>ß~ư­fN«‡¼‡³×Fđ@Iü37n!ûшêUöÓ(Cª—…X¼Û|׸î¦È˜́ë7Öüö̉8àÁ¡ÿ‘ÀQ‘ß»-6´LIĂưùăÏüĂ?ưüé¯ùëëÖoû¾Ăä§oÑ Ù[ ) Ÿ·ÔôC ›×0âúgJü—-ä3—Åàñ‹3ÅUû̃oÛívsƯÑ LbëmkÛ×Ï_ß¶́Ăíƒûˆ¸ ·o­·½í///§¢clK`t¨]̀pOƠ²̉ !ûÑ¿óA®ªbÎü;t+„₫¤„NI~)=YLlô‹Ä_k§àº•¤ÖüwA]¿lK¼p8ÜJafˆÂ<°\X²Ï †ÂHÆáî©`V”ÛmÅKtªÏ: }÷Ơ$A$ÔíÁ¢Ü%~̣½¤á2$NŸÔ¦´L¶Jdäí–°TG5¾@¼`³Ơ¥cx*ư§Ø~j̉ª/É4¬ñVæ"Ólƒx‘ª¢ƒÂ$ëD©TcW$à°®‚V ©ÿö¯];’–>{×̃WgsR_¥ä9xË\j¹æJ¡)‡DÆ®µ† 9g¥U+&½w 2oûå£ Z–¬1Æo¿ư†^¡Ó7aáZÙϪ.*~¯ªººgFÎ}®â´o­ x ^¾è=[“ö¦Å„ æ$ ƠÄj›Ñ´1ThƒU¥A˜p¬c˜gM¼“b²ÚJU‰¸µŸ•fk¬Q·Rè/îÛSñ%F0)ªˆ!wÄ’ăy¤oä +l¡éUŒ¢ẪŸ`<™ ®­÷ ÀÂï"5å’Ù #øÚÔ¦;ÀxCđ¹ Z?©‰®˜|%{¼Mlv_¶%÷éÏ·µÖ:æªJÉ´OCîḌ‘é)ƒuÈe ™ °”—+ç 7ÉĐ3c¾¾¼̃û‘ÙU"ơÖiéùkfƒ¥¥§ë/5÷̉FÉăªŒÜÂ9=̀?ÇóËç¯Z(j_AÜđ•ỹ‹•´#B=”K~ÛÉ¡̉5ŸvªQUÙƯ܋ۖOđ²r®±èR1fï\ˆ¯¨ø'X„ø!Å?BˆpÎ×/¹đœÑ¢ª1ßf ÏŒªØI:«ùî˜ä#(Ñ¢¢–Ê—;n“„nå₫yœ¸ÿå̉P)Ă×$f಼™[½X̀Ÿtg‡å !OzëÛ¶a‚;áuUü_ß gJ—0³÷ÜDQËUQâÚèåΘmî<µüFÇ_¤ª0¤ØjçbÜØ̉AA1ƠI»¢~3©Ës0=ƒ̃ÆÂѵơËg®³c₫¿ûô»ÿöOÿí—O¿¬çz̃Ÿ?Đ2ÛW¬ÆTÊù”åSúè À´ _^đ ʇ2zæÏî7™·s-₫ÀƠĐ›íK–…Ö…Û톜˜̀9}1ÔŒ˜çElØS†Œ(©ă¯~B8ºp̣x½y¸?¤Y$øµJ§–Ï”`D:Å¢ĐÖ˜Æơ›ˆÎQ²m(†Ü.€kÈGç” @ÜæahFNư §öçà·Àœiœçü-jăˆ œơØø„@ßz¨P¦úºQƠ,-F«ör‘"•à½Új ‘—°Kè̀[R»kÑ dc¥̃Z{â\HA´©)Uàø/ ZÈ{ÚZæW´4Æ‚ MæBÜ{¸ô­oä’¸â8zñÇJ´×¬é̉.}è@<…p¥¯̃¥#v£3xÚ„i=Z·É=ó:ÅDºÜ^n*j“Å¿<¤C°‘j³3˜HÅ%)-öô˜™1₫ú׿ªêïf{äzr»£”..H‚Â)ÍïÏ%wÍhém´á±IÏ#´÷ÖăñX,rÜF·Â` ”¡-L$ÏsÄPâkàV[Ó¦ó ï&Ùt»’®ô[ªÂû lʉ®!ÍG,"j:eÂEj̀ﬨ®nĂ¼É]Ä|=tóXä'ˆ©Ù2ÎUí¡,ú¢w-øƠÙùp&nß¾¿áèé­COåÓd£éÄÄÏ9?₫|<ŸÀKƠo“(¦ai.c̉«¸VCs¬“ơ/ëưEÆ1₫ú׿î}ụ̂å+ơH<8ˆ‰₫àS(£ ƺ„Áº}*$tHN¼n>ûiªˆÉ8Æ߸­*¦¿C|ÅÓWøÑÂ4VèàÆ÷®' ]Åló ·Π½,Îz&¾0ÙVß ’T¥áẠ̀ˆ+œ×9)ÜNµ‹8¿êU!̀9s>Ưù]b]é,dÀô&^ßff›Ä»LŸÊpO‡w3¦ÏÎ9çt•ÿ ÊF`c•á6„*7½Ú₫¤VrÀˆBî™ÆV&¹ưïrÈB™`Ç¡w}>ŸË®Ă³RåÏ¿mâ ¸đĐb¹ưY‡’z̉7=<̣ÛFó7"~&Ù¸É'Vå²k­đĂÉ̉J~yP;O?ÿë̉J{Yđf¨[̣ÊY¸x¹½üüñçO?úùăÏ?üù®wèÖ8Ö·†&G kŒÅ”ƒÅN¬ÿˆZDUz³₫Ă³F‰îgï}ßö—Û v“M›sfí¥·½íœKàÄøA±Qá¶ßpŸ‘ydĐlµ¯i0÷oÍÀ½ßI=œ«¥ĂÿZwœ¿»ḅă”|ñùñmÿƠQEÔ/„I ÿ)wPI˜ĂøJ™¡ü0¸Äœ¾yeñ;ø K0gÛ̀–̃2=Đ–„8CÀ'YXµ{…C„¥Ü[Ç'ÔØ,]ĐâCïƯĂËÉ-  E ï₫ƠB¼.,°–ö¿dă‚ù¯‡®SBÀ0m]{·¾µÍíA¥™ºnr ÏM!³Y}êd7äCˆ2n~'e1q€±xÉ{Å”€Œ9]‘Æ8ç÷…GØÂ4CLÜV6 j@oô1đ:À́Uֵ뀪7,7æ'"WƠmÛ₫ô§?‰ÉçÏŸïowlü¥8°q₫]AfÖlÓÍe]˧,_Ïñ8±ÖZo÷7ªh\¸"ơ ơXwâÁFëw]m©(EÛ§¼Y\*祸ă‚Đ[W¥́>/ó®k¬S&º ¡q÷±j^AN«u0ûs>Ÿó‰_Îßèy ñcæÔYY°†áƒM·íjºÖ6¼bĐRÏễ "ÈmPƠ]ôJ̉‹Ø>¼u‰¨b4ÄuÉ)€c4>Ï~.ú7óZPsGQV‰J*‚b€ v•zqôLkÈÁ5Ä÷a2d¬µ¾~ù¦ñÍ#/‹o*¯ ªÏçŸÿüo¸EÉ›FÊw"P±ç‹Á9kM‡ePạ́;̃—h¸₫–1Æ¿ÿû¿ÿö·ßđurt?ŸÊOeu"[^ ¡ ú¿|ÂØNÜÏßuiàc5Œˆê’ ª† V°ë¤8bá»iy¾±)(Ƹ¬0ä±zé^'eijJÏ8 ?¢~½3%Qqª'Uw½íÎ>JöD2¤KˆR÷`ĐWDCĐÿ§»—ÆR'Ñÿ4Ç:ùèơ=ù¤¤¸™¬'4!3‡dưĂ)‰ÿ(đ–¦f©oû¶ß¶Ûm¿mº÷Ă>ؾị́"N¨è_£8#ÖgíwÙÆÇ&̃;­np¾VeÜ[ù€×r14^7È”3ƠÛ7‘†%;YË5Nq€á´¸é9€C)—âGŜɹÖ£PûÂp‰k ¸-TT²¥L•"%=TörlÔ¤•ÿŒîđe b_é¦ív»íû¾Ö:£J³*́ôt5|(àë§0“Ăæ»̃›JßWoJîLAÁ|èÎELă¾[œî̀J‘©†¢ÿä1YC(kTœ‹ <.§ÁÑ?‰˜µU” Y²Ôæ›.ö§Fđ,<]LùƠ™{đ{K‚‘ K=,cbTs¾&Í₫ĂôSDœ̣ר—ê 7¯Øˆ27Käz¡W±eü° àæ̉ÆÀ¯¿o¥à·]Î8_&¶L7W2H‘Đ8dÓ…©2€d]XĐæ…¿‹o Ó‹Ÿ¯…ˆçäE¹NÆ=¤®̃`=O`"üI*îO¹?‰₫)è¿–(óÅ-h›¶mÛZo&ÑKÍpp’nÍçæ‚qouØSÉ»Ü%¦ÔU|mDBuê*Œ“ÍÿÊ“¨Å Ï© ¯ Á ÿ-́äYH~‡u‰vªqSđ{S¥ )›ªmx—Oó²đëë«©=ŸÏçñ/RŸXvLËœq¯™-¦‘®°N15è̉•c7I[jçv^1?›•B₫j̣q¸, ₫́é!b”¹„ơ 1EwáÇXÈ36ÅÙŸ’Éâ,0 pT´÷¾í›vµecÑSÊUƒ°̣êngÍ H₫±uè˜k¶pª™:QÀÛrBÄú:$ÏÉTiîN|ÂDH£2À¶R*IbƠZ”/Œ$&A8đ’…Ú%p?ƒ-lŒÙ}»ÖB£Yж6¤^X’ƠäH­„9‰…vÙ̀ G̉2̀ÇIưf‚6¼qX¼7 LU7²„ú=Áhö!¡`¬q{¹µ̃p|ưúơơơuÎ Â;ÎϨ:á®tÇW|.Lifô DqÜ$/̉×ᙱû®Ê¥[—T E’₫r̃µ°ÈTw¤)8­¥ í/¦¶æêÖk5€IˆJa.‰CFŸÜmà?­eeÍö½ơ>z×̃f{Ê3ç;:;á̀1&f¸NÀG‚æœăññăÇ?₫Ă?Ü>üóÿóŸ±éj€W›kZ9ơR0̃»NhĂâ¾EJ6WÈføó¤vßÄ–¬M6nFÔëDeÛ6ÔaD|lœW9VC^¶d₫€8¨&›€è.ÈÚq+ĐÇôtb @¶;¯(úI6œÚZß}ü %¨x+˜!ç†#ÏÁïJwÚ‹Ÿà?>“BµÔå]­ËwÊ„7­7:P₫î•  8§^RMj$/Í©~dA}ËË^â?Ư]Ñéá´Mi¤Æ}s$!-ăL9‹±ºª̉ƒ³Ecùÿ€K¢̣w2lÂ.,ưîàúc¯Ö–ƠÄÚXl›H1ŒœFưÏ\K’_·0’BäU _Ö*Ëûª²!ú§J~¼>‰óuÉÿç|ÂO“5=9ÛÈëË+ zcçó‰̃¡%>UĐ½ï'“Íâùó^W“A¾ GÆeÈWBdz–'[&ÎÜ GS¥G4˯>t&m´₫䬘rŸ)üH‹Ï5aŸÿ8¸ê]³è¾Xáje’ €Å̀`|?{̀Đ£¼÷}ïưƯâsߪ÷}Çe»¢”¤2w¡ù ­?₫ oáÇóx̉ן%̣;'BÂ₫¶ßömÇoÂư§ƒ*ö‹û«F–²µ đÅs7ÚÂ$¥Í§¯$©5‡øp´g½¨R₫4kâ‘q‰]Ü5¢á„”¿¨DrîrwáñyYXtj ¥ 5·x*PÙ­ß́¶µ M-ù¯UÀªù³á£  ×ZÛ¾íûåƠ$˜₫µÆ}ơ±l¡¸ÅÚ\S›‚Bk¥‡™©hØfÆ$©̣€¹USFRù2³a£N°¯YôÙè‹`,ẮØ̃z_½÷n-DiH 4Nö̉iÇc„i@6—„¸%ÒQ…îÀ›¢©Ô›Ơ›ª5|B×ZL¶µ¡9YÖë₫ºßöÇóñơÛ×?ÿùÏ^?|ÿö}…›¾Sé+”!ªƒ· º@;µs^ñ§«wTă×*=‡Í¿¥>‡Xy]T^äÎÚ<‡KŸº„PÄ7Ÿ~ó)ªfæ3zC+T¼x²­©ŸÍ™{p:̉mª=ºhªkTdG÷a7Ú6đ@µĐáOX›ËưÍ›d–­Ù&PÑ’5æØnÛÿđø~ÿËïÿå_₫å₫íÀà¦P%¸dê")eÀ C ”^^ÎÔ.Ñæs‚“ô‘­o> ¢&`Ừ́¶ß>|øĐ{ỵ̈åKú2™ ÷Ǽ~è½Ï1ç1¯ƯâÓzë/ûËm¿!Eœ…Ü󱉯1đ®)LÀfIŒW|ưÓˆ…½”¬H4æU n±Ób[§E²Ÿå¬TD<Ä2sJ‹ªå剀˜™€8ä¿B¯J‚>HÁ[QÓưàsH€”å×÷UÅ’IסEÅ8µÂ g›‡øp̃TQ8æçr±Çñhaö¤Ñ#ÏbYå“4z«ù9„{́˜w C`̀ÑWoËsƒ10Y³ÖfkƯ½äy#xØp T çô6d¥–E­ke脃~O,´2*ܽ#Íœn—ªW»|(o45Ú†jkƯåÅ'.tíÀdT‹2°Fp‹ôº4iÇábªh ˜25†¾!¡ÂSfº2ÆƯº ›ĐưÛư₫v÷‘+ơ8áC|I·w© s€f˜̃Ç îd=KjÂÀ_Äø…[ÇÇÇ…$”¶«W´RÛKĐ€Ûr¥Yƒµ;4 ŸÄS5ëÖ̀ÁƯQ†¡ÇMkî»V…¯/¯ÚôÛ÷o_¾}9‰‚´ơÖóq̀ă° ‡Ư¢–yÚ¦³­†‡…öµ›̃^oÚ‚Ht̀ûÉ´k̉uØ-sf/mÃnG‚?uè†û:€—MÙu¬Ÿ.ú₫Ó—¬ư¶oÛ¶>¯9goƯ7 Øưq?ƒéSÊæ%O—̀²B¾dơÖ§MÏñ@ê·đ-ï=¥‰0Œ„’J0¢±km¤•wÇJs1C›âº‡ YcøzMºƒR¯_O $>ƒ¦â©Fæ²̃ѳԷ¾ÙÖ–^ºdèå©q1 &¥ÊQ0Ø™(9TäĂ—̣|±üqY¿ô‘ó~ H¨—`¹ñë=Ø+q^›V­L™¼àăö´è9–‹D^ó}å; a7®̀Rb `3ª)Ó8m)l$E >b· î‡)ëùà§̉©…KÉ¥_,s€ûµØP^ŸÎrh‚Û´çè?L]ăÉ"Às<ÇHr¤œØÊ­o/¯/¯^ßoÇ8Æ1( ÷æÔ¾ƯúmÛ6<Íœœ¨á¦ßÂmOO»́EÏl{¥*ÆJ3€ŸJÅ£ü²©‰Iñ·¾¼ÿûYŒDÏŸ–+8$eéoÔ–ö©ưÏùt²CrÑâ–­ñ@9«Ø £âÑ›&G´ #½ư_o¯¨úC9ó4óËÖ>ó!¡ÿk-ªïoß1cØÍF©₫ª’B—°Ó÷¶ƯClZ—q•qY3Íd€ÄªeäåIÆẾÖ·~ëKÖ÷Ç÷qŒ5–·Ç¬SÀ0êQµ…™}\›KkZ×M½?¸MföhA5ů±ÔAè^:èüÈÍ#¤UhwÈ@Ü!ï?Ï?̃¥ÖÚ-¬*đñă¸roü2bÛïÈÖ¶Ù&xåmƘë-½ÏØ1viûKú-„[ #L]Wª-v?ÿôóOŸ~₫$*ß¿ÿüÛçû󸆷é-f,­­émÙ¸·ÈÄd¥K÷¶#…­ F/…±Z+Z:Ñ„’³T4ˆ3&¤`rŸ«¿TDÂ…ñ¼Â¯ kđÙî'Ù‚×T·ṇ̃ÓWaË21] É–¯LĐ̀‘à´2»Ê?ª[îà§TNónaµlbÇó ÜA3€BÚÛlCF]¾̃µ̣Đ˜µ…WFnib÷ûư?ÿư?›´c89çô¤„I¹$™ AQE9ơî!9gÛ¥Ke$a%B˜ Ó¶ §çµl­¾6ÛˆàÍ́y<¿?¾ßÆí‡,ïĐp$Ë!ÛÚtiö€ă•̉›eơ|Âà Op/*3¤_âéßZ1"ú¬‘ DH¤ẹ̀Oi€za¥!d́ĂºÔëQK©¼I¹ơZqIư• ¸ä ³^ ‘çă ißÂ8WTµ¾k³üJM·²2»Øƒ!GÔưûN‘ÿăsGpôđC^HÎ¥̉i*Ù_q'Ư~(²‹âŸw€ÏùG0×MA¯UmiºJˠ°¬µ$@_V#UL €Ba>)Uåæ̣5Yn ?¡l,îÔ ôđ°æ£<Å^;Y¦Đ¸ä%×ATc`Ú<ÊRü3cÏùƒĂßUŸ»ªBƯ:Ç|<­7È~£4¼5¡N ÜåàÔØ¼óÑ?qÿ±´ØçỮ¥5ÖÁ·¤́Ç8¤ï\̉ñÇ'9´±²₫₫w/+H( 4kiÂÑUüÏ2ØkŒ±Æs=ióO ée?C-j™äËBB7Zÿ½ï·ưöûO¿¿ƯܰÛưưC#¥Û„YG•ú UD5lĐmÚă₫¼ăQRưRc—ˆ#iï£è½Ië›K’TJ/Ÿµ¶­o·ư†_*¾HNìÖLÆY\NÂSƒ»ÉiåưŒßYFÓÓ‚̉è·‰€VJBÅ{¸\Đâ“•‡ù•)\ôi 1PƠí¶©ê<æ1÷„}&̉¢±ÚÉbœ€>™₫0̃uyai¼ÆW6"T½ÔjßYD'­Ó+D°R.7fq³,Ü—Åd¿í?~Ô¦÷Ï÷·Ç›[Ñc†sú“¶¯x{¡çU3vmû.p̉:à+pèï³#2†fmÈèÖ±ÍÀeI‰<.%ˆF’ORƠM‘R₫T!/ƒ Î~œñ™ÅÑhÍ‚[RĂf1H¸/;+l‚4?w5ѹ]BÖBu)2WƯø! RZkŸ~₫ôOÿơŸ´¯ß¾ÏÔeêÄ'.©I›SÀÄ%OÂ6Pc¹ơÛ´ ÷ĂÜÿ&Ôü©³P—²­~Øäë°·N ÚîJÔù¬(“ÔN!!´t0ÇYºZ…‰§™Ù̀v{ÿ-C½ëjÖüÏj«-‚V±;jœ‰7¦¦›ˆÈ&Λ[¿½Ü^L¬Z¸8úo­k®ç!GFŸxÀ>à9ºç¡àB xû₫ößÿûÿöíÛÛư íGX¥CŸ²_^‹Íe_qFÛÓ²…w…VT’­ƠIµ6‘éằŒ*çÀ^Ôßï÷_ûuïûóùDtêâCâºôd=ÈÏD_Å3FúÇ“˜^(§\4¸(B̉™̃%F+Ô–*´ñ¥[₫Ç̀·$,ó·‰íÙ‚€§k´âhÄ`ÜU¼†N…¾ơËzÎC«0̣w>¸§̃îõ³QàZî–ÑÎoáï"ăóë#óá«Ơ$¹Ië̉­ÈW+ưÁ´g[ơ?ûƒO8>àÔ! |ư 4₫;̣f¹L‰!£Dÿ™›ñ¹4­½¿8Öë+xsmLê­PIĂ£©ôP㬉₫._4¥(}´,PóûyĐSm/¥AÅ;S—ß·úƯ?èÿjûƒÆßcXó&# @}̃z{<¿}₫íí₫ö|>1’I£Ñße?mĂÆät-D€ ÿHkPíí́8«+@´W…ÇU¶àG)©̃¼†̃N ÔN±HÛbâ»\ ÿ¹Áyô£ÓÖsëcRñuËK~؉áˆ?́’ü+â7ªoươơu®9ẽŸ÷K«LbéJ¼˜ñ17À²ÿ{dÍ%üÁ´é†IL₫oAŸä1Æ¢m–â`¦V„C%ö·•%E¿PÎ41i[ûéÓO½÷ïß¿ó•Èơ!’ê«Úv£á ï™€å¹̃bn.¤öt=G0ל:!°º {T ÜKTç\ếºêú̀•̃“N‡]©A“LŸN€À‚Œ3md»^<À¼_‡h/ĐfÛú†÷²Ë̃¥; Ñ·“&ôQ¬çñp8üußö¦íçŸ?½¼¼lß7`wüvdX+¨-¢¡-ÂcúÍÜlCs0t‡£́C:4Jr®ØƒJ$-\¦ÜÛKÖ±|…<¥ g£›Â7€úî5­¿îR đóU²4‘Û+úDa"¶57˲ègK€gSM“˜Ví½[´#÷̃ûêà’!ñ̉h†IđÁá‚]mÙ15¡ÜuNZ1:u¬₫ Ç+á#FÁ«7́ª®¶æ1ÿöŸûËüÅû¤›dëđÊ ‰Æt-M̀Ä5qOđ w0¨„X\-7ª÷ÙÀ7mïûÛăí9ˆ₫½w2[VỡWn|dơ¦Váxo t’qo”jÉŸ)æ ¬R0¯r 4ṭ x˜GN™`]¿h¥ü¥p“Æù¯ØJàÜ&H…Â₫T%A¸*"t®P;OÈ\Hañ«ë"Ú5Ú‡*Úγ{/Tô)7`I¦¤$Uâ!"0“Ó‹D$Ä’FKä¥çAjW)ó|₫‹Øƒ"JoØ0Û<• ¸l Ø 3Ê?2yS˜öÆ<¼ß™éÚú1³+‹jio½̣ưHCÆ?Ơ<̣H´ó*›ÿ›²ºù&"=Ç…êàÀ2 ư;ÎrJÅ?ƠÿëxÎ'Q5ÓŒÜæa¼!*k­ÏŸ?“v43΢Úû¾é¦ ơư«•¾GÑ ư¹|âôpÜSçLÑP…#Gmṇ̃\&G{Çà‰̣ƯÛ'đ«ÏĂ*ƒÉ²,Y¸J—çÈs ÿ<\=5oô2ôV˜ăúwMÿ9‘Éú#•ÊNß¾£ÅvßÜPÙ¤@ÇñÓ;éq$=ŸO oT0§û{ân3Üo³“ß?Ó́®nS{_n/­µ5Ö<&ô~UeçAÏÜS©ÏÜCæ'Wx|H(£,p Ú—^¹ª̉ƒ›ă°¶7Œ|c>ç.ûcd—öJÂq£/^×Ïñt.¦¤¦ơ²+P95ú•̃u›µTđø¸ÇoÛmÛ·Y)OîKNcµL"Fă†ª—(cp²\PĂ:6ÿăíííååÅSKÍN|[Ïq‰„Bù6W µÆl?ë=¬QpiÔê³O›î¾4`öió@üd ,^ ¨d (Ûz‹¼Ame×i=!¸tÈ1°¡đË3sœ—•ó74ÚbcÀ<ô¶ß~ÿóïúé§ă9~ûü«˜ø ±æÂ•°ñ5Ư„tEV’"¿ưöÛq½w3¹ßßÄW©ÏT‚Ư²ƠÜ'~êîơk³Óis¬±­ É@×ÎNk - Kó?₫̃üH–Â[ ưÁi‹+¡<±Üº‰;믰́ f“h)}®'Y₫PÓH3<³]%ơ¸\ʆ€•JÊæÿ„Ê@‹9¦U\kƒ§¶ơ¥$, ªÀù3ƒ($lx@h PƠ©³YCzÆq´Đ°ÈM¿ÆVä• ÆÍË„mÉRolȺ§8̃u+[K¿ t6ÀĂê&&«/3“^`¢™·XKæ&æ 0!̣9‘ăB ̉è̃qơ {Q|=,Ơ–óàè„íyB¨…É @,̣Ưù„eülÆđ) \à ổégÏă½._äo$‹U“ZqºIvù“Z¸¿œ€ñ¬+\PƠ|4¬½\2=Ux]Ÿi¥đùøü>G$? ××DZñúuï3’»N:œ7̣•÷x Ư$ăÅ«P- Ù@yF~ Ăơè5̣8BN^ªmÊXâ7«·ñ\÷j’®#†³,ÅX̀‚<÷?dùỘQ~êú#ç|ÍErÿ«¢ơ¦ù\_"sÍûă.!Nà%ưWÙÏ©›VZ/–ÿ¬^VháZ:)qh±œhr¢>|ÁXTʃBKWUzuø9¡ÿ–{ÙóÉ•b*6R;÷ ¸™Å=É•W"ûm_cÍ1IWÍĂ& ?î%îXÿ—ư.Ÿp÷¿í·­oû¾ßú­o}­ơ|æôçŒcVÜăÿ¦E)Èbf†lQ䨲LÎĂNokpn§€•aK µÆ‚ƒ–†Ë_6L¯¼~)ªß[mæQƠĂUé%cd~xÍÖ²°F,R3;Çóx¶åư¢óHƠï* ˜.ù >^»>»-Ă@‘áDÿ̀®Ï~>L'¸¼yvăÁ1J”&öû¶ï»•é™(¯Óéx:YMë?)f!Ä/ó¦Ơh‡µ̉e{ǯ¿₫ºmÛÛư­VR˜ ˆ:æf¶Ḉá}­´¿3jUÈᯩ‰µ&6«Mu3Ц1„+¬î}êLïX“±ƒé¦EÏ%Ïù¼ƠJèÂk²̣–¶Ö ®ñ5§ú¼kHk ÿiÚn¯·_~÷»Çăñ×_ÿ²f ¶^3K0Í"2âÔóùcàVÇ¡tá0Kû”ßd@óhiÚ ?a‹°S–cƠ€*̃7ï^ºʉ¾tUW0çbY=¨Äd®(K¡¼ÄZ¬·ˆÙ×a×^@nTh«2Yû ¬ØƠíáàGS‹ËZ4èà}i<F\÷³Zñ<4à9Ÿªz¬qdÛ6Ÿ3&Ûø‡@ơq„Œ)>NÛ#&’ç8®pgNRû¼q®¼tÉ_ófz&`¨Ê1%æ#ºæ>´ÿ&z[¶vÙ–l§ơC!¼‚ÓceÚ®°O £0Y¢@\ÛƒüÏŸïK‚QÖ–mÁZº5jTTZHe­[N\›@Æ>ß́́×Q‘é]¤đz:í̃_ Wî uu#æÂ&Qd’E€¢öño)©µªÖâwJ•G)¯˜%ơÿ?|d́Jlgâ¯(oª½ds\üƒƯúưŸ*å]Ôê%~Æ,„yÍ aƠÀ^ZrÁû%>Ăóu+ø@˜™o^æ­ú}£± ¯°h–°r°ÈCǪ•˜Ă·@c«@)Ú´UƉTtư—&ªML²`cÏơ¤ÆƠl¸Mœ­ñ̃N`1îÚ˜}Œă9¸#NÉŒMJÚ¸yBI qó›É»zƯÀöị̂̀y{…èÉoÑ• ue†‹ÈĂS¡})̉ÆpƠZ3üaüñD2̉Kü"w] ”‘÷^?½V¿®ÿ‘L«ƯZKÈ•!Ÿ?ö”́̀ưŸWy‘Ơ\hø¯fËĐé@’ ¼4ol///ˆPs:hóÍ_cåËR®· ¬FI> ]ËsU<)'©*aóV€½ƒXF,q2‰ÔÉQu—„ c5w±'K6½[o£´Fc+¼ƒ0^ÖѸ_/×t-ƒ ¨ë7À¼̣ëB‹3¢Íă¡Ø×ä×ME„à€_Ea 3Sm̉zc̀1Ñ0àÙ6a$ææHá)‰¸z朓½]2.̉…aa=ém‹ûÍÔ¹0Đ M:1çxÎY]·-<₫¯¥ÛRÔ~ß$@î-sƯz†ñ–€¾°^_ ï4°{ÖôC±W…ÀÔ-bb‘÷ƠÙSøÊ]é¦:Á=pÊ›Û7µÅĐ‹}l h½Y"éK úÈ\&LA•¡³5m‡ÚôÓ§OÏăùưí»,9µ¨úȬg$N~>¨@ 4Ơ?goÄi¤ˆ;ư–.]²8 À¹óhÆS8±&f†.óÀ’Ü’«—ùÛ»J¨ªO_N¨äT)•k÷íĐơ¸>[r»%̣^§ixA„Ú È»đư Æb´úºâ®ôj@k©8ªÓ‹¹?ôD"d"X‹ )`Q(ø€₫̃Gñ¢p> SPV¸-¢u?"-ÿZ‘̉ñ:Đ̃‰i¾¸5‹°rÓ„…>¤©få´ÁƠeËođ”9ÓărµÎ×åPcœÁ†JÍ+åḅG4ă0AÄÓiËÖ3•æéqú|ƒí½®ânúú‡iƠ,ĂR, &ÁPøXQ‚!́·Ö€ñ́ˆ₫Áø20±×¯KḶ6̃¼`­Ÿ®yltøW ‡J4Æyç÷iôY÷d|ơ¼ÓÄ‹\DöñwêbR̉p¬#ÑFÜŸ& Pâ_”?àhÇK«^1¤0O/gñ]óƒNßè @àCÓ6 ŒdBsƯ„Óÿḳ¦m}ÛÛ¾oûËö’¸s“Ÿ½ï}ë¸rÉ>Ôèó…ö‚¬ŸÓˆ½mZ̀‹iÑ%̀@Ë÷^•ÛY!a ¥åư$rK‘s4|zvƯ{ oeúP—˜µÁ7¥éQs‘Äfü¤ú(Ä:!1̃¨êo'5@Â15¼‰îŸv̀Ô—p¥ùûùÆ_¾|ɺÜû@}₫œ2Ô,̃ÖvpŸÇ,̃Gîó.$#ɘcûéĂO)ïĂ4Vâr…æ˜%N]2± ÷dÑ Ç$w¿¦¬bÅÑ"§&§æÍUBirÔtØ__“ËSJP["YØÍ˜‹ÀÿF3Àl}…Éư<àƒ {u·Ô½˜'Æ*t6E “‰’‰´˜Ezv]¨u^hi.®&`eø˜åơ׿ưwæ₫¸Ă™æ§èèßtTÅ U) a5e… ©ˆ%äé8T´·¥2x&視­¥ 9ñĐÑ­£?؇n®É$j­Ơ¶́…`»duí§Ôö"/±h._6›o0{›l‚₫*E î¤T€{̀¨û<Ÿ+€)[Áy>~´mm#îñT>Êv8Ù=R‡₫ü{µ%›lÛæäúôHçén…×1“Ü;ÉhNè¬Y7mÚơÿôß¾›c®±°h‘-©*̀‹|ÆöĐÈ„hè ¼Á¯Stơè#—TOzz¹¨7–xo>s‚ÔÊû¹@¨–Êh₫6ºđ›Û’Md¦ ÷íÖưÇ›KSP¹JPhÆ‚/WøđGơ üÄ<)Z9Ó13Èg¼€pVª\đIªR&ëŒZ3âậåz )^D­ƒå+ư_å=zú-¥o¿xùçA×oj6íôÇ ‚SÏ9PM˜Çs=yư¼Ôv´eë‡/ˆ‘0†ÇÆL©·~Ûn/Û‹ÿ1Ü—Ÿ ưă#Ù̃Ë„‡‘­É́™±ư OȈq’± -1}ƠJèŸÚ9>R₫½c(X=+«’*q>”ÖN2bWª SđûwBơíe]á)̣›ưX·ơx<́a­7UµeÇqp²2ÀB>©AXvÚdÉ1æ²'Ø(!¨nv©ÊXáàơE€„îL̃kn¥37Í›ØöÓ‡Ÿ<%)̣cĂè̀ĪJ:u&+äËû¶lÍ9MÍQ]óđè A¿qV³† Û…3_ ̀ØzÙ¥L.³̃U'nuüpS¯Ü¹`£5(´á8ÎÆàiöéĂ;ˆ#––-·x3Ă+Å!»ÿKÔ”˜[W"Õ[dÀ¨"ùÙ`¾¡(ư÷¿üûç/ŸUơñö¹cmz%* cé3mXhøRSæư'hPj©CÁ¶EåA6ûmi ™•so1Ä÷ƒÏ…V”ÉÈîC£CîHbM“Ǹ=D6üûŬ٦]B ư;̃j¶lÚÊ’̃³‹Úß{‹>ø&Ôgû ë%¸7su8€´9Û}ziế­#PƠ›ÜTơ˜‡ˆ ̉Â;ÍÜüÖºK.%—Á`Mˆöx{ŒçóZ¿j–t°¹V[lbF\  2–,xѲ€ưR2ܼ31ưi6PHÖU—D'¶×²È¡…7ƠbªCE„YY¶ö¾×rŸ;7ÑÔéi€5fƯưOg‹j ]ĂI|Ö́Ø[qñ;C/ÎúâJăàIÂ–ß ç ·éÑ8‰ ’%gHVI«VNc¦Z£_~^Úùơ3ä‰HJ₫ÜWZÑüUxj>øY£k8Ï‚0 e2࿨€øË)ËÊgͽÓÏ4$’Ä»LØ&qJfäŒKYeá5ˆÈ¹ ̣RK^W7~Ó”09•ƒHmùhÅ é .W ùt,ü₫ 2°£1Xr̃S{vöïD,L'èqÔ;aj¸Zk'÷‹‘yq̣¦íÏL±KV§.½?¦vŒç±ÆX£JÿѲ/*Ô¥PØ·Đ¥ưCóăÊơêö£ư‚û˪<¥.ŸâTÿ[iÏ@aÎôKLzr8=́)%5)EùZ¸¯½·´gßƠ;“RƠ®ie¥E#”XEê=¯l'đWèzN[mëNL ^º†äœ SÚ2úZ²Ơµäq¯Ö́¨^’ƒï–Êrâoï!c‹î|ÍÚo`©ÛFĂ .×{CIđˆD7„Aà5JlÀßV›Own]ÜÆ­©Ï]b« êδI®¥UÊÖG®öˆ3]J¦Íû·ûs<á'#Mê |B  Tø°Ï5•±1Ó­hTpq‘®°å÷DÇ­ÛƒJÄ2,B́‹•ª}×™´lsơ?[—l+ơP đ$FOØÚDW7Bä¨]¨¨·ßĐù§™IV°P[µå3³°Öʘk‰‚5å+…ăáâ‹È74‡ă;›àI‡:ù|Fd-üô i³k| º7ôN²<Éøx ˆÉPÙ¹~º¥Èêô?Ë^ÿr†‰đY¦÷TmˆKª ̃å8äv8EÎ’iäILd#ù YLy‡éÑwˆĂî‰9J¢Ünø“8·Úư^óæktƯ,9Áuœ;̃gÍ{¹Z¬:h ư¢(O”¤‡¬ÓOëp̃ƯQé2f%…/ëÁE_Á=¸Œ5  $i½Æúóü›¨<çóË·/èư…ø6ql$U¸èGÂVgèÄÉ~Ot»´ÛV„Í•œ»¹$×€S ’C¾N÷ªùVªL". w,EÅÚ{¹Aˆ¾ ÷¹$™OF‘H °Œ>?Ç8(ư÷¶éy¸¶>(ÛđlzÏMæç-,¡Oƒ½6·÷q¿ÿ¾»/M¾d£ƒơ‡4œi¾‚ñ½ä́<đ¢t_F¿SâŸR~M!F&́—8k«håÄʯ7ª•S4+Đ¿o}ë[aDÂh²¢ÿw¢F)n¹Ă$7²ôǽÍ7©ÿ Àº>ÇyVBćmÛªIÍœÎ6.rÎdmÀßë<5ËD́:ˆ²3)ß+æ|øđaÅTçÛ¸¹đ+>yôÙ×ZhO^kMd…ÍŒœ/Mi­µ×—WüăyÇÅh&v>{Ë0§¥SÇYhK©SÆÁ2Ăœ|Û©À¤§Ñ!*QÄüD×Ö[ŸÓgÜ÷L›}v$[ÛÆ}tïoƠE?ÙŒ º†Óˆ³ŒœDJë¦ơ7¥*íđ Kơ(»%ÑåóTƯ‡gơ¶< sl}Ă¼ªº%¨”¥s ô¬§ ËEY?‘‚›/§£›6ùôË'y»¿}ưövL}ơisµÈÔ–¬Ö>_9m„÷<\ÙPØÆCFrÏÎwS}:r|^ßÈ)ˆSÓ \QÈ‹é'ÍCí_ÓḮÔ·ˆ¸KêLºf›"̣Ö̃zëăb‚¦í¬/›sùµăq°é&›nZW…”Ǘ˜Ç¸JBÑ¥»4̀››1(@L¦L3ă Yr€PôÂĂểq¦jQ•$=åï¬Ơ.¯|ëdP`(äsMŸ¿&‚:‘(̣+ßûC¬ŸØån^#F}Ä7ˆ†Çây99ùÊeù3¨hÅ‚A.zj5\Nâ“\“¡†?‹ät+²Ú[.ÆÄË ¨§e2¬‚ ^¥lºlơÖoûí¶ïÇk¬ËẠă½£.̃•½ư™p dô*y/$ü^=cJY'áœF§A8ÅÈ3 Ă &r¹–Ơs®Rrç›Uô‘=ÖP‰›é$0G}©‰`y¾̣ÿƠpc·m›k‰ơSDđ"sï·~»ơÛ¾ï8SRÁ¬Ÿ8^„´w}@« Ǭï̉‰₫Ió†$e³̣ÑTX§2‡ê218LˆlÛ24•:› ‰x¨ q矕ƒi}Î×<>ÿçgS;æ©äˆç~ê…â%ô~P|È‘^ñ§ÑgḰèµÍSŸê¨h­–°˜ˆJ¡HÏ¥¤}*)₫ñ1D…±¼æ÷hSÄ¢^¬Ünæ» Ç&̀lŸpúÇ8 øÇßÉÔåç<›ö \ö¦[ï}kÛ­ß C»m7ÿđÿ!.1x´ ¾Eu8ơư¬œjơµDX…Y6.ÂTaÑî )U7Uk)‰Í˜Q³3Ó`zHƒzo­ơ1ß̀d&¯HOŸÜă^rógäû­PĐ.FéŒYj¨Pï‘€₫Å-¯AEUEáô½Æ:ä¸Ô¸2÷°È3¢í[‚RweăÏñ¤Ú‡a<yF38$ÜRÙÖ±Zç>÷}Gàdÿ4ÇÑwY¡kŒ¿yw”™ªễ÷£-Œœyæ‰8åæ'Ürö¨qÍEç®Ä^Đ­-䙵Đ!Ñ̉Ê;†7Ûú}Rx`Ë-ókǘEw¯„¢̀bزAkfĂ²I?¿%èq°UKIÚ!Có@ HdŸƯMnbÖ’²[É×’Æ4h³yL—“]bz©2׿/ơ%æHYykJo"+j"®C¬đ———?₫áŸ~₫ù×_ûüù3L¦/‡–•F#¼ =ñsÖÄÎâ’W³údê¨Zü?Á́º6ϲyÔsï°äÂoBæ&ÑÆ-¥`á#DœwîÊøä̀VBªmû¾«é1Ôư(“¥¹xY&®/¯/MÛư~?± ́d ôç#T·Û̃wW'› –êÜ_æ¸Eü}IX‰äâ<”“_ÁÔỤ́HRï@n¸K§5€ïœq¯–7Úqˆ¨ụ̈»_^n/ß¿ÿöíóv†2¿isN›Pÿ;u=;V ^ñ“Ϊ¤™9˜¢$C¬gÄ¯Î¶ñØ"UÁĐNiR]Û„æZ¤;:½+}Ñú·¶m¿8äçÊ:˜Ä˜§é˜t‚₫eRr6NœAÿ©k%xØëñ20! ĐŸă½@ÿ³LŸƠñg˧ƠüÄ5ºs²Í€Ưó\¢DV‰¯$ñUrÿEđs‚û’*æuE„èúÄ«…±8‚Ù÷í“ÜSh{[1â*CM¡\uĂw‰đ/Ä¢œd³¸$½\¼ Ăo-÷f$ÿuoÖÈ€•œÇY“jûÑ5&«P3n¿¶ăxO”đ@lµ|x`ŸY c&Œb˶ïûZkëÛ́Ó?ÙçœÓå@3KăcÇ<À0 ˆÇ¯_sưöëo8_«6‹§̀›û“¨è\sér§<|' ܘ2![©)đXĂÅ”ú lmCV€µÊA₫ƒKs Áj£[G‹m×¾­íXl‚Đ60erÛ€ư6˜ `Ř‘M²§¢Đ¼~(sL?„b-9ê=7óYÈyc@^Bs‚Ú'¯f^+˜ÉS†1(^¹q)©eh¢ ß´Á4mƯox6j[( Ü< ƠùVlÚ˜h`GÉD–H…©|/ǼÈ1 9˾æNqÉL ¶¢y4êTnnï;$ "M MË=«ç@Ï<¤‘’!Tyz›sNrx(œ€FjѲŒKâÁ³ï»1· A›lÅĂJó8æ±<¦MŒ̃c‘!2Êbɤ¢9S5¬4ñxÖâDÎÈÅê@Đ1¨0”ù[D_ŸÀ@IŸúäQé ₫¾rĂâ)AkM»6ik†û$]Nÿi­Wü„tµ¿ßæo¬¼Ë¦«ư|)]ûüx•bÏ„ŸÖÔËHeyjúáåơOüÓïÿøû¾íoo÷çzHUiù»&êyË…YÏ"u¥°JÙ?ÛÄ'zŒÙ‹ÖX°F¸ó‡^ºù]̉YH²dÚX|°\ÏDú—SSJö‚M´8•‚'ưJ4Œ–úX,[8 9V©&E\äÇóh=ÍÂë™Üàêê¶ú7»Z€œ•Z(³)ë™ÑéÚ¢±Ab¤æÙ/¨¦IƠ¨&µÈ©gNZ$7û¾¿¼¼<'½=(¯|°{Ơƒ´üY•-1ÍùRz•“ÿ#äơ(Pç…pz!q–œe¨‰ÏÅ !ùÅ6Ö¾k;·CSy- …à},á1¢ºÊ{8̃Á+¹—̃å­ ÜOÍ{ü2,yàưYXÅR\U÷¶SóÑ?]>!c;á₫̉Ư¿,«ËEˆø!÷–£SŸ¸ó GĐ$b‹¶₫Q¤cèû½O4V Ç:ǽR₫₫ʽÁȨơ¦¢èmóh°Öœđ̉Îi#Ë8ÙÇônÁ“”D©²ó2TË_´9áEÁ¼O"ÓóH–]̀ÜÖc̀ál‰®;Ja £ÆO¼³VV²éâØhµ‡áËiơ÷Ä0+;Á5¤{H19›ĂÈÆû¶k ÍÙ3ÿÓfµÙàºÖ‚4hiơd¹½‰‰‰­¶jŒ[ñIđ Á¸¼/è3-&äÁ_Ïˬ~®…܉ºsÿd…cRÇ$C›È…æœÇqœ̣ÑÀb²íÛ~ÿ‡ăy|ÿöư₫¼ŸJ1Äûü[kí₫ư?µ°DRKôï7M=ä^R)·!»æOGơ,`¹ƒ̃v*ºv¨ÇF™x­©e ‡…†!4hV§ q <)‡àŒÉK-ó9wJ…Ø 3Ưü¹hgmjk.ÙÂsq‘FûxegEÑh±Ù&½è­³„Œcll6ˆ¸G b¸W)9@ Å)̃̉×KkæcYÂ’Ô0đEØ„à­D%DJäđ®Ñ ½Pºî˜—;.ô­UE幘ƄÙ™!¾Ï£¹P[Œà•æ9èØ¶ÜMÈŸ‚&ÈÆZơF®‡óÈ Uí)hmd·˜«ËB<í,½­EU(kÎăyHY‡Üơ6N í)%ëoé G3+¾©¼Ÿ°EZ‚ˆ“æd TĐ¿¿vs™WQJi%̃—å™WIîzü§Kw:§C†,pƠ°QưÇ€lüPñ"?<ŸÏÖù¿o®ïĐ}Û_n/·íÖ¥ûDđb@œ90ë`¥Ø˜ €¤CÑ „q¤§Ö4â,mˆ™5Ẹ́5S ¯gG´«ñÚ¸&—­ûư."Ïç3e¡ˆh&ú`YXÔG¸ŸA`‰çÍ9$º̣øIÙ?₫ôáåu­ơöưM¤°n SqØ̣è—sKÉE{íoÜûsD°²Pi—́Uí}ë¹$’Dÿù$>`¥è†EôOŸXư ÷—î:Ẹ́^\>Yvă°9íÈ?oư;ÿ½ï¨lÛÆ\ùR!ë¢àÇûY‹äŸ¾‹, [Ă,9kªK«§¤M[öFççµyº ßeqƒ™ßv»Ư¶¾ƠÛ¸¶0%îd¬àñíן¤`b[¢đàö—̉`Wh}£µc…YÓe3ji“35+ÜeP€DºËL|HLƒI7“Œ±?5å[~GAåe”‡²µ÷|#mà³N[ëÖW_»̀mBùsL×íÇîAÄ2¡éå?`âT’„W"G·DÔ…€ÉaÓ’,%†ï ˆ̀wñS ¯oÔµïÛ₫̉^t)%¾̉÷!æ̉l4 )ɉÖ„aê-Û…sz€z)`¶yZ—+ €43YÀ;¥JhH¯§"QE 5#2_5œk"ØÖæĂÔ˜»›§́?~Üo·ûưíñ·‡ C nûí¿ü—ÿr¿ßÿ<ÿ|̃åƯÇZë?ÿó?Eä~¿3Åw…®cøX pƯ{æ@5ù{å,¯ë̃̀0gÊí±Z¨M‚Aœk&ÍoîëÊưÚvÖ̉zÿtD•̉¹ = °óïÄ’Kh–€́{k~81 £ª¨+‚‚ضđÉ¢™…[èå£@PİĐIŒó2ÈvˆÅ¹ăduZ]KÅlk‰Ẹ̀×´ƒ\—ôœ)ÊH3ŸÏgúF¼Û®è_LtS›¦"Ÿˆxµ¦ [!­œ–Ù3p̣°đZÎ^».?4f|#ÀïMÚíå6PB¯•±w–?ḥÁƯ*y {~Î4áîù¿₫úë÷ûÛqŒ‰ạ̈[$t«—k &˸a’*Ơ•`‡Ñ«èd@Aæ¾2aµøÔ‡¨ª×Îo¯ư¶3¾/¥–‚¨å]Åœÿy%±L]=H–×dÉê[‘Çăñ<`æ(Ô$ưoÁ¦]¨1>ø Ên–¦Û¶½́/˜¨êg)øŸV)„ÿi!ç•hÔ}$ú‘$†å 'GJ ÷Søz*•„Ï¢€éˆ96–­¯ß¾̃ïwÁz{Éwæ₫2(”?̉ªa#{ĂlÑ—+‰Æ::÷œ ä`ỮÿËï~ùôËưí₫¸?HLỒáèµôQÙXoù.ÈÊKŒæ‰ô¬VSINà:B ñö̃´„êP|‚_Ể4áµCÿø;'%¯È–ÿ5énñ1«_aOÓ$pÿ0œ…ó,”?Ù̀ ÊzˆƠªE§/µ₫teRd¥M)å÷)]aÓTŸ aå è•¿–fËZábI4¾óv»}xư€‰ÅsL2G~¾Ï‰UÇ̀ơPĂ~Êb^grR%ø0Â÷#^ÂQŒơ…÷ËUíÂOb9LJBîˆ ̀x‚gR­!oSY¶óù<®5âè·²ÔYK,‡ŒKK\D âcˆ‚tö¤WdÇà3ªÜZ[ky5`­¹Í}:×óï‘7¶`¯KK$ưC("â`+[Ç0Ûey`QYºĐnËY?îcˆÿ™Ë =3Ă­ d€»ó¡xÙ_æœÏûsÍƠµïcdžUVÚE}JB;è„ĐJ]¤5ˆ•}ơ>ûhc®‰IĂ'ĂĐâả[‡Ü™¯é™@)=b¶pnNÎvT%¡ªô¼• /Úơb4¤A«Ö £źÏmÛ~÷ûßưî÷¿ÿüÛoưË_•´eS©jëmÛ÷Ÿ¶¾ßv‚é\âKTôóçÏơ´jÅK©X‹Ùu-ŸZ¦”‡käé[r5£7!à’uØá»{Ø;7å-5?/ưtFÓHÊæk±̃éÒNƒ“]Œ„[BmbQ£Î6©˜ÜÚ¶úêÚWϬˆZ ¡T¬¸5|l»v+ƒ:< ¨êR¸x¹̉À”² _̃ÍU¦7¦YsP–ØK’yµXQ«öØz•ña₫jK “å*%?JÀäOGé´4k ß_†\₫,+_Ü¿_W¹M×(å  ÛÊËâf2º»._ »8Çü|úĂ₫đ|>¿|ụ̀|>3©¨™|LZUsFæ^OkX[̣àÇ;e¥â₫¸ÿù?B)@ÿ\%KÚ·i©UíÁZ®®¢sl]‹±»5R¡rXØÍ7^‹¿ivTŸ*鯕s¹Âü›`NS¸ê‡yĂëO?ÿ4lüöư·cºi:ÑjíÎb«q-.ơâë½ơ—íåeÙû̃¤Ù2œ₫”Ù0Údyđ‚₫kKC­”F¯–%¾íÂRøË qN·®Ô„½JÄ­²³b¥$ᨀ ¢aîe¦‚ÎưG9·q…e E䤳Oô‘₫[ØrhñëCc̃§O¿üñüU­¬J>z;-$áÔlæñ`@q`ISäC¯Éä§ÑûÛ7·gY«J’ˆ‘ø vË!b^röKŒ“ÜŸ9KR„û̃æ{¾™tIô¯#~} 1ƠJ¢VÄâ”̣sø]•ưú×P€\ >Hµ?{o;¨¨­oÔM´0S9‘ưlà½*M1hÛu<ĂÂTˆ¬0„´ö÷̃÷m‡̉u9Á“ÔbVqî¯èm­0T©”Ö2>ƒI~sÑúắÀ=¼$œ—À[ß2̃̃frveD Y€äDhVK›2•ÖÚ\óñ|<Ç3Û²)Đ*-ŒlX Z!M™–Æ@­íû÷ïÚtë[뮄Ëy *[ßœ•́}[Ûœsô±ï;ƠAÇđ!T  [1G̀¢Q'„̉˜É|&̉*§—–°¡]aA¸ÚB”@3Ú› ܇đĂJ)®¥ˆü0½«ˆ<Ç«·̃‡Ï÷RZÛđIkmï;Ráê&95^º¼¹s¬Á|Àû†­Ï9—æ̃(äăxÆ#ƒÚ¸ÿ¤i…J\y§:—–‚ô–yÖ è¿̀Ûơºuä!³y>ĐbÀá\óÛ÷oûm<́ ÅË%ùdöööößÿûÿ{­ơåë¼̣ålÉ₫zÚrỤ̀–ÊÖƯsF.ª–,²¾¡F\ne¬•Æ>̃(«]º#­æß°b4½«Ô í¶Ôv0e%Á¦¡ë•¹“§¬ç"?aG¾ÏÅ»±‘†­¶µ­››` %¸DyŒPàYÈè™J /Ñ&­KG”Ütă”VDù9'›Èah3e†ÅTYxê2Yæ92º¬XWÀëñ7ƒ±UtÈđ­̃̃s‚§\ƠQ¼‚úÖí/PÊ\₫FrÔ@`h™đà‹›l®àđ’2j‡c¬”‚¾ˆw}°=+͇W„¦µöÓÇŸ^^^î÷ûóùŒË)U)ÂMKøn{™l¥gm¨¥r’Ưgl®ä•\ùÔ¢₫wŸœ¢˜O J.Ö\(EI§’  Á—™ÇÊïÉS¶R×epŸ¾X¥/µÂÆÈ°N9̀\³ơ¶¿́[Û́/6—óÓ.Z³Âå₫ùŸ§Ä5†$uíÛ̃[×åC €NX‡âẠ̀OC3%j̣…Đ®úte¡ÀJÑu%̀è¥ù˜4Ư<ßs‚ª¨© …kœÆhHÿE«Đÿ+æ̃Ä8!Nè#ăx%æ °wS£ÍIU‰₫!VQÑ5+ỸTư₫ư{ưúí+̉´Ê:Ơ§Ÿ à)–O*æă™*ÿŸ»ÖÀL¦m’™B}nÛÖµCh¨¶˜~6e©0qÈ3 øqP´ú}®§›)­ƒNâ^ưñœkA½S“!úï­³…È[Âd™Ơ<̣ú¸4rEÙçt¼çê-Œ;[Leæ'î¥Î"@™ƒFªÂuÅ¢bb^§³“êe™̃;jn ³Ô'ă×\÷·» ×vNʺj<̀ˆŒ˜”]'_¤́n~SˆÇ²–X ûKzIèOˆ À¹—X)-=¢©º!û© ¥ÜÈ‘ó¯pøK˜íæÍ$—çÅ0E:É1LË@ħSsYN¯CơFE·ù뿼·×Û~ÛûN«˜”t©ËèV[èÚF]iîh#Ç8Đ‘pŒă8èˆéë3'd4%₫•È̉!3`|q]PxG:µ”ÎngPSŒ5¦Nd4®iƒƯá²ûq÷]1´û^Æ ¬x©9w]ñ~å¡ñÚÚæcƒ–B”Z 5©‘̀¹´+Lñ˜Æ5if¶µßJÄæ©¤}6 VƯyñ1›±˜q®”{¢ëmMÛ4w úÿü¯_¿"µkïüÔQ·zÏ¿ưú·¹æ8èÿJ̉ä¼.|)â47OCô¦'‘·§ïë,0 ”àâXM;ăNoZå6̉Z¶¦NnTœ§Â ÏKMđk̃oäBm”,R²MuæAÉï ¢³†t5Ÿ…îz>…xMƯàK½5‰­Ê¨Ë‡…"È‘}ôdFº|¥ÈW•¶œv:ù»Zqë˪EMYƠ…%-ÆK9Ëó¸C´rc̀9¸̣3çäËJP¥öN”ßœ;½|`Is¶¼ÛÄd ¾ê$ôå'æ™s^Y,]n’ăV9«Ø&›®@ÿÑ*¾ÑiÑÇ)2_0aëÊZù‘Ư^Áä†,&½Ô^ÊH8*zñ@F8×ưq·f©r¶‘Îÿ~¨h×–ß­m˜m)̃]¶Æ ”À%ø~Y *"TÊaæW`ñ˜₫^À -`ăüçs É ̣6—}‡.s~1e`e,ªî©ƠŒă_LD@]e»i—¿ùIûå§_>}ú4‰peß6¿}ưú¸ßçÁ5à÷đbÑÙïi9…ƃo3O«Kº§t₫v““€}#…‘YA±ªD,̣Èư{×ï1Jk$ôŸÏj—4VX́Ç@_G¢¡B$ñOöƯIÉŒ½!uá"±bî™"]LN8É”W¢OĂ9xé™rhª!RQü=ă:uD0®ª+jj¤Íê°ñuój",û)εNFÓú¸ê.Nô1Ws(º„ßw$Jxd´±P°—ƒà²–Ÿ³­ŸÈ-qc@~bѶ”©ÚZƯ•’CjäL`SĐTeư³ #EÓÓ~xåNÉÚ₫û₫÷·?¿₫üáöÁÓ€m¿m77[Ư:7’¥›D¯đ¶ÆûÜ}føqûá₫¡óđí1 Ă¹kvÉÇ0@;”– F·B]ƒ@7Û¤^ăKÁǧ[?¬N2faȵ…•w­¦L¶¶mºA~‡Áµ_V‚RÅØdĂ\Q¼\,u‡ ol°À¯æpÀ÷v“M"§Î2Y!eçO³a¢¿Úâö°0›{ß7†‰f."7‡Œm5đÍùë_˜í°Q.ơ‡)ooo«Úö‰79đz4È•H”Öc+蟟c]Á1Àß… ¸ØÑ¹ó Œ½•°̀  ‘Øë2p­º\®₫¾gF+CS%~ ơå&‰-"(́…́g̀ᯣB0ál4Ej±(x®¿́ºn̓)2@l¿eëë—/szmÚÎ-(¾̉´,µº6.Zmî‹HDnû­ơöx<æcf²ÄbM¢Ë×ƠY]&ÉC«hq̀D&ÔË ú€q1pªMZzÅ"i# Oơ[Ø©×[̣̃Jvÿ )‰•K—¡ézLÊơ¼·ªü‘«Kú\ó×Ï¿.]đÅc»*›ë½¾~”'…çÈ µ[ÛºtO>MñO‰¥]"@®m ́,Ơ5óÙs’Óñư9ؘ$ˆ,î‘JI~WŒöe¼DgÎa8½5öÿ”¾)&Uÿăă¢åBíÙdÜ›¶/n/·yLô×r%uÿ?ÿüéÿá÷ÇÛ÷7Xtđñ³^1 À…œËFNœ7Ĭ.§÷Å[À5üÖ5UÖA₫· ) ’g¾²Ó8,Èx®›/H&>ߣ¾BñO7*Ú*ø;Œ¸Å44Ân€T&DÆ S›P½üZ8B˜w’ؼ:±nºmº¡úÁßË) N0µ ₫ßaÍÄ ÁÄÉűP€’‰G.})¤S\Ñ蟖A<÷p#$Ô>5¬Z뱆°Ó—´–©ơJ¡đwA½§|”¥›ú«+²µ°@8ü„iŸSºúD¡†Ç ×¹nÅ©Ù/ ×æÆ‰ |¿¤>…P˜N›Û¿ÿöïªzÛoo?½~úƯÇßưộÓëíÖK¨—a‡ÔTU3ë½;“4çm¿Í9ѯÀ̃¶Æ£‹wh#“9úiˆ·£»—Ö{™à®Ơ[÷xƯ-Î_¢ÙT—sfæ¼Oœuo,ùAR¥l¸i®u« ÀÖ·mx î.W-ׄ#/s?h–µ6›¢€gœ-₫ÅÖñwÿMờa7Ÿ@sI¥C~mÙT®l‘Đ²“Ÿ.ÓRÉæ¦ówp4|;>“ßí¤¸‡+ZåÜÁÙ|¶ ú5%.ƠNÆŸ\%Gº|¼¯Ô?< ñóyÜç|>ÆÛXíï¹f¸bT®ÎW…Đÿ¦ïä{t[„ªËụ̈ O+œ5“8æ,$¼irÁº¹² `™¿¡jñ¯h)r³»ùơöª!‘óz₫r.™ÂNƯ¶íOÿđ§ú§º¿Ưÿ·ÿÇÿ¦e\.?Ç`Ú}¿©è¾ïó˜D‡₫Ë‹Ù4Ÿë“«\4‰­<,_ÁOœ¦§'+BôïÔ(Ça|€û¡8ÇKái„T8ă™đ4Gh1àp_ˆ₫Ÿó龟¡ø§ªÊë*Ñ<̉â‰e—F˜Ù=5ñhùÅ™˜A8%‡à‡>•ä4DY6 8ÇáM üR6ûRƯÂÇ“ ¿Û ˆ®đÚ÷ƒ£)ëE)Ji®ÈÊ-ÿ#h!U:¨Ù8K'zÙNxIRƹí[k̓ö*W~ÁErö«g=o]•3­á¢Pä0̀²@wṇLó¥Â»Ó¹_T$ỷ+Mv>́øDÁnÛËíÅ̀`~í­Œ­‰ÉZ‹é¨“#*Ûç¶Û~{<ßîß₫öơo/·—Ÿn?ưôúÓO/?}¸}Ø÷m1È{P6’@VÚ ø¢˜Ün·ÇăqµOjûkPÂË.A àÔ?M¢¢›·&{&%KŒÀÓ¦n~_]z†¶̃¹7àẈ̉TDóAiЦ{÷}Ï&«P˜ơ ‹nº–{Á püơĂë¶os̀···ûăŸMCY1hôEe³ ™Ù^%æ‹2é˪VÅÊé KĂMÍŸ£v…Ûn;ïó*` ee Dü©®WUu*0.Ô76M¦0;\5s̃úË₫â>³U\&˜eMàBET€E•ˆ—5Êăöä°%JđÚ‘ùQ y¾°óU  Ï–-›Îz¶,&Ṭ;!Bmeó^ Ơ5W k ‚Q aĐ³Á:i*́-Ís9½h  €uyï€víÈ…²:^¢ê)H.cfhM5iŒeií|'ï$ ơ% ªªѲ¢ @U‡y%uÛ+!—ĂT‚Å»§âƯ8†:Ût¥ÊRdƠ 9ËP¬DŸwƠ‰e|u§²(7°˜©ơ²jh-‘>$¯褂ÂÓ±W{""ƒŸlD3ƒS}kb+‹́d!Î₫€ „î?8Öè­§C+*-Á cƠå\̃8QA|ͤàđü;2Ÿë‹ơñ¿ ú©Vwú•3ªy  à"?à 'á`eô¡ªnº%÷¯Ư×|ñ´¡â™èßÑd·5É!>Ëơf‘Q¶€» Alˆ`TƒN®ŸSY Đ¼:ç̉¡è‹Jƒq0Ï7ª‚’tÀeªGVLµÚ́àMÉî^¥(<4Çß¾|ư—Ç1ç\#FOz•ïEĂi‘±å²A(N[+¡V ÔY°­ •¤µ”Đmß¶îă[μÜ^EÏ1]‘Q¸jÀ̀Ø&Qæ|aƠ=‡“Ïè“‚ỀĐË@:Uí’‚₫œ"œ¼₫¦fbK¬†©#¸NÅypœXNvéºo¶µ}Đ8lƯ‹Ù§Áz₫à‰ M`&^©å¾RB«ŸRZñÊ$ó˾&†‰¸́4³Äơ50jˆàñ?¤@¯_?₫ô±ơ¦oúöxĂ’¾¼~̉%!›äùUÉ/AÖh³yVÛ Bßï¨.Oă–Ån/·ü§c|ùúå·ß~sœídIxñÎÔÄúØúv»Ưnûíùx™,©ă´«¯ï¦Ưºˆ´̃¶o÷oªºle÷¶oÛöz{ưxûˆ¿?Ü>|¸}€̣ívătŒ”Áºµ·Ö¨lkSÑ9çØÂ·¤œ”Q3n~±¬ơä©©YD†4K|[[F¨TÙ́Ú§ÎfîTåC|‹OEÑiQC->† ÎñŒ<4yÙ(ܳE&û%4…•®€ÙtĂÉIÜÆÙ'ª%YÁÇ,[r{bf¶é†CƠyÁ`Íi†̉!]¼”œ‚dÍ…ú¶̉2˰"́sáP(“›©Ø:):>¾<öc[…—)X UïB£=å)F«°™L»»Ư».jLß9Qª}?àå”®\+ ¢i3:A'ÖB|6$²S©G&#œ;oÚlŃí̀âvué€ËKÖ´¹µ %´4kï@J_’Uơ on+ a‹ó¹ |Åà^÷ ®—”†ÏlÑê9@Íß ¹‘ÛËMDîÏè—5ñ²Àr?â0»hĩéæWLsô/ o"¨đ ̃µç¦j:×láçq‚˜z₫û¬Ná猩®ÖÚ¦Û°±t‰¾Ù/ORü-́Ñ4EăLƒ¹ëKñ}>ŸÚZØL¹S‹“/f"€úà'[ñơ²[O½¿+5ÑxÁ^\Z¸™.H³†V" ï,îAhóy‘Ç-³ ÈX9©ïQ9wfYb•<«9Å? ]ạ̊QTsY|(‚«₫=P—€¿7´áO‰ˆ[cƠÁ½Ñr“4VŒÂÈ Dônj”(wHI!Œ¯úîM5kN:œk>|w§mEatĐÙ]±øÜW™fœÏ6µØÇăøüëç1ÆÖ=@đñ#QTEÇkú́¼¬P•7î׸¯̃áQhV?©«”÷Ü 7]˜ö8„-â…¼=ªÛ¶Ưn·×××Û~SÓ1½Ô|+1+[ º¢»1zUü§÷ûFj® ×öJđIô/ebÙRùS¡›_Dz)>Í—·Å' đ’Jï/o—†gQêûË ¯cÅ"ưoÉNDÈÈ₫æîÜ ™³•øY5èŒE-ÊÉÄ Œf'MÍϲsÄŒf8 €°¨Ù·=ÔÔ¢XE™̀¥â ¿e_OC‰œ|ÁÊà]Œ‡ª×,æÆ.c½÷?ư´æc|ùüÅ/£…DK!CkÙË»ơmÛ7…¥M“æ“+ÄÙ$®,“(·Ûmûöø¦ª[Ûöm÷…̉ûÛóíkÿºơíeùéå§/||ù#ª}ÛûV3ëi©í¶Ưf›[ßÖZ˜$@s\ QcÍsÈ–?fN®g 3•¸0=\¶¶µ-[£ &X̃FƯâĐÙ­ă?/9€çè6¦Î$уcK8µ¢¶'’äK>L ¥Bƒ¹ ¨ûc8¯¬>µ€»e,®ßPä6c¥;îå@Yü^ÉÙƒªnÊÍ…4¹ƒL²ØfhKG6éC̀ȵÄ21C*è̉ù¦ÄßZ„+NxXÇBdt–p\J¤n†’/[¢e ïØ›@PgQ‘)&Ë;ôÏOøÊiDSÁAƠ$˜7in1) •s}ALD@9R@ó4ªpADdÉĐá° đ%@´ƒ±$„ËÖf›Ï¥ỚĐ0Ư˳D•çưùëøỜ °©5^hq%MzGkTåḍ1ñN₫³j<úîá:WpŸ µÂ}Ü¢ÖÚg —×ÛëËíeÛ6Nñ{ë¡€ŒèM?1•§æ#~eú{O'gú†4 Ë̃;ÔÿéÖ1=ås‘ÑHïZK„æj$á$n<Đ=,5ôR$D)R,ø\HsOjÑa•\ZÅ̀¾ß¿›Ú>öçă‰GĂƸ. °L!¥•6(Wªü€Ù Ơª‚5UöcEµUÖçă‰s‹E£ËVtụ́m›§Ü·ưfbO{"‡g6‚¨H_ü"÷,* ç¶ß¶/÷/.· ††SH ïÛưÛư[ïư¶Ư>¾|üùåçŸ_¦4è¶ßØ-Đ*ëVk­Í¶e™øÉbÜQœLaÓ)ÂSO¶¤Áù™`t&}²T—ê æU˜¹&vé¶¶cm¶!4á…~À$VúĂz뛺.hï;† `/1#bŒÆ¢Gd9ÇóñD¸ơ -•'( ¥àek³ ‹Ά*êăÏHO2 Ư2W¡DMô“%£!©D¤ăÁ_a¤Œî¼tÀñ,°™·×­µvÇÛÛÓw“¤Ê<²X£ ƒŒ%̉‡KoˆÈK!ñ?ÆáWÑLTN›Êlo»E«qda’FßÈ ßOçäB)äï1:PjQ•Ô—?ÙxñV!%=äp¬¬é’_æPˆB×¢¹cÊJn¨ºR&{­`†’ALĐáßül#µ€QD mää×ư¦/Wơ›d6Ù.·{Û6m «Y(ͺu‹–\£mbĂ8HúYÎI”P°gUùTTŸ*E‘ ¼§í}™3"•ÅŒÜ TzÖ̉qêö>a¸8éÙ C*.3̀²ăê&}ÏtÎc>*äå5sØ\Ñ\Ú±‰³8î—"Urù¬é?(¢C½₫8˜~–4ùA!Å£< ß½/ -¾£>7²WèŸçhˆöÛ¾íÛ°1̃ÆeΧS5;V çe¸³dĂhu|:KªÄŸÄưdÆÀ«c÷;qPë9k¼:Ä5˜Ôí¥0đL¢ÀèÏB©…gªÜ¯å–-HÀ·môL»̀2¸%θ’6Ơi“%"D2-“_=ñƯö­·~GI¸$x “pÍfv¹ ¹;ʙś࿺É™S Đ£Ömßö———×××mßà7ÿt÷VS3s£ó9ạ́9×tÖĂÆs<ñŸ˜?íOg-¤Jr)†ksáMߨÈA‰yVb{J“̃»‰Ư÷c§AÂç~g‡¥r¡yC#¹ÿ\äe…ă£ùåGOê¶èU¸s®9Ǭ[˜‡̃ªẓ¥'¸|B‘o¤l‹6‹5¢¶pÜgÆ(ïrËỳÇñàN仩YîÓíú¤®Zß²D|¨¹w1±₫©ÏêæIöÁOBËc¡jß³ªâ@_kưí׿%îWAï„·…·Ô†5oÿ¯”ÄV& Æ8Ă»Tq?ÎöSƒJ$R‡ íœî¡ÎñÅĂk¨dŒEăJ¿`îơK`áXIơ£0g-ϜŖ ?ö£‡ë‚ôpU///chMé­o/[kíơöL srÇ1q bûxäÏùdÜЦ›$g‹P„[ïù|nßïMƯ×€¹wí4„j­mGßû¶÷ư¶Ư^¶—×Û«ë‚n_o¯¯·×ßú=Đ8RaŸxÄ…Ơgq~Æø@̉(œ{r…bÁµx›`ñÚ.e” ơ€%¥V°æÖ7ÔyíđL@QïÏ®1:Úl:ûGv+´ºƠÓ˜»v £ËôÄ́Á¢¤«Íàùµ̀̀PNÁ2µÍ ;‘f§–đ‹Z‘Ư'Ô–3ßugE]-®ñ¥J²_I_™¼¼¼üüóÏô‰ç¦eŸ¯r !Ư emË! ½ué.BtÇÚ¥ FW¨"ÖD?Û™&EpΆđ×ßN+?Îo!N Ë<¯>! zO'ÚYQ#"&x(¾Ñ4·}‚đ¥¡‡²¿ƠÑÈó–2đæ3Ưº4·øôú:¶Ü« ö9²‹”iO=çøS̃V%© oÍo;-¨ïÛÄ‘Æs½̉$ỗE;»HnakÆq™[â×.ÏÄLÇ©IC‘– Sc;ÄZ^781¸g1ĐgæHê   …›$VùvˆjL—2¼Ùă Ớ;gëJÆ_k‘êđ£ÂĐW‡r­…º ‚s=ḥßI0¯sœ\WÖ#'0¨ ÍÙis9·"AỸ;¤Ùê`l"̉;Ó~ïOh_ö‘0$N›ë±äø-¢”¿ÔµÖléÂW~pü_>ÎO§j~jÀú E›4xÂ@×+,­ I,{‰9çª wï!î@*ƒ ‘Qó+ £̃ë̃T­Ç ¹®§È r.[pêƒ5ŸÖA·â(]¿å pTñ€?A[:£#鱃ÀĐơ-‘ d ïØ¡^«1Àị̂q@|»Ư \'¦Updàˆô9îÀ™Ùóù\Ăß/ă!.·…àiÀ1‹́g˜·¸«c̀ù»«wl ¡”kcV†¼/ï %&–%&̃HÉf_L,éÑV$̃÷ øqë·[¿ƠAÂ'\§9ôçs¤¼§‰‰9ÄdÛ7\ء™ưÏ9aׇ¯íǾ,Äñtó§̀#»¸Ưÿđ¹sC‘é'.ªçƯ…<=UêÅ!Üd äæ&ʯ=ÊÉv‘A?Ÿµ'a¬±fZy2{ä‡hwMêLÏL ƒ•í(Ë)̃Éó‚“JJxQ=•Gê64±cÛÛxs-ô­möØ·ƒƯ·}o»¢8P3HT"nÛíeùxûøñöñăËGƯô“~jÚ̃¾¿mÛæĂtÏM¨¨.]½ơÙg2÷hÖa ÚH ậª1|¬16a½to™±1`zǾYØÖ6×Ü×>ÖØûÎY}˜ß1Öx®ç_J+WKWMZ·̃´µ£eªí5´ : ̉‹¶k Ó\1¯È¢a÷ÜƠëÚ}è©eÓ=—+¤F-Ơ‡DY µ̣‘‰J,ñkl9r™̉äxo÷·çó˜öªK/›Ù£vxkôÖûê0Úé­¯¾ºu'¹ƒñB"«r¶% ¥éé‰N’Ñ8¨(¼kPÅܧU¤˜DCx¼/L«å̉÷`Wær‹…A²´×BEKªÄûx¨ó4¥3ÏP&”aóçÿó¿₫ù_-&{ĂºƠªºÛ}iÂÏqy©k´±µ Óˆ!èâúÄm;¹3·º3kZŸeÿ©®JÚ¬(zñO†Ô®ÑµZ ÆP^Áá̃V ñ±Ù4H1¸¸ÊVBXœÍɤ̣ÉÊ”bôAAK^¦6Í‹̣KV—Î é–JúxfÄÔœ†c€&4rÜE|Çá XËJF U°Y|b²æ:ă¶ß¨¡? OXÑDÑüŸ¼W¢1ï,©Í¾7hH‚́„ ñAÄœh ¯h·v¨ºœ '=ç…ăËkÂv^¨Ä?©K.k8â₫¶„₫?LœjPvu₫ÊùVÉÓÛÙ ×|¹L Ÿ÷ÖÙ.Ù,%ˆ̀Ä̃ºL6̣l0?äLxë²X_Ø‹¹xVF‘Dh.sï%߬œ AÆm w)f) `‚£Y²¤‹‰y@—5·03ê®5w(QóqltH”HUôÏ@±Â¯Â‹E%³¨ÀˆI`e¾2́¡ÔIÉX)W¡æ¶mûmï­?ŸÏ9f‚Ú¢dxÿ‘×1®i‡Í5ï÷» 9"qå€ëGëÚ…ÀÎbH¨˜HÊÔß%&~‘ưă₫¼~xưå—_Zoÿöoÿ†¥HÍDíÆ—Û¦aÓI÷̃Ả›™6=c͵¦'3ư—1¡Ơ¦$Ư—-™‚Æ*~Zr°ØwÔưƒû÷¿×ñ1ß×w(íª/‹Í1IïÛ¶Ư÷ƯÛ±æÄCôæ¢é€g­ejS|Í[q¾¢ s̀Töî¿m7ÿ¢¦wy6@¸éZÿ­»S~x:Kè‘ÖZH¼ñ˜$D†µîT+Zd=rG”jOMk=˜—@”̀#Í2¢ÿD.•…$ä ߉(2sËo+fGrôå&úèˆj­ó ½µm›Jäø³₫}ưå·¿ÜúMM?î?¾|üxûø²¿¼̃^«DÏÓÎÖ½¦‰Ü«ù¬¾µR#´m¡ç‚€¥g°”‚ß3<M¬¯Îu[ ?’6Zȹi¹æ̃w$/ó…Ơ(üuŒ9†¸¬ÆT—¾ơÛíæƠ5†Çz4ơ&½í(¤Đ8èrÆÔÆ B1‡wf]:i{?#Ơ•Öxœ8¿ñ²B:!ÆW9z.1g-³Xÿèç9‹¥1Ÿ{ îÀ¼*qĐ©Yx;ÿ·ÿéjMÿåß₫åŸÿùŸqØ äÑØbÄƠhc_{o}ÚÜÖ¶µm·í¼H…q1`ÖƯÇJ%i§B§qPUÅL€ÄIß»¨`2oŒFy€›l%h$o>Yæ̀Ájḷ̃€B ²LÑÍK‰Ÿ U|›tàijb~˜E³2{—-%B˜·Đ$˜QÑmß÷¾ơ±Æ×o_™ç¸^+Ô –AL«÷ô ¦’ `\ÙCLHÈåzÁ.¿ŸQ€ÀªÆ®U]ÑÊL¸üÓO?}úô©÷₫íû·/_¾x†¦^i¸!H°)°µ7ÛØ+oµWƠr^')ÂÖ îŒC¨c½zlËf>¬s6ư…\³&yTüÿ切ªч>ZÓ¦¾ áÎÙ¼—.Wkh)sY⼋7ù²…Ô¯Nc"»,Ÿï{^ÀƯ®Wl½LùưR‚ #6ûH·+F¤8+!áó3më@­lNGÿ«-çè誅,¢ÿÚ"ÉÊm:ÉđÁ…ê?<æ¹Ẹ̈#RVß§}Œ@©Í^đqªŸÏ„(k}û¾ßn7Qù>¾KiP9C₫sru!„¹¦L×]ez°,9Ë«I} ơ¡¼ÄÿYăa1b¯=́èÛË ̉C̣'/qsG”b; Zߺ«êm»™:ŒÁOkôô#†ễñ‚["ĂóhØe«xkJ“ă8îăñÏs<Dë9§¿Vj\a¹5€ÿí¶ß\·Zm£ĂQÜ®ÑE ñâ®Ñ bw;‡ø¶íÖo€”ưdïoß’ơÙOëqAûï–„†Ø”sÖv>e-15\o~W…]sª,]‚›,&3\₫8L ¥Éº7½f¬ï‘°Ov¿µlVù;¸ŸË .oôÍ$º̉kë·¯Fg-w™ ‰ l°̃÷ưăǪ:đq Üp¼¶†ÄÎÊŒ`6JüsóƠ`@–Çj QƯå@7yÉÚ7Ç6q7ñƠ³éF·ÚÖÚ6Ư2¶¦˜[ßăAŒûº¿̣ÏÇׯÛëëíơ¶ßĐûâ™@xK1 $ÅÉÀl3]}̃·˜ṢŔ‘®™scxl­5$ ›÷¶s“Ơ€t˜înâëIÿz>ÇóèGí®®„f&ƹc]{}kÛ­Ư¶í|äl¦³á,Ú¦+9ØÖ²[Ô–÷ˆkÇ›lÀ98₫SkDáfä‹Ó3d—a+§ưNPE 6:¥º¶PuÁá÷éçOÚơơo¯Y’Vu9ÁZ$ePªhÚœm.L—̃Ö´‰p”sđødW M²N¤‹$d! r¿ YH>Uu´q(.²X„ª¸Û. Âưi¦¡{N¦œ'`, $½[Û¤_[Û/́]#̣ü–p6°´'JĂrBÂçzÑ¡¶„©èOúåw¿<ç÷ïßñ#ˆPÈ Ù.mÅ ©­ü‘¤˜9L×ÙáD»ר{ăØ̉åk̉Úeú‡²dß÷Ÿ₫ùv»™Ú×/_9Ă;ÂK1œØ†ûHîR4đb°Ë’F̉w‚â¸sÿ-¼#̀r½i6«åE.f9\Ñ’PÁX$àĐä4*’w‰=å@MZ3×"bœÖd6=‡ «Àñ$§ă¶»Èø<Ú ²](ë~!³N¥Ó [®aÉ~®lè¼°à—œ`ÈeA–‰ÿt¡WK)-³ˆË¾–àáüh£¢•ZÍ×ꄟ̉{µX çÀaÏóƒ«tª̣p)ç ÷nÜ1_jk­ă8–­q ¾#®í“ô¿®Ï3Il¢²₫W• =µEVŸ_fVeĐu&œ„åÍ>ço¿ưÖ{cP™Y+Q|×d…ñ^€¼Oi-Ô´«‰Íá̀ Ç âxóy¼j̀F i, ƒiëå/Yçă~ÜƯèsÉ['á‹V%·G”[Û0z Ư#ئè¸p7”5 Xöµ½̉ü««qj„}»µ›K úvk·ËÂf/»»5ö¶µm¿íûmw­ ½\ß°EèÏ-_gáE¤§³„²/[‡g»6 HóÀ§c©5H ,UA—·º´đúă\jm];½/̣§FÏ¢9Ê&1ÖẮrs°Sêt&k–…”PúĂ:¿·ƒ³\ư~Dº¥jTL¦L? 4á„ê5"åáEüVg jN±pzd‰D³p9O=ánÖ†n]—§֩kí>]kú¬Ü®.̣©}ßûw|̣º½æÛÇ—ưê ¸Û†ƒ¶\tó)l«mkë3æÀ˜alV’bkEó™y}ÖWÊrg3Ă¡ƠÖf[u }ŸL›ûÚgŸ˜.ùܼïç1¬'̉5Ä2Bj?+Ñ„ CDºög{¶áM̃”3v:Nø^Ơ ˜ŒÏ`MÖïÊʤ E…áU:dÀÉch}ÙqƠƯ ûÄƠ•"ÿ•¾ơŸ>₫t¬ă~¿c˜x ‹ªúíëWị|<±lÆPŸ8̀‹èçYLH˜61°M[ßpÿ}³uƒ°ÛÄl3]kq<‡ÇÓ–5/˜́Ë*JÀÔ=C0a'6v²·"!Ä›g˜˜YAÙ=kññ»ö‡ˆz«toăN5G¡TÑ`ó=ˆñÀ\ø!Ơ;¿l~ Z®’%ø&b(MyK«…Lœ4– JDÉrÖ4g >+H[Qđ3#̃9“Úë*ø° ¥Á3 A6sƒ̣ˆ¥đøÀùM»Ÿ•ë Ö™÷Bx̣FC÷¦¤¥—,å ¯'iÇ•ºÖbB' sk¢BQ–>́JăNäÍ)ñ4•“¢„¶èû7]ºÜáDÜ(Ö °øvªT~r©?₫éùë_çů" <}†ó|̃H4w¾k•«ùpúˆÁªÅiW̉½‘9ư/«®SÜùgØ6đÆue½+sëè­g%î p% jmÖ!%q¶0Å•|Ö÷-iHŸàÁ}ùÅ?~—8Ñäô~壋Œ9ÖcéĂuG•ά–‘3oÑ<8̣5©–n§Ñ%5¥”ĐvkUü—rëé)Ÿ) ơßqÓÏçăñđăRäơơµïÛq<¿|ưäGfÍÓƯcF{Ă}03̉Ø̉ÀFœl‚?`ñ€û[ó¡r6WůC “›₫ñÏ1s™‹–„Ẽü.ÇEÛÖº—xđŸălĂ€ ÓèÈ÷°ÿƒ fµ€[¾€Û~ë·el»Ë¹{Đ‹½÷­ï°iÜ·}ßAü1ux©m.(,K–ẉ}±wVh»ÚÂçƯà^̉YÊĐˆáj¢3%–£³¶Đ<̀Ó¤4ø´–Ơ4»íóâ›—ô|́Zæ'Á¹³ o˜|ëŸ\ç&Đ²ú’÷îăW¸¸í #|Ü «Ö ;#5Æj̀8räÆôûïdßíô£“ 굜ø^°íïål ª:ttícd¬µom;ôpØ:g¶ o^Q}ëo_î_`$úñöñç—Ÿ1Y i€·ôX¬Aäx0jÍÎf?ÿüó¶oçó¯ưKÇƯîâ ¯¶¬“ƒÜÍØ!€Çûùqr´dMÆ 0Ö8¶ă9Ÿ/ÛËsz5đ1Ç:÷çXằS|@#(ÑÏæ\=?¡gY¡ƠƒÓ‹†"­Æß[—lưë¿₫ë\óííÍ –ʈ>Ú ­ƒ‡̉m]Wc}íƠŸdÙÚmG5ÀÄ ̃·èàŒƠéÖG½B©ª{ 4JNµä9…Ö’9•iài“ÖVƒK¬Äø§ Ád àẹ̀&K#& Wˆq©²*€.Eˆ!d×À¥]r,_ươo¿₫ ̀‹„́•´eè*m0ư‰äÓ¤…jßyJ-£ 3; aă¥ KPµ$`”kOE¿}ÿ&‘××W¡¿—@á,]yȇªîºc±M›èœÁM«Đ © SZúx½ r â?ơ<¥à¥9J ́Ô₫{aÇ åOêçØÂÙ `Ñ́%Y°hçPơhMa|ó¿ ëÉrP=•Çÿóÿü?ÿ/ÿëỵ̈öŸoI]Á„ªupÉûX–̃TÙó=q¹>ù€̀‹₫ÑDåhW]Ñ£?Å-ÿ­D̉Kê‘v^0È£ø'|?S™Ù-ú‹jÀLûÜÏM¦’­ödyùỤ̈%"ÙZô8Y†Çh'Ü̉ek…M̃DgîóÄY#$lÈ€IDATk/¯aU€sÁ’ÅómryñS2_!{~Í78 ǵ0tđ=ªêŸ₫ñOøăÿöÛß¾üo_ÈÑä¹M×ÖÚóxâ5{ï °çœ₫;±CÇ* µŸq“rU‡´Ăϳâ €ÏöZ#~ël¯¹&6PăÀ×[ï®­×0æ@*hb÷ăN¹?"ÍC- …yĂq,̉•‘èo;ä₫>•¨'™HMw`ö¾íÛív{y}Ù÷ƯA'C ̉°~bơ2ă£œrÎỆ"ô 9=rV0P‰ Ïü›nÛÖ·>ç|»¿jQḰ­¿¼¾¨êqÇóÈÛ[$₫$L ëƯàH²̣Ă ĐwîÊV&Ơ|&ßteVhbâ£Đüg¢²Å°<‰Q|áNdò²,¼ƒZªÂ?¿-UI§S#’BÖ%C|U‹ùøƯ‹y”¥;¢£_ùÿö¤M›n>¥ù:gM ơ¾¼n#ç̀Ñ?ô~Ü¿̃¿¾́/·ưöqûøñơăÇÛÇ—íÅ¥AÈ÷0Ü ˜blǾï_>Ö"‡@' ¤“…Ór5–̉æ è Ô˜ÇÁjx_‰Áœä:„ésÍÛvó̃€q<·ç1Çz¸3À<öc œƯøƒ›)”uˆÈu¨™ ôN©_\ËrsVn˜œ¢aú%ØB嫹cŒ\d†HgÔ7‚MøáåĂË₫̉ûöơË×Çưq.₫ɱ0×ö¶ß€&Uu¬ás²–BrJ¶ÛbÂho ? ¿û\1R™@FIë†áS̃Ñu‘©à&Xé0«]üD$d ïXÏÜ~!Á·°<ç•cyY0B'áăå´î­o¶­¶ö¾›ÙêYŒÆ¼(pê0ú0`‘‚­XÍÄCứ.RN·X²{ÁúNÇ̀̀ĂȨBÀ 9T3Ơ•¡‚abmùP0ÈómÇ"$-פ=çü2¿}ÿV“%¾÷e'Û¨\LÀ¸đ vvB$»Â7 ]ÅNGXVóđPă"ĂFO@®0÷́ûm¿¡É@&±}÷êïŸl .úÖy @‡'ØÈ5ÆqH˜Ô•`t Oæ?óXyk!Z¥¨%‹¼»™Çñ|>±÷O äÿCÛß5I’䨡 U3s¬ªîééá EvWøpÿÿ¹û~÷e÷́%—œî®¯̀Œp7ưÀ> ó¬&9̉;%:*?<̀ÍT¡ÀÁ94‰ÈV7c,.oobJw¦ÛKGñ×̣ÓÏí D˜.u¾‹@($`ïdßĂé|@­‘¤U¹X‘Ë~±7Ùÿ‚Ú¨„ÈCấÆhÑË+6¯.úhNư#3$N}á§«“¬Ë̉üoëYuí¸q]»åưÓ,D­ât7¡H[–ˆ.[Ù¶ºơ¸}ÜîÛư¶»Z`¿íu‡/’¥¼! n­mu›ĂHATˆ…çœ2¥̀‚ÏĂÓD„˜́Ưză¾zßXĐÁe>TYÓ₫Wf)³€̉7æ2PñgRP•ºë§ XRÀàç9ÏSÎsz»P—ŸÚ·7sºùw—₫ä§ zØ4=¸][ÙÂ…)n)^6̀n+[(Ñ*U8ÆT­€É1FU tX[—¯±µ¹éÚ•ư峪êĐ½î±₫,˜úÔëÈƠ”RJ/3÷щ¨S·Ă€5›, ]{•Zgí£÷̉!̉ØçJ`ΩUĂơ¿j]7bó Ô*åË[)éƒÑÀÍM±Uh:ཇ0gTvs¦¡§đ«]„̃—£BXTD /ˆÂd‘H®ùdfđd̀ƒE8ÿơÄÖ`â‚Ư•3´åGÁ>Đ.ïl÷„ƠÀf0…‚¦yÍ¢Vöà] 뜪M̃ßïÛ́sê¤A`Ê.pEé̉¶ ^P å23,™9ø?€9A=„9¼Éå›™5‚û¥Èưí^¶̣ë—_écơgÉ’Øü[×µéå¾EPR·p}-JĂ 4Đ ä'kƯ*ôưh2s›‰¢6¿tˆĐ³F³9¢Ü?ÿó?G¢”œ|hñÈó+SÂVù-ÊD¹á:$YË¢úxî«/²„`=‘¥e¥*8v9½̣df›†ä›¦Ë _2x"·ưk"È?[Ùе6¨ØI/9îÙ#»¾r‡0ï»ØkVƒ‰StÔ{D!ùuáV¢Œ̉Y¨q‰WL" ÷J“eÉQÉ ‹\.ƠÛn‚ijÀ÷N´‰¬ˆC÷œøEyơ"kAöok<©r(ÉÍ¥È^÷1Æó|F¥¥3ÿúå×®ư×_5XƯÇ D–YjÁA¿ÎNƠè/…̣䥕ú—Äq̣OæfäŒb›́ öïÁøÏ¿^våÚỠărƒˆ"G@Ÿ}E’aƠ³ ̃¶¹ $™S½—á©‘á†5ñÖ‹Döç¨j¢ËÂÂæ¥ë/ăN×,…Ăú–œ'à¼pí çÁ.FZ9ç s¤…V°®¯®ï¸œk—Ẹ̈™>:MstegCè mj|^q‹́áûR¸̉Ï&ö³&–qZĂ—¼Ñ¾@úá¶2}&ŒåK⧪·¾Ăj…¼Ï´uMªë0å3Öù°Xb³«WÄÅ,°uŒ½Â¹N¾sàYªLÿ×ôñlÂ2x Ơb¨¿–5Ưi®¾Lî+ê(–nXêV·c;îơ~ßïŸnŸîûƯls‚äOñË—/½­ë¶E‰/Đ ‚•™·meMÓXZI&¬böLH>l²&™ä h<ªTH ÆCR cêNê ¼ >û9Îgó|öçH¯Ô±—û°Ơ²\ă^E“z—Ưz)®–KÀ?ä@¢¿ñ‚&ÅH¬*UHíÑgGơY¸€ …Đ“»Æq¢‡Öôh&}₫üăOˆ›lÁX.ănbh~,¥¶Ùzï]: —á̃GĂâKŸƯ†O)uíÈØºtH̀ƒ”Ơg‡2{Ñ£Q >êvœ6̀Ë¡¬u ̉l »†¡£P1æ\2’Ç~ à Á Ù–¦a ‰÷l I°%º‚¦&›ÈŒ©ÀÔëMIÁ˜ L5ÀÆKRKåÜű³Í~n™:É”˜•ÙûûÇŒ¶€ÿ;U¡ßPđcå°KÖ7‘ àMØEÆ>̣Ó̀+1Ư>=_ZçX¨+!II¾WàYN™áo<\“ ©°Ûyñä)SD Û àÇ̣éUÀÎZ©¶2̃"¨q₫ˆ‰mÔú̃U­k™qâ8eô‘M“Ä÷9'¶+¬Øûp 4£¹:Ưü‘|u€a/6nQåüGö¿—Ưf²Ju³=¾l™«è§5»ÚƠúfÄXB =EYøy'¹́̉Đ;Zfn!„ưµ! Yäªn₫zn„üC!V½™S-ø‰™× u™¨$º?~ç¯ép"Îè72ôGÓ+眷Ûí»ï¿;Ïóñ|dơ¤ù—ưôËO¿|₫åù|ÂĐ"â06>¸8à8 *q+¶•ûFöüa Lf^ơ¾£›̉Øÿ9N› 4Z¬ĂHư_̀(œ`¶$/–½Küă•bSAƒ¥3Ư^̃}–  ^­Û*éY€‚5pit°ñđÁÍægßj­Xx³CïØ{ïílFnù6-ñ>@N'()ơ^ 2¡©ó‡¥gƒÜ¯™xa¸Êq÷́dL£ẈÏ7EçyøÑ Y»$åưH)+Å@*ÅÀèĂÿÔíƯÆ? ÖoC‡ưÅD‰\ÜÏqCB=xÅÑMÄ!,\@Zhlâ&¼ô"^Ëi#ùRÜđUøư-k&N¤b2W/̀¹€ÿ•@¼¬º¥Á̀hÇä́? µø>º3&N|µóă³|Æ€á·ăím{{ÛßnÛíØ½Z€‘ó<¿”/HÙd‘DQ©²R‘RKtƠ×:–™×ưïB¢Yb\¡2x@4§”ư§‹Zö²ßôfÓk;ÇyÖÅÀs<Ïy¶ÑŒ´ú7^HRñn:€#öñ•®Ú·( ¸’3-ŸăÓ±‘ÚlÂ2ç¬Tç9ÍÑ•Y—}Ï ÛË~ØN¸U¸&Œ˜t(1a¤9¹R–-a‰(Fïµock¥µ̉J)­ÛWj„#L©äÉCFŸ½HAüƯæ†Àw»¦‹Y‹ªùTœ|«IÆ”·c0Bô©…UÊcù™ó¹Q+Æùg<¼æµLSV­»7>ƯK”A|‚å«]ká‚%da,àÆöGCω)»Iü¥`ó¢±`Í$]Ăæ0}ÉirM€D˜º8Qü,"D4—¶JR–‹qlpÁp¯×±¬$W/ÄÇÄ.À^/ùô:kÅ'‰Ù×f•Ê®gµ“Jt~ƯLÎMUg®Ú{7Y ̃ÀF_X^–%² ²Â/àÿûă(‚¹”½‰æ°J %)_ä{ ¹@N‹ Kı•°urCqeŒ,Z¿ Ñ:c^jvºQäú&”w-ïeĐmï‘÷Ç719_/ñ¤Vf₫,VXW ¹ÂMçK™éD¤±*«äJƯÊöq~|®Ÿ·ºƯêí¾ßïÛ•@nÔ"¹nS@• ̉áÅ>bJ>̣¡•‘“­³ê*÷Z±²[Hâœ3“Ô'O_5§*û¦¬Ï/_ư­ˆŒPDñ1N···Zëûû{k-ö[׳œ‰óÀ4₫vÙc*sp«¬ûȹI­.œƒ¦f‘ÂÊE   -v³‹˜9º"¹đ£€¥¶RcœăD²1í,RÎ~)Ố¨c f2t ™’ÅنʌÑG?¶#Ê\Ù·ƯHĂ>c Ú€ÈWâW© 4§'}\sr9-³;-ƠÖ ‚ɦvGÓ r”h.@ÅOPD„x.¦_¯:o D&ºrJY_v,y»&ăyh•”§í4%Q̣aIGF(>€œ}]… óAW³2úÅ‹œüO†Ăă{$^©\ ˜|¶°ø Ä¨ñś"̉ÊƠ:ºœåèK^”#¾ĂzôVøy1Œ¢—ƯK2J§öYËxúØï’EƒÎJâåîï—8?½}úôƯ§1Æ×¯_WZ²rDôˆ÷·nzn  *-Jh0.^¨€´ª¾¬1 yeđÎ3Á:NĐ^²¡Kö`ỵ̈] ?Á¸™ÓRƬ ̣ñü ÎƯá*ucŸÄóXªé&=µh̀’wô —†R̉Œ½N ïÁŸÿ­IP‚°;MxZjÁ¶ ¶t$Á@ ̀r Øå%ă-ÏÄ+½âc%çÅ®Z°ĂÁBe*˜yßw"}pè·¨±|V6QëíëׯÏó4¢BêüD·*°äƠ&UR¶B"¬¢BBƒÇ:טßlB²°NăSŒ¹4'̉5ÔÙí'ø?kÄ/ í+̀û²~®g Ă¥uä‘Fzºïûư~7l¾OíZ©:ÙÙˆ€½-å­nV ®É[ësÍbRC88¬ êæ}̀lmG ́Rƒñcd’×yê ù®6V5P?%  [ïP ”ñ€±RĂP]99z8L"½ Çyq_«N₫¤?:¨C°È­0×̉M:ÍÜPẠ̊£{Æ̉‰³e•í2o¸M½uTD8V ÈÉư™Ư”ƒIáv‹‚⟇BzÛVauíªW–?œ6¶iÓŒ¤ñ³l o"ÔÜC§₫[ ÊO¥ÁCXŒJED‘‚Ư»}"ưiú³̣D"üºï÷[½íÛ¾×}/;j—̀ë èÅîµ+K؇FÁ@ 9 «>xcÚMÎ.åư"¢21lˆ½½>¥p% >Œ₫îí»º×Çó!SÎr››ơ'j EöùÇ?₫ñ‡~øë_ÿú§?ư©÷ï*Nô1G“¶0€nÚ5x){ÙĂv ßÈ)̃pC/Ă¿ÈZM÷ĂaØÚ„…ˆs»£ïáSæçÇ̉Úó^L›nál"uë[ëm«&ªØ ’VÏ~2s…7Ü©Ă,Đ26âƠ„£Uƒjnó–¹@\¸Ô2iÎ>aܴцgj¾`*_™N'-S'È6.œÔ 9Ơ9‹ê k@5₫˜t ÎfüÖG 8*R:$¾xd Çä³ä7Úµ):Û¤Ü%#÷|ØßK|‘&™aĐÀ<á¥@vHfá›ÇŒ•Oâ8E,Ăn¼M|XÙê‹N™… ¤8"LÓø€F_™$Eâ¦E’D)¾€ë₫#pÁh˜Ç¦è™À%Œ¦I½RVø$æ:}ØóKÂDD4ÈUô+V‘¢I§#¢û̃G`T‰,3(°ü4jÙ‰Q9Í~M›ë\´¬|‘!:̀…â¿®±È/¡Ågg^Ơ•¾0‚G×'˜Jàßơ¤*ÈÖÈ-”ô~»³đûă}k—FÑ"ÿ¸¸…KÂôÔ¼×’Kz₫È«û”¶̉eË}£±‰¸nK{îyÉKápÿ…©|tó ̀»,?Á—2̀;¡(bMÆ;đ‹N#4-¼µoYc³Ä^s‰™1v‚ßâÆù”y⦅½95|V+Àµ«ÀđÁ^t•§§ÆF º*µÔ„₫†jÈirsN ?}ôg{â(9ûi¤ÿ‘àÿis_>/Ư!unÛËBÊ_QnÛ¶ûÿ˜˜l´́HÉØîăi­ªZĂ(Î2rîẠ̀M–*Y­«Sa;ƒŒ?É—o"Ä=“›fÔo6ÁE;y‰¼?б™$₫ѽY+ë7ÈG¶¹€;ƒç5̣₫àz­2@®ÏƯû}ßáƯZ{OŒª\ ‚_Lđi5–ǸáÂ\¼₫‘*T—,lăŸĂ·˜Âe9¹—cˆÅ—Ÿ’‡M€ư15â7¿ A# ™Bº˜Ë»UASGô¯Ơü×_×ÁÁtĐ¥ËS$i·ack}!+æj©¥•wy·™bûíVo·ívßîÇv+.æ ÇAMÜéxx >ôª.úli–ô ®fPb…†Ô`È•"SÜë~l‡|́Uê¡G¯=& ¯¹Â£A+Üf“*ÿ‡?₫ă?ưc-ơÏ₫óߺ±Öà„Îà£?j©›Ø^v°ƒöºïsGËl£MD0TØâ—pT2ª*$¬î@6–‹/ó‰W1 R¸Ø­»!²6Z¸ùÑï̃êfXKo{ÛÏ~ơ|ÖçvnµÔ³Ï₫,RíÉ̀€f)u``0&3\l‚úÀg¼›Ưʶënû¼(UĂ½ÄeÓùt$¯‹¤0PÆÁfHRØeÙ3‡<7˜ß! ŸÓ5ä(˜ßºRu.1ç)Á&LF:X·x^ù‚3h°ÊúƳđ`÷^o9í$fvM°ÿByl`g`ºÑy`ƒ´Ñ»H—RlƯ·½Hi½1Öñ@T¨,´À¹Lø¡ ó̃±©!ă§¼6`®Ơ…‘R®ïº[SQÔ¿"aëqÄ-oÜHçâ ǼøâH‰œÆtc>‰LƠæ†ZÁ#̃7pñ7)=ŸOÁ́§ˆH+p…`ú·*C 'S%( Y¬ÅïÂHCk­ÀDăAGÆÏ‰Ëct¬±N«$X9tR§ë₫·Jbưçn5 W  =KåîŸî¥”³ŸÏó}0Ăđü±ÿTŸ —wÙCûk¶?C¬̃ ®·{û÷”-A7„/¥5®Íb<@%›Ø¨—6₫ú́ vS^Åë› ½¨8uaq´Ó_Øö¡h9öFí*‰–˜®Zö5ÁíƯ!^µ®æL²‹ ‹äˆññx|<>ú0¿‡åáCîÖ’ĐEñÎØjÈÄ}đ›I¡•sƠÈ?6ê6ÈÙ¾\¦›J!Œ<ÛóÙđüÁ¹lÓ~Æëđo·‰'•ˆ1ÑHä+.Êă"¥nơvÜư(¥°²’Êñ”c0h-u¯{Ưl~pyøL wÂd{ṿ~4 ĐE–3$‚ÜṢ̉g ·L1̉:“)óªØo ,ÊïŒ)üÏ,"la¿¡‡Cbđ@ñ ‰í:T &-R¤H_ "åѶÊ~ßï ơ@Ñ%`V2-8Ê)'I+u!™:̀&' FåU à!·â1‡\j‚ÑÑÆ©'TÂREIgA\P8f ÜpáM···ûÛKCùfˆ…̣O"¢N…Ë̃÷½́o ·ăØú¶×å`ËiÑBgvHGM83{5 #ệÍ ˆH´¢R¸€E£¤“gÑE¢e·Ù²F¤÷|÷¹£h[Ûû₫<Ÿ[Ươ¹µíQ¥•SÎ"åÙŸ̀̀c‘G.5Æ)ƒGŸ}Û×2{/nníh…˨Ëj7î!øĐ¶E3jËVÑÄ9gY¾Ht¥³7 V¶¥Z‡¨"I@²äû,”¸°ơƒùå*Œ n¾À9ÿ[Ô‹8rhÁN8ࣜˆˆ„ËCÙ£ʦ,*6k‰|Ië€`×öÑ:ÙüMt}:#ÖL¥â¹ ñ¾íµVÀQX~Éx4R´˜ Ø[.MqÂ7Àû"%?£e†Ÿ(;æ ÀơcTSô^ع³ØẤá́Ơ„èÔRY¸M›ư>5́FûC˜€\⢾ M¹QƒøR–ÓTR€' €Öăă¾Úèz剖V7÷ÜjZ¥.ăSç§OŸöc|<¾~₫đüÅ[x³Ï(¼`ϱ´r7ø›ă@Ó\z|ÚJx¦ôh¾@ñ7ñ†â¬6Y\Ë£¿Êá®-û/»É}æ¾Æơç[ tàÍQLFú’Ó‹Øn–乸¿?g¯BëŒîÇ0Ëuê×Ëb¾`/%™\c§J1â\Ñ vk|̉èäÖKmIDsÎÖZ †/̉ĂÍ@´@ _¦ô(iÚæ2ÀRÿh±ª´=—̉²ëΗ#~±1´6éÖ!cùe₫tứ§’>ÛÓRÿ~Fs>úóñô/ÀßÈṿ_ö€ËqñµÔmßöƯđAL´jMY‡bAĐ¡k­pK/Ơ¸₫Ö¦óMÿ‡“F Ó‘­/áüM/C?"ơßGÑ(&3/T˜´.Êü…4‘[¦̀ŒamÖđÔuàÆ!ÅWr2)eדơµÔ­lÖđGŒJ@\댿n…8©ÆSù̃;@ILÛ ø¼s¹YÙ=èAu–*Dôñññ<Ÿ(kí”ïĂ¼,8ÿíÖư SÍ›5¥₫A₫i½µææTs¡X̉^’8ƯÀ†?Ô""s̀³½÷0ZôÓÛ ÿù@¼pAÁ¢16»Á­7—clM/ îx`ư)Uê³<íñE¾́ußëjĐQM+lC%™"ËeÙQÊœ Ơ›̃R÷3̣̃1 gÚéB̃~EƠ+‘ED0~Üç³?Á$1¡;U¶²9nó†@ÓzƒMĐĐñë¿üú₫Ë×/ï_̃ø­Ô2t´Ù.¥óU)‡¬M¶}́{Ûrá¡?'_°ạ̊ht¼!``£ ¨„çÀ:`†,÷(!–í¾mÛFJ˜Àç5îƠ 1ÆØ¶ eÀ¶m­µ½Y%°·ưÙÏóYz©­í8·ÙVM³kâÀ!¶Dí]ǹ׽ׄUø«ÖªªđGCB¬yl‡‹ªµ [Ơ¡¾̣vXxú¼úEMVËq•Ô–ÛdY#‚szfÀH¸¸¡ec§¸B(ÈZ«÷*ú3IÉ6ơ÷Í]N$¯¢HÎ8LèXÂ{€vÍù´Ëp,ȵH1#£Å-c,àÊjW•¢¬¢E ¦¼Í9µ(.CX&ÜAW&ï5Æ:°ÖZ©CzMˆªç̣\C·Aª€(ÄY0tåư4k ”Y¦tb«©•9Mó8Áö +e3wBk‘ØÊƒ5~˜H.€ xŸxv«Ûé©jôĐNŒ^û¶oÛø?L(‰jø:öÁü9¼æ™sáÚÖäV¤Î‹†€íBæô¦(~„…Ö©˜&ôhñªköÿ¿† Um£á=‘ûEªUt^‹Hàê₫¼VÑ%6¸™¹'dÙ­Ơă² ¾7E‘îƒ0;‘]& ¯ư¨‘å‰ ,y†óøœ¬c̃ú|N…á©/Úˆ>:Üy(‰Jụ́²ZzLÓføPöÑmÙ ¢Ọ̈ÆH‹ª˜̉ñÉc ¾›Ưô’î?j•ÿ…@lƒè˜°KEƒè̀̀–D’0±1 „ æa£.–O.ØŸ;6Ơ±G]Ô  -ˆxµ£TƠk a DzRQJj bèDˆí¤–€îĐjÇ7H‚ P'A”¯R§ÎM7ËY§ç˜ưkçÆßïßå@£ vQ ¼”‘ÇC•+ €[½E1`5@­›luZ7-¨¢Èw±˜ º +â¨Í^ºÖz›öÍ÷ß¿ß[kç£h!!*q Ég¡2ËÜt•«[ßûvn[Ư¶mÛÎmoûV·zÖ³œ̣€Bà”“:Y6OF2Æ›8|8Ö¯[½ƯÙcŒ}Ħ>oËöªă%kß*ÀvŒö3cPQp^ƒ$Cn3ÆÎÍ iRÔÀø•ó₫ )(ĂŸ×ạ̈¶¾Å,ƒ¼¶VcÍÙÈôỤ¥QáQÎ9!k)³Ä”†àQør̉º [¾ÈMiC¼.‰è|£¬‰93eüÓ-qZà誥ª«f•uĐÈ·!BĂaXáÿ‰•¼Đâå¢ĐEđ]èѼ&x -.2°!ŒP6.Ṕ´fWQxí‡{qöª"æLt"á»BÖM²z̀G5¿p~( Èå&+É̉½Ê7 ‰aGíư±ó<Ñ u< ăùđXtƠl4Ü_8ô/?:“­đ1×(¢l²®=:l9œ4ŸçsẸ́’t>x,ù…₫ÅësÁÿR«Ôï¿ÿ₫~»Ÿçùx<^ k•æ÷ơ{©¿øi#¨ŒeJE×Öđ¼9»̣…âY]7™wz~‚« £ëă` cèEv×Ëơç>çåă0.]eØ8_ÉåúÓT×ÈWLcê)fr™SåïP̣[›—p7]pºbWz 6G¶¥âHÉ¢qB¤âY$×âL÷ngëèyzOÚ)•^/‹ù¥9Ÿå4¯Ơ‘,IDÊû¥xÔc«éèDB@Óñă¿Ö¬µ8äØ?’×pØÄŸÎä0ag^âüë2NUt́P¼OŸưöv;£öåñeºwm|cÏhåR‰ÂÇŸXÀ|aaàN·jƒP‘¥„˜Û̀â«âÿƒÎ¹jë8óƒÀ„5n7L¡ÄËA@Ÿ¾z­uè¸àJ¨*uËĐ²[粋g4J2-Ÿ:Ỉt4d.₫nƠɤ?Qü/N>ø†l+‘O€‘d5†¹9rœźëZ¼^ú_[DD³b”̀‚PÙ (IéÆỚJɇÈ^Ä ö 0»J=êq«·[½A!éLø¿æµ—ÓvrDĂksD ăZ Z%,µÚÎĐ#!™g3Ú÷¶ẻ\G­Xd•M¶é£˜!sr´m7M̉´or:‘= qÄÜSOüÄsœµ×G}́²*­lˆ>`L.c%)"iÄ]œ¾jơû ±<Œ&:ÂRKUÖ²•>zo}9Ê(h k)R¸2N„°!£Ô²Ơ­̃vnÛ¶ç¹Ơm¯ûă|luC ]„Å´Y£¤Ô¨>F«piµåƠ¾9fc7%ÍV7"‚ä´H1% h­ —©sĐ0ôƯ]V,Ÿă¹Øó¼ÆÂ³24£KY«¾xÜV2pú ‡à2(é¾Å¢EÚ£pÉ+$’9ÛY²j¹Eδø9•µhP¬Ø%qQŸ8æÚƠßôk˜4@YY¦œçó<ÈsU₫Q-ƠØÀª€ÿgYè µh3™*¥ø¹Ç)₫úO"3@¯̀& à.K¸)̃Î  Ú¤ &²=UµÇJ.ÿe²̃ ßøû‹aΡD¸Bü¸é^₫́ǜFüzà[ôư²Vü÷§^P¸_̃¿<Ïçè#h?ÂiÖfôư$U₫)û_Yx.̉̉Uå„,æª.“^ê^ Èj”e&6Û¾¹Tü,kA¨ó§l{Ư—ơgY“æ…å‡~øƯï~ÿë/¿<ÜÛxOÔHøØÓÊœ¾™‹H*û’X3¸ÔEä©àṆ̃k;F¦Å‡+\iÓ6ÉL]3ïßöºmâÛ<ٙܿđl^Iºîꌻۛ›Ô?|E2üơ¹AíÂƯ§Ù₫d̃¿m.±YŒ‹‡jSzxI‘ơÚÚHưër€‰îºÚî¦(îóƒ³,Üsàü¬êåoS}₫Ö+ơD@óÁU,ĐơØ7³ =¶£–:ú}°̣ÅqÛ0çëâløµILj ̃|ŒˆætêÓæ÷–bZyb[ídèønÿîÓ÷Ÿzï?₫øăt¦|}ÙØyà¾R˜[¢¤üÆËBSV©û¶k̀…BHD¢½c7Åó~s: 7çÜđÏ¥«́Y{S̀̀êBJäÅ/ˆÀ`Ÿ›Çyo'"p&₫­™˜r%c< @~¤€È·–>†ÿ¥‰‚‘¿¦(P¹S÷í Oß¾6™₫Í6 ÿư¯xNFRÔ5A]:#SØ YJʨ³r§ˆHé˼ ÂåØ[½Ư·û}»ïu·V¯óVä˜èZÄ×C4ª‚µ¥QƯ©ÉEíß̉º¶F’x7P—˜á,waLS[lZá–Âú’¨²tx¨Ï7MZŸØíX¸ç<Ïy¾÷÷½)\)Đ¥ö²ïĂÚ£ŒÄ!††€ÉỔÄÆÙp¹î+!x¼—Zzëóa]iÿ߬³h1½·*ƠYç£VkÍưxÔÇV7ô@÷sßê¶ŸûÖ¶§<á©ú¤'clÈ́X•̃fƒ/P­×̃·al#†“cŸlÛ¦ªT—¤[¦ 4DĂ732f% •0 €1‡Á̃îV¤>߆‡ÄA3;È/Kß°ƒ®6íÑQ ¤ !ÉÊŒ Ư] EÛ¯Ơp:ÆÔD±¸H,`đđI¡ÚÔ+Èeƒà¦ÎÁƒ'Ø`/$RƯT3¼&±]̉ˆ¹‚CD "›©¹2×DÍÂÙí́|$¬”7ίÄ•÷̃·ºÅ]ưÍWđ ØE“–HGÛĐSó@Ù Ÿ–Mb z+${7ü¶VLsC©li(Ọ́©H/Á8Ù€^ZQy Eú|<·eÓ¶â3g—½ÅJquơqAÈ3åÉÿ'Kùsă ×lïà>­A,¶”=º™9¼’_Œÿ—ç˾íû¶ÅÁ™W ‹è¸LÜZ›cFö¨y|#>`(ØVñ ¼übËMNØ.¥Å‹¹ÖªSm.ûÁ_ˆ²©«¥~úôé8níyçùÂù‰ÓÇĐ¥*¸^<%ơ*]·ÍÊơưÁi²&\ :?ÁQ̃#Ëɾ₫‹ú8)¼m1µ̃bRr_ NEv€±fS¹Âï?óàÉA÷_àú‡dz?Ûl&¥K%ĐoÂÿyyÇñíßq̃€”ªD\íí¸ơ(\¶²½Ữ¶ºÑ¤Ù¦m)>…S¹đph‰ %g~^Æn§¥$ —å)+!ö x“­ØÛ Ï>qæFT™` Gdß÷ă8æœ_¾|§9EË—‰”6ÙnÛí¶Ư0̉x+Û¾íÇvD.‡|Àf—ÙƠèvuô0ç̀ù¥"͙Ⱙ`‚̀JDKÙL—¢+hrfƯë‘tqqyª?HYÑöí'~-CϰBÖaÎ`s´Ñđ;ñâWçEùåê f₫¯88p"×£ệÄ̃ùÿ× ØGó̉¢[y0É₫— ĬŒ”bI‡Mé,UXÎq~ÈÇç̣y¯»QƒÊØÀÀ*±æ‡TÖ~¾|gäơ÷‘ºY6 Í5Ûr§}jHW÷+‡œ€Ü*ƠM¶]÷鮨±P|«UBù¥CÂñ˜ă1ưă(‡1¦êV ‰½îe”đØÂ>\)&-Å*a¡¾dd8¥₫ô—?ưøÓªªCÁ̉ĂîÅfÁ„R¤h Ăc.­7üưg{ÂúƯ€íܶ²mmÛúf¤ Œi]I»v́4àj!¶FC oVU‡bfŒ±oûÔ9ËœsÖRѣ“Ï{g/N…‹úbWɨЇ ! $ĐÔFÉtYÿªh/ ÈDdd<¶&Ö¬m+&|±Í# 7ª¶­Mœ^qtÉÈmÓ¡ê= qØ1G(ơ‡ ̉¾€vEd=9;u,$˜Đmû†¶>NH¨K±‰Z+G÷@Q¹‚ ‚sèå5̉¶Ă}_ú¥n^ fµîGï3ƒ^B|l(öÙÀL¦̀6d:â²`œ4Ś©9Øo¨Ä₫&¢ J/3™ñ¶N/EÎï•÷Ï@Ô§ 4©̃J\ÜƠÓH)IS6sL@ÖµDÀl¼——™Üí*+ ?v¼#±Á¬Ëm.;Œ|ÙOç7¼íÑÁïl¼m¼…êØeŒƒ…™ú駯_¿>“̣ÇJs@ù jÔØẤ>'úxÍV 88‘ư/•³R˃™±/đ‰J)ß}÷Ưèăó—Ï:̀}.¬~à‰çmuûôöé»ï¾{ÿú̃zËƯ˜p¨¥˜‰₫R8•œ‚2uKˆ’p6Đ“¡̣ñuÇâlÎÿPƒ;ăáưƒ¿Ữ~ÿw¿¯µ¾ÿßgŸ+gåƠ¬Y¶.W]†0Ẹ̈EI}öª³‡Íë ès˜÷êÇz¨6¯¯è¹EĂä’ØøM&ÆcÚË~́‡É”¹îÛ~́ÇQz­« ´Vº2Æ5¬„›K Gơ9* å¡¥7T€…YgFyÉeöâ&F«´¢"LüóO?ÿüóϽ÷LJº~……‘PEßAªơPƠ³çƠ£ú Je–¿ûáïöº£—ußïL\¥‚ØѳY;âå†Nm2neÏExä~£qå06å0À™Ư|x—ô æ7}êE—c=6øÿµ‡içư†Qö¯đSjßGr2ubHÔ²đ÷Â,/Q<ưoămÎ₫ă’.l¢Ëï¤ÿ¬÷zŸî´’G ¦×ÿ‚Wp ‘Ó\Èß²øú¬Û`ƒmo]O¹À–Î]DÂ>±ĂNHÁ0<«ÖUD¦VÀÊwÙ?­¡¸Ør”´fø˜B?.)ªí¨,1X×ô…ß̣˜́!gÅÑV¶èÄ­̃ñX=5\l6;PihYFX"Bùc×úeD3³̃ÇøXÓàäăɳMûÍ l&É!ĺÚ56Ü×Çlåôˆ‰Ûñv{#¢÷/ï‘(dŒdº±:â# ""ĂLŸ:w›§á><¸-¢d’Ëá4XIy,¾ t䥔Ơ;vM›m±BÆưK'Ù÷oßú₫ ưüËÏỵ̈× CÁgÍ1®ê’諜ródßNÇ›§bnF6—dZlü²ö́%Vg-+ơWw­‰Ê¥¥ú<`£÷¡BÀs dñ4ôÂæÔ°Ôáiđkp¿¾øaÀ¥F0°O”B+Ư´a"y¾Rx,.Øơ…t”H‘ldyC‚ :Ó°÷‚<ÅdŸ¡»Œ ¯g˜’‹:¼>«}ƯÈ@ˆèưăưñx„¡a.qĐ`1÷̃C@BWpĂ„1_Pjy¼wCñ6GÀâP@À0×éø7¯.wÿ††: Ó¾8´₫t ”ÓS?󲃭í5Üí¹₫e>èe+˜uæ(̣±`­Çê>ZCRdß÷mßÑưX%›Ï¢à²Íè[µî²/:xñ4Ú¹sѲˆ©¨‹ëßO+æ3è₫ѸX«É!’ÄÖÓ¿fư™ƒųuŸêfZ© Ữn·Û~Û÷½Jµ÷ŸnÏEjDv]ÈN¼'E₫• °ßˆwÓç[E43ư†8'ôè&l½O=„F·=ñaèulmĂ5Àiç‚¿t»†ÖÛ3¯: »́üưßö·9æùŸ̃>ưñïÿX·Ềưñ¯ñéb ÆTt?ÄgA/2^¨£³÷Z‘_ œ=¥Y‡ƯæU‰Ơ×.Ưúj₫ ôLsÍ5!PđŒ‰\QÀºwÓÈÿÔÇdÚ¢R áƯRdđo9đ|,ăqÿæŸfG•t¦Ü?ÜĂl²^^?@³=§₫A0PŸU™úƯ]——E`OvºûÔ³È8-…e‘"êăLM([8ưăW$ÍA¤ÁMĂh$uB‹ºY v8 ª¢ˆÜ:îa¼Uà#¶ƒ|L˜y¯æưÏä3“ûísÎv6,±0½°1¨âO$„aé­||ỗCÛ+9B»‡X-‹¶ç<ÀÎ3ü)Ü»Ó[̀N—u÷¤Uødư’®™†£ÇăÑz›÷0 đ‘đS6`æësú™­:ÏjEÏ„°}pDöÙÏy₫Æú÷ÛuǧOŸæ˜_¾~oLn \¶­Û¨¿1”¢¹™ư±÷Ûư~»ïû¾•‰#$wá4K€™&Å^‰₫Ä÷¥1¾¢₫ѲX7Jm‚¯=&àlĐ˜lEÑ3t¤[$ˆkơCc™ ØÅt8·ưö»·ßƯo÷qw}‡ Ϫnëë`·–oÄEAjׂç·b]¬O|ê%XW¥¸~É"ï­~»D.ëåƯ#PØ‘7/ÆxY®?úóçœoFưûèy"ưyI¹s.§û¿MûÉ}€ßJÛ£6³Èù¶¿©*fÄáø½‰ÿù5@pÓ8!"›É†ß± ƒ—¬>F„XK-d³̣à1tÀ¡Ÿ|†e‘"Cüøz~E¹ow(†÷²‡ +wlz.KÔŸÑê%'‡đU<ÀÄæƯî6Ơ…‹ ̃.ˆöY¬c/ƒ¬oXHŒsǸïâÂSgH›RÄæfĐÏg>Çó9§QÆÊX•€ÎÇx<Æ£p¹ÛÑ[½í}?Îä¼Úk« 5€¹*Ù×}ôm7z Ñ&aáÎ˼µTëäºX₫̃ØPúÂç½@_p´ o„g…líµœeÛ³?Ûh2Äj9Kƒ¿*₫ó÷ÿî÷øƯ~₫ËÏÿüÿûgHú́cÇ<æ6·±Í:k­uV™BeÙέûmÏ—ˆˆ“µ !ÿ¬‚ïq7hđ`̀å^k‰G.=,µÈ"eÉRä4~Çp 2Æ1=âăëV?}ú¤SáÖܳø,…Êœ6ßÀà«6¹ü₫9mܲ&B¶}–€rÍjYè”Çe<Ö΢•T´h]‰øÔùüx~₫åóưí̃ÎV¸,_¦dW·¾¹p°×±‡É\–Éi:)Cª…íéÜJ±¹:²œ¯Äk0? ¬¹ËwPÀđ~Qö‡†´.ñ¡¿1ó!\€,™N:ḷê.úœG_O?‹9 [^̉ˆq†SxÖkÓ¾•Lm)5¸6i5•a°lăü#"L-ÉƠGLT6Lôª˜1ù!)ü¢½É̀Räv»1 â ÇO£5ÖƯF±Åvr€)K5ép̀Ê]Øf;`E]8?¼ƒŒ©‹·ÍîFˆƠ1óX¯sFă›̃ûO?ÿDd†0‹óă¯̀°Á#3?ó<±– •HPñºNj'ưĂæál<Çê¶¹Í:Ë,x ¥¨½ÑC~Ö«ö ï9]HưT™ŒœÔđ?»Æ=P„ˆ\êTœv¶1†ṇ̃#`å„•.97;z1qzÇđÇÇÇ_ÿúWáB®Ä5cP6.NµùĐ́ÅMÈ„¥̀2xtêÈ¡1æC1Vö¦¦PÑ>ûâkfÅZ˜$ơ]Ñ„mÑø€s̀Ÿúù§Ÿ~z<(˜XªlÛV¹>à«ó7Ë€©1́ïÛ́?ë4 ̣ÇÆ„îÓ†ª*ă2(Qi„…l7>/ạ̀×ÏYÙâØ&x²r•ÚûAƠ²₫çpq:®n@¶₫ĐW€º4´(²ăÿ° ÷8ö ŹITÁ¢YÙêár¼Pÿ:Ä€Ëï_5îfiE‰”ÿrªYñDµÖï¿ÿ₫óçÏÀ₫÷²CëLqsü,Ơ‹Ás <ۯĴŒ̀¹ ³̀éGûyÑDzÔùbâá,£˜{E×E.Îë˜Gï: €ơMqL¤,"P¤Â‘ư[N–º@9‘b7è4SÂŒư‡^YG₫ 5F³y¸¡8¶bI.Œ̣o=>]%bÜ. R5''¹¹”<̃+Æ×ˆû4Ǜ+àZ`^?f̣3ÎçxâAä2gNñˆ”R¥”9Ç^₫¦7+^ú3a\óv{{»¿Ñ¤9&¸c;j­ÚơѤdܘw^”Fg&L]rÆk#NíøÓ"åßưñßƯo÷/_¾üơ/]Eø\!7H)¹Å A_qÎ MÇâƠ„G"¸4]ôápEÄăÈHZö½Z)6Î^÷Ñ́¼¸÷ê¯x¬XÏĐqnây ëôĐ;wú:Öµđ¯A² ®TN¬Ù%%/ñ'6¹íwcö̃Ï~Ơ ¨1†ùÓ4VJ‡ü#úÙ=Ôơ¡.UGœ́äWDtoYçŒ?=r"œ2a™Ê"f.TX¸îu'¥)s̉ÜÊfÁ:Œ{‡5m‹1¶:Í€j₫‰~éâççç’₫Uá-†ÿ^yNß.dÈ(sç.Ă ØQ!n!6óœ˜kºPv™È:¢ÔN?ÙB-/±¹…KUf6:8°`±¦j̀o…2€]sáƯư&,DX‹öx' Á0‹₫¹¹Éế³?Çs/û­ßđÏѾÜë¾½×½́v ê¤p]ȱlÇ̉¤Pkôå]ár+Û¶m˜Û°m̃Èe©T©`„‹%#EN©RËiUA"„WNJ6˜æIÿŸÿøÿ₫éçÏÇùùñcÚÖú́cø:¬¥Î9K)@Äæáà274Ä@ö¼ôơD‚{ @Ú 2½åăBØíÔAåG~¼Z瓃³HaFKĐIlkA§Đehîóùüơ—_á¯î"aê‚ În9ј>Úÿ¤Ï7A¥¬­µÖq÷ñÙo™Q0d8Đ¢̉Ô‰ô_ɽpÆ2A0)5mè́Ï>1vc\j©äóæ×¥¾°€^ˆÎÿÉ•½¤Pøs‚̃f9=cæEöƒÄá/́u…†+€“¦́y&ngy•™&9Á¬/œ¯¤Fá7_¶7•¿ Ëq©qCØÆƠ®•{ÿœ4ts'8ï+gÀ‘î„|i,ë2ÆÉŪ̉EUÇ̃ª¯Ä`—"å8”d&ùơ_ˆ$ÿKrœ¯z™èK1̣Qœ”™éị́àü¼¤Ưºg8¼^s8¥,„“̃ê+ʬ`œöL»ù”ø?Ŧ8EÓÅơ4­·ơ¨|'N7íư ́?‰¶MÎëíË&̣K_D ·M̀kău]æI‚¦Å'5́́ùºÖ¬3_u®uÑưÁø·¼¿Ÿç8ă…gôÈ¿áî•Á—ÇÇÇŸ₫ùŸ™}vö%C̉,È^“ª¤”R̃··ă•G6n’E‡víW«gù‘ë_Á~Ê?)‰oVŸ‡Œ•º• ¼ÑnRŒÀYB†₫j·Eæ†gHy`4øw’ˆÊÎÉœ>Q8W˜Ñ\Nˆµà ©[QÑY_±VpƒĂ|9²å$s© #KœZ<㧉₫*åÁ±©¯¯ Œ«×,\—_*đ£+y[­¯s—3íqÿ³;V`vÖ\Å8•^+‡—‹»D5/Z¬¨ùû÷( H©&LÁÛê¦eœ³—½Z\}|0Ó «Áô’vÿ·^¿™»ÇÍú̉yiúØM3ÛSBfĐ­,«&fásœ«‹W¶ÛvÛd;Ê¥ùä XøÎ²[àSfQ¯’ƯkGö‰0,\´@LÉ&µ€Ë̀đđc$oÂü‘ă„ÎVܪ›ѽîäâđ=°n@{̀ß dbn¬¿SϦ­vÊyóQ{Ưïăn›¹́µÖQ¬y£L2ÿ;ؽ«§;vtêDFé…Ú»!9€çÏV·º›üŸ¸ºT®TÖ*j`Ø ËÙNÜÆ64{º6úăüø?ÿăÿùÏÇ?ï²Ë”Ûv³î˜T[sô½÷Ù=¶º9¶ºÍ1g¸çc †ăÁX’üøh«.÷Èb\ ă>FÀZH†¬n€ïغƠă~Œ1~üëÏ₫̀ËEl¶^ÆO$I] xLH† ¤Âg?ij,¢3—–ΰO£w.[!¤×ƒ‡ˆ †Ư¶m¿íg?ßßßIèÉOèÀ@PÉ ¦sóœ4§̀ªæKªZµN™R<ƯO€¥m¨’Œ€°/}À¡#˜ư K5Ü}ºáÏÔ‰1¡ă Aô^âÎZJr&ÀHºÄ³S{8ex"dE/°1jæÀ`(ΪÏ`O.8È5Ê1­Œÿ7Î ¦¸®ƠPqwy‘ [ÜO6“̣²”Yyie§;o,¢Ô^ dº¿tµ¸ ñI¤.Kñ˜¶T âü8©Ó Ó °ÿ`+0fÇ™|ÇăF<·%ñØ—DtK1#r…™T¿cÁÿ™́„€¯”²Œơxgs¨ÔóÇ›ŸY‰a埿Ơ:LcQ¨‡Ơ3ôäf1₫çJưa ïOU¥ß<‹6èxÍækậ‘”DXPk8ÁûEjŒk@ˆó[OD§ÂøÖîŸxö³ơö́Ï@ưá•÷Â߈†mîÜæ,êëׯ˜ˆwg€ưqÄk5gÊâÅƠZá¢Q¸D›4ä°Ü­’´0BE_ÓPº́}̣¼ß:–Â… =?UjoXVÎûĂ#ư—çơ’̣®ª;߯SÏë¸?{ÙÍ\¤+ﯯ¸Í°‡­– 3²ü@Ù^RÿLzYe€/BÊ£÷u%]8il ^Áí‹ôÁóêÿ°–RSE·̃ÚÙÚh­µ°đ¡Í‹ä3G6QÅ;CÅ´mXU}ô8Í_^́~•—̉Ë?KT†ø\–å“OjJIÿÂûb 8³‰̀¢ä¹Ü|äºáåä¤?¯Kùo¿¼ŒÇWC.‹k₫X¾Ư¡'¥̃züYƨräZµ×XU86ç×ó«°å€Hਈ%JÚ¨iWbB+Ö¸î…d¾Ơˆñ¡zœc̀ a%î'F›9̀.&ùQX…@ß…Åüa®Ç€% Èé-h-P ?Ï'*öbÀhBó|i¨55ÑM¶cg?Í3´{ƯûÖ·¾me;öcùNàđ*6EªĐ°̃ḄĂº̀°LîÎ5¶ÍØAÈ=đ…¤r%!Ú<ßơbUƯËÜ)Öđ™f‘Ù{ÿ<>£Ÿ~³m­ÍÖ¶%€I(̣ƒ½îhT­"2Ëä‹Hœ…Jâ›èåOƯm•…îC=qTPø‹w.R₫đø¿ư?₫ïªóÿ₫ïăËèÔ…‘\j<ϰ»¾·Ù„DT†ÚLß ëç¾ü¢4d;2ÿËb̀Ùœ́vxEÊ?üđ‡?₫áñ|üçỵ̈Ÿ-#G¾çs‚ƠIÆÊ:ÇD×]¯:k-tL)Zèc=“ª˜XTJ)/i„¡́Ø2Í¥œ^¥„z3zAư•ËÔÈơ•ñKT Híp]áÈ%”™̣8M¥đ̣[~¼T—i'ÿœ€ó3ùG+%D+wIeg”"+]¾",¦ÊHâ£@ƒ,³ñâ|¯ûlËrecëÂ&Kø0΂—̀c¥₫‰ö£WZî­T;͸E¥”ăv´³ơGße_lăÈ₫½h ¨>"jµƒkX:/í  #+Ê߃Aú0öS̃MdE©u`Èå­dKnb„«rp±l%ë̉xèhÙÙ’PăÆ®œ> €}äư‘ñCAT₫àùDg>Níhè7#¾.²“ßäă“WïĐÑh Ï·ÅqJă½tZ×1,M‡¼¿=‘ư‡»ÿJĐkWó!½Öï̀EÀË!îåkôBr¶ ûàÎ yĽµn‰¯ÏÜg0yŒ_áÔÙZ;ÛÙZƒ·lz´CË­ÑÉÎï_‰¨‹¯êV¿ûî»ï¾ûî<Ï/_¾|₫üÙJIZ¶–©®‚gó©´8œPl’ÀŸ=2®o³ÿ 6ỒæÛmK =wÀl™¾™«˜ÆZ¡!)‡~#û¿2₫ƒà)±8êVmÀ–ưÿ‡ÿđ₫éÿID₫ü/₫Oÿñ?=ÏçKqŸÓ²XêÎK0GhöçxbÛïe7ÎzÙµÙ5"B7|MÄ“ó#}‰¬.SÈŽö¦L¹ê´Ñ2 ²Læ<ÍY’œuÇÄ}t³e4R–Cx8LªTª4ĩ;UÖhÖx´‡„Æó́§µtü¡m:ÚÀÔtôU÷ºŸăDƒ¯fS„ñàd3i0;3° V“‰–ÿ—Ơ²&ˆØ̀)H ụ́H +Ơ)óbí=0Hi8ÍƯSg×₫詳͆YiŸÆ§6[×~·1Ç>v,́Zë¦[‘RgƠ©h¹¨j²Y«wu™Ca¹¢6›̀Ë8º˜!F]Hú́ø}tLCKµ©¥(!¬‰™bäăK×Ñ®³÷cwá̉g—)CFƠ,툭KÙsL[ĂtÀÿ«Œ1¸°’âéè„](,C£+aƒ£Y,H=ƒuæ:ªƠª̀2uV±ÿŒk°“SWC1#†å·ăöèaÁiór›±AØüÏ”e}“Sá8/Né'½ºk™ºR×KÄö#[Hæ9u(fœ/¯g°Ô^>ï̃SgÙ¥èRVQp2©N53º₫ C]ªß¨yâ⌧¹:c®û\dzcrÙ€ơÅÁ̉b†€G°r„¾¹W‡ÜÈo}àP/ªŒ¨ ‚§—ÏbË®¼£¾₫ÔăÆ·üŸÜ”ˆï-AAüOS½VÇ)º7q(iŸưl'̉¯6­Ë G;|m³Oi5ÜÈ;iq̣ʨÁŸỤ̀×Ă+ă¯lß,»j8dÔ’·0»©—Q†ÄAº«ilnLâÊÆ«»9@iÇ‹MƯ³7WX9]g¡!4»R˜bÏ4¶ù’ë“ə֒k/1=£fy$;¦-ỸĩÓ¿đô‹@Uë¦ÀPMI?[„fW]Â)̣ö’Ay)æd2×3 ¢¢$™ˆ jêLw“˜·ÑF·É\†#¨G6ÁïÇx¢eøs&L\‰”j­·Ûí~¿‹Èăùˆ̣ës™ë‡–Ö…ÛC’1|¬HVû†±œ¥ư$¦ø«Ñ…Úû¼Pyaá›à6aŒÀj ̀eơ`ùYa÷ÛÖRă¬]KÀƒÍ>>3 ƒûư₫ûßÿ~Ûöóy₫—ỵ̈_øäơοU\V†K;È9Ç]:’ÔÊ#¨öºă°D’mCăˆđ×̣é(>¬;ÀiCe¾€Ñ„›x™eÎY¥öÙ;÷2 NÍàó™o±m€™ë¬ÜÙzĵÖ^Á;4¬Nd“ˆ:l5Ă¹Ÿg;íñ́ÏÇùøèö8ûù¬!đÀĐi”(m¶}îm¶£m¶½ïk‡Kegä€Tưevû¤đdÀ¿ › +eßê¶—E ÚÊuV$•딩ª³^Œ½"A‡ưŸçăù裳›EŸĐ^V ˆỵÁ̀EËĐQ¤Œ9F±r ÚLe.lÔ¯¨j­Ö['“̣³§Üî°9©ơ®UDœYwÁn‚™ç ṚË7Öœ+]q€9| +ÇÚ³ºÈ+º̉-4])¿//<ëT(­9‘X€è‘B­3­¥\‡ é7ÀQă8z ÛI“úÙÁmùo¨i#œä,ÿ˜qđÿHF[×™_KçÄ¢t;éßœ'!eÜd«dĐl Ă,̉¦xüÇlD\! à¾7æÀ)‹¼ŸkÎidŒÈ½è‚bäg@Xvú| Ë₫¥DÔÓ‚™í½%—\Àí6•¯˜1bñÑ́!¯>¯b2§ºQ©ó˜3κàÿÄïU§₫G µ8?¢æÔ* WF{M"¼æ¥x¤Ñ1&2:6 7=Á ´̃Îó\₫íyγơöè6Û9Π̃i&«ø€‘HÖƯ h@x—UFª˜đÅ #lqËĐn‰ÜØG’Qñ¼–ºmœU!°oy¤_FIdRR„ Ó ¹¿*nR,0Xû¯8y5ÎÿÓƠbKƯw$úóÆIˆ°„Ín°‚÷-5íƯéÛ€H©fđÀlñÊÛVë\đô<Ü?uqDôHúíÖˆg2¾&WÉ«”xÛ¥]ñœÀr}/ƒÉépkÚ]Œ’èmufBưiỗÍG“©qŒ„O2>ă·Qf}çüä˜ä½<CGO­+G²ˆá¨`ÿ‘îGæÉn­kÑL̀(^`Îׯí«$ó¼K˜ cL©Ma³/T”4,áC3uÎè@1øƯe ™nèGl4£l2ç„è·¢ 4×D$t'₫ù¿üó—Ï_÷m{>Ÿ1¿cq?¤ñ;¸æƯÊĂ,Shí Û0<‘m?û7ïVo÷í~”ăVo¨áóeV¤ø%͸ÜÅAïZîÙ dιɶÀ³b‹¯qăiP.îŒnlsv;?j­[³}˜6K)[Ù˜ù ë̃ĂÖ¬ 8çGT₫À˜áàƒbä°ñhk߯†+D 0æˆ,98åÊ2YS'Z (µ àÑ‘Ö&[ë³F{Ö-Î  •1¤vĐ0`I«†‰$y_ßç!ö†—è0FPµAñç<Ûl·ívŒ£o}ŸûV·!£–:x`|ˆ@ø¿¶zVœˆơ±ƒƠ`Y&Sœ‹è°«P¡99xăÂåÑv~³yÔâbn#̉P0Ñư¶Ù"û—!…K™«῭fÑÊxV²Ă-—<ÆÀvDK' FÛ,6̣ơgœĉ÷%AÄ ĂËÓ¤d¢ux¿8\zIÑ.°Éăç̣ÉË2̉¸Ơß`kñ½†)RA‚e^O>Ûzël™Aïửßqí3“øxfæUo×íØc;*WÜf“ÍæqÆ̀©•ÙĐå45´l®#sQ€ÆoP€Đ£Óá÷S—YB̀°‹+ªĐ̣±®¬8ÏØÓ ‹ç< xÿ‘;F2;xÿ«-Ù¿gcäñHY²ÍJ ².VKæáPöáö¡W ·S—…Ón>3a)ß&ưk‰Æ»̃×ÔßnMö\/9Ë·À¿&UñÑüçpjàç”È–œsJ"ư'±odÉë—•ÖÛ9ĹÛFđÿè˜\c†‰åaØƯ’¸ăzmÁ‘ó×Ålá|½×]H0 çiˆ^ÄmˆP §^ âÆX²*€†µT@~äX†¥¿ÙÙ3¸ÍáM©ËuĐLφ“ }…Û®Ï₫çnÛ+m´Xj|iÄ]Z0_BƠ€æŸ^Í'Đæ{–-…o s { ó42k/©Ö}ÖyÔV¸äÉềëÊÏ)̃_Ư†;Ö|ûM*=Œƒm6>¡¼˜r:{&¸Ï±×2@`÷5öc™̉RÄĂÖªö̃ÏçÙǴŸ“ºzƠŸá̃C¼EzJÂÅ*ÛW:›Uk Ê×ÏOsS_Öyô=aŒâ5yD­¤uVM¬Đ˜l ¬èU7|Ơ„E~óR*YcS†Å¨`Đ²ñÔÏǘ¥¶ù´d#¯&€e¥-¥Í¥ öÑd7—Eñ*“•ßÛû³?Q,™H l·r³i/Ă8«£ûA\·ê(făfol]ë²isöb«pΉ©æKT‡Ót5hĐ8ÛY¥bzT-6̃Ƣٶܘ+RÊV¶ºƯôf®A½ư|œçù|œöñ8₫xœ-:t<ÎGë )f×N05bÙ]•­£o×R‡YfQc—}wûîíí‹|ưø̣ăO?~ùø̀±è"MŸsvíù(­ØyŸL¾†‰XZL÷ˆ>2,˜ppÅ1đ Tcî½Óy¡'»ï÷û~?ÇyÛnûÜ÷²oº.JZGž…;¢P4₫l‰Áüëxˆ́:S½™‘/"£2bÛ›–×·}iåA¨È}ĐV }…øƠæÙOGOD¦”Yđ]¦U_ĐNđơØM˜¶@AÄ»rA¡A´*=LQç’3sŸ×SK­³Æ’¶2`ÖRJṆ̃̉VÂ7&7‡fÈ” !AN°,ó¡—¥Ư\ßè%Ï `Ù°L¶|ˆ½½NÇ=sª€è”Ú›6àá°"XMê¤Ö¹æƯ’7?)Í´4ºvQéÜ瘆 $[ë³¥YVyúô1±VPG(k×I³PYó8EùGŒèZ°}@5^@x§XÿiÖZ'Mh„́dn½Ÿäµơ®©Ûb vÙ÷m¿í·Zêí~’³ØăÈGd!nœ¸ÜÛBÅLN²IH>cå&Hyöû7 &„¯Ïí¬]–Lx/‰¦gÿØĐ:[TL6K̃ósk3N‚O]°àâçÆ®3ÎbơihJf¦W7+&,´5O—_Ƶësg@ƒÉíÍœ ưzaül¹`ômđ́Fk½=Ï•÷ĂÇœX6#½CÈœ+–Óª‰+ÛÜ®½́·zCé{Ô£¹¦ å¤*ă¦Qèă¿É‡^jE·ødâÑmzºƯÀaƯ• npC8[DĐSw‰g²ˆ1¤æB3úqfÎɵÖÙçx8ê:‡ù‡ü‡Zë?ưøóÏ?_tÛ‰aÍmw¸®dê ₫đ³[Ù̀/8?Ç ;$ó₫ĺ³:¨ÂÙ- K`êäÂv́qïê®+3ÎéC6L6‰`xÇăzÁï¼ßüûsº?ûè6½kö‰ÄͱoSÿ\î¾”À°P1̣óÑ£FhÁ!伋Ùï)e`…|å÷2hœF?;"é§đ™U«‰¨~ôë±²… HFƒKq*ÚAûŒ!\&"Ö„Lܾà_.#Ñd”–)PQ Å5´̉ ´×©ƒ5ÛtÙäù×K+ ÷é%˜¹ O’ƒW-̣æÁm}ÊpơQq-$yM&Y1̀¼]ÉVÔnr•JLđ¤‡oư>wø5ÏL± %ƤÙfcb\Fỵ³öº5GȶmßöøG‰RÊÆÛ¡Ç¤9ÇlƯ¹' ¢m¶ÏïŸßïæ©< ư‡8k—ƒ„L:Cñ“·±°|ÿéûú÷ÿôĂ¿ÿëÖîñKm@fdÏÈ Í˜æ _g,K›R„é0•Fê½`¤D "̣Ñ•¤s ¥ăç1Ï̃j;ë‰Ị̂±øz«·}îUêĐ1yV®†¿†{fÆÉˆH–Dª₫ü,Qk‘Dª ĂS£÷Í/#`Q‹ÛÇ"$ç<Íï™^ùÜŸ1Q.“Â:ùÖ̉x»ú`0‚B±°@^JÙ k-„Clăˆ¨-³L%-R,J²â₫[¾ erÆ' €9gç^KÅñH´¢P¥âfª[©X"5¥pÁ<2¸YE/,,íYôˆVÀ•ù@ï‚ÿS·PƯËŸ’ Æ Úhé§Ùs(I!ÈC‡A₫3u8¯`G¦ ä́€}L¦!ĂF2‚̃€™¹ØÈ0< u«³æØÛ2,‘«Ÿ§=£È̉‚ùçĐª÷ÔÈï6ï&qëÍ%:ÀĂÈ?f¹SYŒ>VfyôrSươư•ĂÀSÚë~;n° »í·̃ºégœê².`Øp(œèAÛSU!Y+?wŒ}aÄÿ¢̉¾ \Yë¬æˆ}ÍRVÙ°¦đĐ¥Eœ=:8Áv±c±‰mi­ÚWZ YVèbA¥Óû0ØŒñ‰.”ŒË“xµYŒ•ÿÉ¥~ËDg§xYÆ%ư›ÁCiúd–>úó|b¬ †ûb¬/$j‘~å]$ˆÉF“a“íc¯û­̃ư¸m74¾¬(ËŸÍb5ñ‹á+¼5¡ Uç§`ÿÄ‚×s!ă‘{ˆå^\jÏÙ‡üDU¥ø­SµúÓ§R®ƠlµÔÛÛmß÷_¿ü4́u»E¢UȲ> KÍ„r÷mR.,kWÿM)9ơ<>бÈSË‚ja¹.ÙÀÄœëGJ³ù,eAÑ?¤?âƠâù¤áqA_̀Ê%3 @£‹sÿ%ùü敱¡µ1] xá Í 6S!i€À>3đ(¢7µBVTo¿•ôGÑwƠ (2áƒV¹BC`ە뱕j¡B“®àÅ̀« HÇ'É·2̀?b,â\³€]^ĐsñØ̃’£!̃Ơr‹%!ŸxTدç½W¨~± 2I¦ {l}¥¬¡Qí³?ùÉĵ×[¹YK‘7rÎ¥5%ÅTAQ«å¸>@—nC}øKåJLTm'/è' 3đ™ûÙN}"³­€˜{Ö£˜Mx́ǶÛ,^«T̃Øat>çc̉<ûùVß>×Ï轉–lƒuêqëf™°{W̉¢̉v₫" mÛöĂw?üă?ü#Íù—·¿|ựƠ>È<­º€)ĨQfk0:•QlD‘¯O  Áeh ~†gZÅꉓéà“¼đçÑÜ̃½ïg?oưvn'‚ Œç¬ƒƯÿ‘Âá‹ Ä͘zôôă¤y¹¶’™xđ03Ó«WÆV¶Êơ£R£ÆÄ\yè8ϯ—V€²bŒ4ä" sơq"Ö )È’/mZLüA§\ßzưÓPj1yñ´Iyäú¾bÏ>́"’Ǧâ×^wUѶPYLPwœ‚³ˆ”QâˆĂÑ3‡ăKîsÿ_"v“[M²Ÿ—W` ñ†úè/­7øË>“ØÉ =Tí:…ۧP…‹5$'M2Ơà¶@›ÍMÂBRkÅ9YQÄ̀àà¼ÁW#)©i9^yÿ̀ä‚X•I>1r$ZÙ 4»á²Â;EÆC/fW7t£RˆÍße ¹·pÅ™:Á’çéâơ9£A_}ôđ§ˆal²^‰́?¯Ê4?\LNSWçÛO´²J „Ïш AÛư¢̣M¤ºü3̣¹¶¶Æ5¥S]`VD¼…b†`1X=×ä’ÉO®ưâwª[?Oâăđ¡*/à?²Æ ‹Äg|ÇÙvlG9ô¡__̃Ïwp9ÎsFÍxDÚyOYB/²Évlǽ̃zÜ·;²ÿ}Û«Tæ üú ̉­ˆ%ªd~n—~)­èaÿÄ?U¾Qp@êQ„¦1rhN^,±đâD‹E;urå"ẹ́Ú{óL@‰&™Nztø\“ĐÇăăí́g̀o½¼ØiÉl½̀ô3j/û±˜Ư¹×ưÅ©)ZÑyËTœx¾«Â °¬³Æx‰1̃.GkÏ₫­¨đÚ>O󈲟Ôu†q Óçóe»‚1ÚtÈ?Y‹Ïƒ˜º–À̃¥Ăọ̈Ÿ«́\ƯJD"B;ÚTaDUª”„ëđ…óS÷™Ix­tX_Và7Mȸ“=b×Ôøă©óÔÓê’nTl9d;6f₫úù+*ä^^ØWrÏPƯ)x[ab:ă"Mb¿ä%#¶@Ôvṇ̃nđ\Náů¸ YáKM7nñxm³U8iơL}o>Î~âƠÍ­̃Æç8!Aú‹Ü»‰Â\— »`Ylu‹đm~aU•:í²[ϪÔÊƠ¦’¨@̀5¦×a<$Ø pË)e›[*ç6Ú1°N?Úx¢·í¶¨!áđÏ€¶} Çsè+–%9`€t¹B¥pÙ뮬g; —̣,•ëGûhÚ¾ÿư÷Sç?₫ø₫ñNLæ;éÖ¨¸Đ–†çxØV¸4iÑ €-ÏœsơĐ½“ Rܽ¢æÊïç Á•ä0_ä©́Xm3ábp00sŸÉĐ‘›Xđ›n¤DÅUbسJ ôØđi^GÁŸ|\Ă“*v:':¨öæè´è@è\̣Œt₫æZ œÛ9GL“̀ÍIÜÈűÀ<3$̣Ñ@ÔBÄ,$…6ç,T:u®̀ƒ­ 7&:?–(äÄÈë^üĐ‹c4Sö#yà 6¯à7¼Ø»aÿˆEëpU;Mm”,)¨"̉Z³ëäENE# ™HÍq=fo༠û¾£̣ש–'²~‘#HÆL.r¬ÔDƠùøt'óW 7S¬due³ũ²ă§ŸS /ă°ư‘¥ưµ¯E–̀—.4³|đ-¨+ñ‘ ¬½©)/ç˜Zá InE‘U¯3Î{›‘ E-d, ¯¤ 1VÇL̀223₫]æLQrgt«Ùzï£ß?ƯÿƯ?ưă÷ßÿ—Ÿ₫üëǯ_Í´ºÏ₫mÁËw€cÆ3 å¸m··íí¾ßïÛưØûq?ö£reb^C%ˆPdmöỢ$߯ ,%9y{{Á₫#%gˆŒư_æ5Đ o]Æ·c#&([Ïdz={·vz×₫́Oø¢ ¨ÿë?ư_JÜ÷’Åú§Ñ?Ë|z»Íö:¶#Ä‘†r@₫̃NWUäÓvØ=+eåưY(¸ză, ˆ¼?̃Üæjơ¾F 9­?ÖÚ́ÖGÊ6e­7°µ/ƒ;0µWmZºC|É_ÛÀôçöN¬%C±»ưœë‡–צ₫qJă+­ üRæƯúívx9ª̣ÎÅ¥,¬S@—Ï¥P?Üô†)›_Ú¨ăÑJ+\0ËÈBRírE‚̀3›ÂeÊŒûE´DĂ3)â{̣äWü#nº:5ÇyÔÑ¿›4Nä$˜©´v¯ïÿØœÙ÷0‡ÂĐ4›x\{ÛD„f¥Ÿú—?}ụ̀åùxö̃í˜sneĂlÓ°º̉Ùj % LU4Ÿú|ög™Öרï¬\‘‡aü!;«8Ó½2v%,]{árösÛ³?vƠH¢ÏíùØ@Ưö,¡l#¸)ï œÊHƺPN³)D‘×b¦cn˜Ó(W[I¹p-u´!$đĐPÑÿÿ~È|<Ç#¼&m_ W»óÊ:t<úĂp¦åƠ´˜iÖđÚ7‚¤8íÇ6¸‹}‘́F ßoûÖ·/_úÙs u)́Ég¡Obæ®]¦Øö/—eº34ºù>.0kW1+RczÏmƠÎ¥¶‚Đç[µpmDa€ÿ¸e:Ø~›ü#ư« "ëúNăĂ" D•N’+:”lD´ÚígoXEˆƠ‹5eÂèÖđdT€½w‘5dô7]Ăᣭ̀Iv¶D₫ƒC2ĂóÇ™{;¹ÉœzDÀ%xˆ¥ó5²ÿ/jN„ûÈ8­.kXAÈ ‘Jă‹w\aH›Bơ›…đă'b#|úôé‡O?T®½u¬^r—8^:È₫ƠÙçø'KzÁ fy4 %©KMm¨ºs˜Ê©Êk Bƺr·Vuûη…ÇF.’Dre¨)Á]&‰ñ_´Dq”I3€ß,áp¬S²ÑgµOí9ª©?zJú¡_ß¿́oÛ×çׯç×₫Ñ©cJ$gÖ×â×±èˆäU*zZ̃_ƒo¶}«Æ¸°í›vñªÁü ă¿"ȯ„5ÁÀ"«TÎv“¼"ÊÊû)»:zĂØÆ{G®V¸öƯ³?QŸưœmb÷aÛ×Ùà̃¢7À~V~ög|œE0ÔB̃~Ô~Ëbß%đơ¦7')HÀJÁk±e éŒØ¢PöËæäö®Î.i‘Ó{îŸXPÚoQ}‹¬¿fü†ú«U,¹¬µ‡®—=~3–DŸ¼Êv »¼ơøSŒe)_˜̀Ú ©T^`₫̀eđDơL‘ºÖ®ª9\EƒJ³ §>ÎÇĐÁÊư[¥ºË©ÿ6¶đq70Æ\C¨jbơGÏ?{?Wи¥­§hkh³:y*ó±Đ"˜sZ‡]\â‰ï5y´{/É:!•đ…¸À¿T?ă%PñƠ¶Ù´A¤¸0øĂÈ”6[.­zëÏ Cr1@""MÚÙϽ́p܇5/¢ŸUH÷-L‡]ï6îŸCOn£.Ï₫ü8?öºÏc¯;@4 0+ºRĐp¿ßîđbƒ<à<Ïó3†óyÕXÚ_Uêèă1½wđơ·º‘û‚ơñ9Îđu»Êª su⣪6ZªY‹³î£?Ù ÈḤ̣" ‚äK·ÎzÊù́Ͻ́G?ö²ßöÛ̃ö½î·í†Éhˆ\6̀w 2ë‚‚4 –gàèÛˆée± DBÀnJ.“ Ûw¨\'Ï{¹w·zßë3_v •ƠÚ&¸’¡ƒ›#ßb ÇSΦ‰AÔ₫²SÍMë°»qÆضØÇÄÂ[ƯX¸5cc–Ÿ¹¿8t9éŰ D>‡G½Ñ¶ˆ\W‚Đ,Æ9µ¯Ivù›.{†ôSúM‡âçĐJ‚yîußo»°%(…d¯{ä©“æù~ví;m·z›sz Ÿ¬PKỢT$=†èô4œ™™6Ar#¦BE‹9bÍ2C„m Ö…9±ç ̃¶=å¸{üMÔ笫۫î>dØÇ_ñIÛ¹µh́U>sºñ+/ŒíŒˆ]9åsï14zJÈAEdôñ ¥"Áu‘ƠaÀa~Ä>¸ƠBE Ƈ­„¥³|]¼ŒÀ®V}†ñ´´£Í†Åª3+–بÊkî̃r}’sñœâ&à́“viA°égŸư¶ß~ø»îŸîú¿üå_@<`ŒÔ?ÿ²1«e±ásÛ‚Z,¹˜q‘r;no÷7„‘X0Hq‚úáëÊV#ưÂ’@-„t́ǧ·O…Êăăç%άdúú–F­pXf̀.F¯˜ơf_Hß¹.Úû¦r1j'dÿF~ˆđjÙ™'¯…€!ªqÜ7w„ÔÊ6@ÇÍ0( ¾sẦ˜aä6;¯!_¨á•4Ù¯‘¬·µ¢Î₫ëóW₫™¿||ùúü ̣…üù6,îđ^öïï̃¶·Ûv»ï÷‹…´Ô°`eÈ ,ØzV9{.2º¢₫xÜqßbƠYîơ‚8µ£ÿRD§§R6|́H/xj˜†Î,¬E[oïưưÙŸç<Ṇ̃Ê×—͇%€³g9€jÙq¶y™äß8’@‚ œ[j6©)µ´ Hđ́ơ|¼Ü•$QÅ·Í5&êœPâ7Ơ>1Ä#£₫₫cyècBB ư‘@Úg¹úxæ?'—"Ÿ’€;)— •(ø—“OøüÊê¯Æ¸¬„hV¯́Ÿ.ëpí₫«¾%Úă”(g‹₫eÔ6«$H-¦ÿFgưü‚Jß) b£°^]?œ+£ÔRgI†‹]¢´ Gº ‡Å¼w"éËT`­\Á½”t¼Zv(ú7áÀ/Đ0â¬]‰&-Àœ¬%ë}»<_p(ƒvÙgÿr~ ²Ư­̃ö²ï²£vÇçRøpùç2ʃG?åyÔă¬'`rè\¡èơH0ÚÙÎsœöx6+Â;9®3˜¬Üy/û£=öç₫µ~½í·­lŸîŸư€ÏD€k©s›Ç~ỗßîoçy>Ûóñ4ÿĐgÚ¨vÿª˜“"rñˆAv’yKÄS眷yæ™ÚÿP½Û™Çbäû4.bV́Pp~G®HÇîk¡ÖR+Z̀CIG<½Çă5–¡J¢"¢S‘ˆ++ÊŒ ûá HƠxɉW#́ ¦P±{hĂÇc»Á]êJ’ÈkCx)´² #å¾R±p̉hc ä ‰đĂ6¨ÅÚ›se{+¦¨̉” ŒaÿL$„¹ J6\Å’=6SđÜÆŸÚq-2l„uẤa¤T©SæœÓÔ lV¹ÆÉκTcĐÉkÓ9‚̃L/3Ëê-ÆdÚÀ–Â\ä¸ß"EˆjvCéPŒÂ#dÇñ4-_aOñp%*Rj­ooos̀ÇÇ×Û{§AAAÈâüĐzÑȘ®ª=Ûç_¿l¥öÖ£ %ë*$È-æô!9&́5[f‰ü0ê‹ÆÀhi×ÏÑ»Ïüº™ÉR“|^GFë#½S8ªFḮGJ8b|ÀH#e›ób\{aJ£ÂcJ¤ûfS¥Eêư\U“–ún­g?›¶sÏñ„ư4̉ô83Ë‚ƯdâÓ₫éÓ₫é¾ßïơtÓ©̀e^î¡cl4‘"Û[a'<=×₫3¦ÖJÙLK5ïæŒ-B`¨ ö}ß÷!qúÄ•Z+1í́­·Ö"¯}¡°c¸¯²¾½½1ñç₫ùKụ̂hè ¾”I+Aă‹̃ơ­̃¬Ø ø€ n2c·Éh ½9 ÏB̃ï¬́SÀ¾ö}mÁ/¯$BE‰ üR×F~áú»Ú>[ Z^³ïưb>™Çôꤣ\Ơ»¥½fÿa_ædÔơ+Ùt†wg˜ôg¤eÿñ2›(̉¹x‚+­/i5ñt— Uê–9̀‹ß‹·’ÿFđ_Í9Ÿú<éäÁÀ“¶²Ơ¾Îü‘& ¼ —‰z> S ç_®’@—d0|„ÔHcïYN ¼ q¿aa™4‹–?₫ưăhgụ̂ù V¼!…~t­Ză>̉‹%k£z ¸{DRç8Ë^H¨ik­V¥bí¶Ùµè µ̃¶²=úăQ·z{´GĐÑèËQt?‚Ÿí=÷Ñ ́?ÇóÙ bÈhvZŸưÑxÓ¼î·c?¶ºƯ{̀ƒtíÔ½î·~»ïwó=Ÿ¨ĐyºR ±($°›̉X‡‘]‚9ç^v\êÙΦ~Ùn!ɵƯ,á¯L-#x„¯33Ü0Ïq‚ fI-m×U>ÄÁç8·²=åù裷ívk·c;̀­îg=Á:ê»H¬£q¡A…k©04$ƒ‡ ă¸hƠÊƠz©‰øW‘Âơ g! ±`œYƱê˜xèPѳŸ,`´oL¶7ûè̀Œa[́₫÷X ư*ªj}5ǧ!CTX½W½á¶ƒÂa&­̀}ô*5¦äªẹ̀Œ“Yf‰§™« ËƯƯ ‡4Äk#Îø`_ĂW'¡PL«†̀©Àb$%ÈT¶Z}(k0Æû¢ôȧUX¤Ø8^* ,剓®ƒ]§^>>_¸LS§uT!œÀêÂă³…-Ơ ‘‚|8Ñ^÷À₫³9cvö>CÀÿ@_NÄ]{ëíÇŸ~üüñ™…ÏÖz7ø?n©¸̃¦f‚xLơ£Q¢–Åù® Ôÿ9gƯªN…ăÙº')Qªn†0#ÅÇÓÇûÇOăÇZ*tqÏcPÀo’ƒ3q€¡ñ¥ íç[ׇ8ï‚ ¥>_"çâqœ¯:3&éJÉløH:•Lw{<£- t%đÉƠ‡œ¼₫3Ñư#ë"^?‹¢}GlÿuCöÿv¼Å¯Ëiñv|÷5By?ˆ¬˜ï‹Ñ“Ïy †nj,"¦[-Ç}»¿íoÇnT–JSK¸ÁÉw!?Êø\/Ió²ø”ơt8)S§PæªI3éq›‹1ùʾ!Q&¥9×h”9çó|NH²G‘×s̃tm´så(ÿđÇàÂ?>l¿´àÊ"¡UƠüŸ lĂOb#÷ăFíeß¶-Rµ¨µ"­´Ửđკ8Ër׿U*}vhđ¡¦{ó¿”ñ ûLj÷Zn÷[Ưêăñx|}|}| ̣ÏJºhåQ2£₫«q2₫Æå»ö‹́œÏøi“g—»#û·; ëÄÉ!=§ơ—'Âk ÔpÔÈ^²ÿ@2~r0ưî‡Oÿ¦ Ö=vw×~ÎSÜ,NRËÇ­8jmâ†h~Ë,ÙNèđ°éneöJcرJ àÆaoº—Mđ†ư—ßưƯï~ø₫‡¯_¾₫úë¯Ö¾“Ê­Ñ‘ûØ₫ÿ«>Ĩ´¶Ơ¸hY7•p£GDCÜßÛM|©cÙă¬RỴ̈|ÔÚv·~»µÛÛ₫v7#ím;ĐÙ„¼ªl”g;1åÎ6ç81e}áCc¢Pzyœư¹cNÊÇăÔ …·j!¬r•Mj©c·~k»5pÏÓ¢98ư`dÙ"“„lp/†àª•Xœ-óStWZmÆwœíœg4LÈ©)øÈ ‡_V›éµ5‹E6ÚÂ_¦4nm´5‚­_ûpđüÜ*âàg>êăèÇ­ßÂ&¤ÉsœànË"Ϊ-κÈaÎY¥jÑíØö}§IÏó™—\h¥ˆi£ëE¶t a‘n'.:K‘OXŸJLg?³<1”.]ÂÔ·p²½€k¨¶÷+¥Ù:Qà¾IV®¥Æ™ÛÔ&î̉ỉàë$>ÔÈXt€IDATÅ-†™£Å{FÉuj&Í}LZÿÇóy>Ÿói&׳ÛÇ—+óͳÄØM6|ñơØd´£BY0-qê\ € S"'ÇĂZ䨋̉¢û¯D(¢<ØPl‹öeZ…X<-ĂLç0pâT́pöơóѰø,T¾_÷ÛfË¢4z‹œµRµ_6Đ¢ €ÛƠ`fóíÍ•!™[BæùÙ±¯,˜ê°è₫/#±N…ô ‚ù˜÷np¡&àß³)uVU°ÁË,Zơ¾Ư;ơÇx¼ŸïËÀ…¥G¡|ưÿơ<6Ht›c?Ÿ¨Rµ{ä=,&\l~qđ •ÿJº4Ӝڧη? 9ÜZl Œ†;¿ŸQ,÷îbçN‚å₫ñ¬ü¾uÙÎa)£l²Ơa‹…÷n¯R묅Ë(ÆG¥n=^|[ÈÖB!ÖS0rh‹ca"4bÂyÚiDÆ© á̃̃n?ü₫wÅIápbÄ$&V‡D#/ö¸É%u‘#m±4/sÙ“9ûĐÙè7Đœjç̀G\¦>{ăöäçÖ·Gyåx´Ç­̃ưyowoĂhäIµAÜ(Bb˜â³W_M*0o'Bsë ôÛq«bî{†y{%`ƒ HĐÀy´̃únư‡˜â»Aîªđ£S„“‹b¯¡ œ ŸvnĐ6: f¯ÚÍwRf„üs;±Ħ”Yê¬ç˜Y‡Fë|Ih„óIl¨±#I—ñ|“—X¼ƯeJV~Ç̀fHÁˆ®UX̣oaÑbfz4غ€·söÜ_D ëƒM2£F%ñLáÁ̀ +[éf¢2çb˜,ú8[@TL0íô°~Áiär8ÑKBïÑ•}̉¹AơºæT\îIȈÅf Ä3‚öCDÀœœ:©XƆ‡eaÓĂ‘¥¿đÿŇƠ®đ †·Ủö8Zp»€ø É äFWG…$ÏƠ^rY[è¿£rÿ¿:¶¹ËŚG˜Àr8ßó4}ƒ))²ưkáÙ¸(á‹Ç1ºë ärÄ®F¢çnxLQ]²4JỲ‡hÜù8§8kăư­¢ÈÀ¹û¸¯5æ@f₫#bf_’¨iøiCÖC¿’ Ä,D—‘†Kæ̀zuÉfüD ëåd {iØæ”"R%¶[ê%³£Ù'ÈÍaÈa0fH?[í°xôÇ9Ïsœ¸3¡p@Ä çCâGÜê-~Á¸&2Z£…¶$ÍƠí|!V9Ñë̉ôÀ¥ÎËÉKêŸ[ÔlñÄĂ:³T#¹™`‰XL~öàtÂ] ‰²Ñ¢úù́ÏG ƒ™̣§¿üé~»?Ï\)½ô„ĂÖÿ±Ù7Î`†TiÈ- —C»æË›+Ödö¾ˆ-ƠÄSçè\/ƒÇ©1H4~̣׸3¢răÇx|Œóí_£¬ÅúTöEµ›(R’¦^́KɽÇó₫8Á׈°4–oI>Àæ›—í26†'>/Å·¯ê™j¤O—â{R³1&}S̉ÏKÍ á̃®ú8Ÿơ­¾Á@æ¿Y'ư÷¿L«>n1́í#%zÅЇ5 ™ƒ/73ß;϶c+Ú4—P/ǾؽäÈVŸ½!÷%í£ê5ú(_|Ü ÅNúuÛù¡UqA˜ kjôXy¶9û¬RAI‡…Ÿ’J·dg *̀rjÜÊ(ý}?Êñ̃̃oơ†Öç}¿¿ío÷ă>ÆwG;8\ÉÙÎÖÛÙÎg{~ÅIAÛmï;\“·±á²·¡^=“ø[Dºo?üî‡̃ûŸÿügitMQ1R]eư|ÛÛ|êyùÓ©ƒF£&>#"ÅèÛ²óæ ôµ UQÑB……ĂÊæB?pŸ³ÙÆœ"Cˆˆ+ódîlMaV†́Mv́bâÁBRæ¢Zf.uï'+ÖHM)ëLk7Á\[¤nшRó5J«'₫̃/©†]”™·|<H0ˆ0Đ k" o ëLLƒ&O<ØähˆTàÿ)¤T¤€Đ?D̀²0r >× (ê,±K.ÔÁX:~Yüo˜/‹Fp Ú•í·Û€«ưü FlÆ€đsInÛ¹# ëÔ¡ú]¨"rrÇqQ@ÁŨg'SøD—,ÁMœ×âLe¢í•pP\‚[!C³XƉ×3Yi«®8<Ǥ ­gàPC–(3o۱ǜ³Ÿv4ïe¿owĐ~àđsl‡ I,&8:JôíóÏ$ü;¸«/ÁÎĐ“8*ËKÀơñ¥\˜èº¹~:;Ÿ*¨Dl¨”lÀéçă£Ïö|´ÇÇùqö3Ût®t?h)æ,÷Gxm>ׇÎ_f^H{Gúöç߉…åJäî–yr¾ëÚ¼¬f F'×£è-_6ÚÚm‹Àƒ^K­[-µỗÇăù´.'«±_>Q¼s|•cŸ¦)Ô/±·úóçÏỡ₫aè0ëmg3xơßT¤*®qÓR" u¿ÊѰa /nT‡†¬§„m€ )i1:₫·îœ̃ BÙHÔîÅÔ¿üùÏÏÇăñx<Û3Ä”9dDÂ1u‚«̃„ơùA+“íç¢ÅÀ¼©° UJÓZÁGtßî/R+yû„H,Jrù5’̣§<·¾¡ x?ßQ¼o÷ư₫v¾Ư»1ø· ÅÀ.ûív›ĂœÎv>Ï磙~÷£}M¨Ÿ1:'v#®gèb\‚c;êÓ›øE"à H‡`†m&̉i>•cVVÁ£”à!̉jªps7 Ö´ơaÓÖ°ê0 Ék¨ß”M7ÜmPvÙ·¹¡@=‡UB2x± s€ư† ¼ §ÛÉʳ̀*…hf¯̃´(m´bw´ªƯPÙøë£wZîh¿”YZoO~® ;Û!¢ fa+현çáK@BsL|.fæaÛ(L@lvX“;YỮg‡-)¾)½Ød´î’ĐadSv– N4‰&•R0‘á÷sv£\Çÿø’¶R>WÇÏ­0ÆëÈ_5€Û7åSPAÄ“¹2±¹LX̀ G4Á‚²È®Œ·ÔDVÀ>(ruÏ¿‹W•.đ°zÆƯ?À½=Úà1¯¤Ñ†z*Eû4’6е×ÇyÉ{ØEöê £†³5xí·ºå×̣ɯR¤”Rk-Û!dØ¿ºÅ“’N »¾dm©Û4Ă\í £’¼̣‘PDƒˆÂ₫!™¨ÎĽƠä±(ÙØ4í#ö™4ÜxCĐñ/<ZL’¨?cåDê¿c¢:% M×äxÙå9cÍLKY%Ö3%á;¼Å2 ¸Ú_)á°‰¼KC%L⣠VgƯF8 &÷œx™đw4«W½Ä-R¶}C…¬M™øVo6§́öu3¶˜3 "øj¾®E‘I/ù§QTJKƠœ̃ôˆœÏ$l ̉ ñ‹›ÛÈƠØêazcOưJ j>~çóq>íñÑ>>ÚLQÛhØ«₫HíéØGPzΉ}·JD!Z«-S;= J&ôËRàX«ĐgỤ̀N?;É3¨ÖØi'̣~@Ç YEưÆÈơgïzAkS¡2e¨¹·˜"äæ…z´Ç#â™û~ômVØO Ÿ|Ê#Ú¤b—\—^ÿîíï”´†2àÑç<1ÙqÍHû·„²²ả<Ç)C‚ ±Ø¨/º4—‹e²…~¤e:>¥©"Á5œÉAÈ0’$$PƠ_~₫åëׯ£»_p¤)S†Œ¢¥h‘¹¢¹L1Ï',­³9¼êÓÁ…¥jE”©T™9œ!C E™˜ªeÔK6¼hŸ>Æ ¿̃îo·ư†º b₫襔ºUgÛAôë<̉ßÀü®O”ÑY’@ṿ·_¥DË»ÆZ¾Áïb@£Ë3­à̀Èoh¹…,C¹Œ(¯› ö¬ëPẶR’Ư§½g5çdêÓƯ3VºrˆK8M‰¦¾¨É$¤kÑö)̉Ä€«q'₫!5?nă_é«—Ñ‹~Á'à[%›æ†ŸX¤€6)* « — Ïʽ́[ƯPIZûÈy)Ñ™OJ^/­&U)#qåG̀ kô*4' NÁŸ\êO‡‡cêU¥ pr´ơ‚–Xư¡\ÅÙALøèM5"&p)_é:/] –ø₫–V´̉Gn(«Rÿ-7¯ T¿»}Í—6ZÛÔÙç<Ñ ˆÔ*÷Â₫;Sÿo_Ö[˜§¡ÀUÊ’ɲ§X¿ÔX˱âе»05ˆ₫NäL@4IŸư|œ¨­£zĂ1ĂƒA ˜6N³v² xo*¥ØdAœ´9iI§iîǸÑëR÷ÇßåfuzÀaMMl‘ƒÇIçs< —½́û¹ß·ûíy»o÷OÏOŸOoÇÛ§ăÓưv»½Ưoæñ¿ƠÍhÊvüh½µÖçă~?Îg{¢g#Ñ̃û9NÎI±N<Û3¾ÔRá' Å´Ư¹ka‹MU¢₫H眣£Gû̉̃xSUë»!jO[ßÓM`~jrăÄÄxĂ ÄË0U*Λ:«éÏFï‹™÷}¯[í£Wª]ăaï<›5pÔ8Üh¢°vD9Ïq̃Æ %ÁQmn!JC(A€.R6̃$I'Ỏ{ÿxßëÎÂ[Ùæ˜³ÎZ+YßÉO #"̣i L.0ÍG/û¹CËv[_Ơ‹Ùk&§ù£‡mB§HĐLññ…“0R̉ˆŒpË–2‹ éÔđẦƒïo÷ư¾1>ù<úó²sG­²d‹́ô-vơ˜¬I´῭úI¦ÑÆÄưœST@ư3=@ óD/ ;@Ơ* <,Wf›´µ̃-I]ñTârí»= /",hQätëœ0Z^y¤ådB‹ÔDR¨ZOĂæ™óÔœ X¯5¬úİ1|ä Xï6ô¾1FJƯÆ”™E£<_ù–¸·A®4lp^ƯöºßÛßư°ƠmôÑ{_§lqø¿” ĐÙƯç‘©*¦P[öÿÂñ§“ơœF•K– ‚ªç»Øád@ŒƠs®̀U=Ôê+_ç²úf‘ §ƒ c= bók_Ù¿¬aó‡â’Ờ´„Am¸4n—Ơ3ruÂu5³ưÍÉ1{ë̉o²=Z5M^ʬœưQXÃŒÍÅƯỀH*Û1S¬BĂZZëâú—Kå¶.̉×aT¿k!)ŒÔ<²ÇH›ÜèoŒ#aƠIJ0댌“™Áó¹ø̃xÀ7¼V÷¯Ôa&HÈwÑÏÇ\÷óư£€ëC'F­GF¬0<¢Ø=öc/»¿slö( ,b# ±&±ă®ouí¬O(5(@ш>́¶n‚¬áï ÏåN¦[º¨0ÚLØ´5r_4î| î}¬ê—" eŒé¼0û½X /âÿ6#äƠm¥N'ÑoÆØ#±Ä¿ù"Èx¡ºÉ+0º(/ơyJöWH'—eúÖêYÅ$¤¥~ám*iƯë·:öºP=Ô’Q³=é25Ḱơox©$üƒ>ˆh—~^Æ-ûoZF{;ÚÙ6Ö7ơÂú´ˆ¼àlXt¬Ë¹&GDÂg‰ăœ¢i•€u*øÈÜ#4g6ĐXôb¹k}$Ë ËĐÊéùMỖ5ÚÈ[r!&.µS'"”ïíäÈ·çÛ}¿ĂùÓíÓ§Û§·ÛÛ§û§ûí~?îÇqX#~ßí¤O çóùlÏÇù€NàÙ}CŒ‡çƬ›±2¤Ô³ó5G$èh[E^́ c8T̉cŒ ªkÑ'` ",²¹EIj5†ÄŒR`'Ïñ„<@•Q*Z° ½0mñh}t)ŕÇ¡Gô£·qĂ; "›¯06Ǻñ‘’·y¿ƠơlµơèµCŒ;e|†„́HApsÀµ¨µÛ¶Ù¦-ªE‹Ú¸\ñ¾d´œ&D RRêÄ´Àu«^ 1mqÖ|RV[¼¹ˆd·¨·Ă5ÀđCQ˜™O:ED¦Œ1́8ƶ°|zûô»ßưb€/_¾03&³đ°ƒ9ÆhôÙË,CFͨQê¨Ø8›ĂCJÙ''GØÁj_”L •-÷²ñ ]‘LD™§m{vGÂü™§₫ª—Đ“(d½®÷"¿¡=çÇGûˆ́¿iĂDzT5ƒ ˆæ;DøsËÛ§·½́ă¸]È5Í…V¥+ÄyÏ‘rzỌ̈¢C˜%™$,u«½ỡ̀8äçÇùñơăë£?büöʵ^H>Ù9Öd.‹ö®/†•êÊïÙ&×üÉøèE²è:N]{ÍơE^~‡\pçHÂp’¯L|ÀUÆÿB₫ÜÇE.•ôcqñ™•d@Đô–v$ưÁ$´È́u—a—Ñ+#&÷W“„™”êt÷=;5ETuÓ G¯NÅü)èuߨêGÿÀï\̀X₫ /dWÏñJJ‚ÀP³eµ‰læâœ)8%Ï”‘…‚äJ̉Øåg‡ábÓă2Øqd¸)‹JŸ½sÓĐ*Ä”ñÙo°‚{ă’‹À."¬‘áÛ{“>ÚjÑâ±U4ăùè÷ö~œÇ}»¿Ơ···ïnß½oQ  ó~;nû¾Û@ÂZ·mÛ½÷̃oVfíï_M+ÜlbKp™°LƒÅq<îIĐÊs¯m1Ú½ï¯É Nd̀Æ>ï³cÈ|å ¥¸«Œªnu3²àm´Û¸Á1í9Æ-@ñ¨Ø‡QƳ– hêy>IITª›l·íÖz»×;øưmÂbư/Ô¸1ÇCèÜú­m ÅÀÖ·c;¶¹…¸…Ù¼_ŒL^89t }öQÇ6·Y§ªÍ¢ĂÚÍ“ÙÍûǶ½/tI"RêÚ#” %§9ípµ\·AD²èÚNF²ÙUuÑ,"œơÑc¨jë­KÇ;h×ÇÇLaàø%,öƠq @£§̀>z/½ơ'S+ ́đ9æ±`¿ÈlX!c …)‰TK¾3Uä́Üú°Ö6Míï8@o¤¬Ïqn\.€/SU•"¢‚̉m¬‘ÉØ‹‚•Ơl~æY"Å¢l< „ñæWÄö|à-¯×>FíóẲ”aÇ:0F…µk-U `Îye™?§teá8Û¶éÔ¯Ÿ¿†4Ỷ_ æØÔ‘"Q!î-v‰éßè2¶rØ5`uâø©p%‘>jzĐIøË̀ÿ‡¿¯µ~ùüåăưC̉(w+ü¾i§,³ó€6yÉ‘ú×4 lydë-ưÖÄvCäXĂ¯é³NÅÈHĂ₫#¹ñÅ¥9q;<¶ ‹€ư‚Ưûbư § YÓ„«;~fR­y;®ÍÈU"ä"›l[ƯŒ\Z ]¥u•…íëÄ×đϯ“¯œË®ä ¨Ô–DƠɦl&3ïgbH BÈM\é…œ LéÁÔöñè°ü'O®|+·º×ÂêÁ‰‰j’t˜x“­̀Âʈ$JƠظ!°Ç ·˜̀*¯`”áŒ̃¶M\¹n´ Æv¬H k­û¾3ñóù<Çù<Ÿø8__?Ï₫́£Ÿí¼8åṼ÷s‘ß@p1ú¸ÈN’ l,¶Ø•k/#ѧ²´¹ ₫_…m|,1¾M¬¡o­÷0Ä0›Ư\7Á$’̉*¢±»ˆ€¹6†WüŒ’-VơeOoPÿ"G¡—+9ˆíOnaWÏ~f‰íÊÉp'mu›‰¼£®·₫fSZ‡%X†Xÿ6×⟣̃ÀEg DĂ˺Nj̀¬Î}+DOÏ‚‰½xW#ó°·M߈å‹Ï~£zñ́ÔeJ‘R¦Å^…ËHăd7tÑÑ’Ël,#ĐÓ1G¬̃kÏ•@₫Æ£„IP˜ÊMD}Îó1ïíưKùr?ï¿>}Û̃>ƯVCàÓư“ñ‚ăØ8ñxÛ¶mï{?zk •@ëÍtíyç³?Áđ ÿĐ”H‚ánIœZº²Œ´̣’·}mK“wo¦UkƯê~́_?ú́H‚Iˆ*•o¦º ¸́s·.Jïç<[oÏù´Æ +$„”´̀2uuVSWÏ>iÖZu*|ư™Ø†Ă¡Ÿñ0yÀ́¦pVklΦ 31ÊíVoc0ê4:ĐàAL]»L6À¾†C‘ÔRJ};"ÎV¶6"ªd₫N‘‹‡^œC­èă”:‡߯4ƠɃ{…¥t+eÍTGlŸ+̀öËxÉÀ±ŒđZi­7¶ƠE´EJé…”Ï1Ḉs/ûäÙ¹c>ºxXت‘•cŒÎ½ơfÅv3ø*NzQtuđđa3*]€Ä˜₫A2ç Vw|@™2ëD¯/rKä19‹g‘…©–Sú4h̀KĂ\Hyy‰ºÜ0ÿz©«Wé‚`ܲ,óŸ¿Ù­©ÍU3í ư„ªq„Ç8Îẵ I­UI1ü+̉ë…´y$̀ˆA˜Dô3é6»¢´”̀êŸÆæ'Øl:€â9û_¼Ü”–¼§Ai½^B'Pås1îöú&ûá\Íø —···ư8zëçó4 '¼÷P’„)tiaÿ«ƒÄ²´—Ĺ~öÓÍA>äèJs_¹‚gÆa3«W=«$¶ 9§>y¾ë¹̣ ÿxUÎøABh›¬½ÀËVÈ Q¸lG¹åK%H&Vˆ¹ú,ưX  à8)¢iÙZ£ËÓ¶Tf)ӄ㸉|*wºPåCỊ́-¾êÈĂ§Ö½îBGYLËoUáåÿ8₫xïïg?¡Û&&+}ưiD)eÎy'zăUªl‚ÑăE +‡|+7sl\flÆÄL ¤'>îü^÷ø\¶É.Æ̉³9Ïóœs¾?̃Ïvví$DB__̃?̃ÁI +öפÿ:‹zåưnƠΪư˜»[nm@oY‚*kÿF ÿúËOÉèl#ˆKl·uŒ^›BÖ9÷Ôâ[₫R4ˆÈơ ††DÓ‹)C«],Ë` ̣̣`°#^Å4ÉhwÄQ¾ /¬pÉWJùGಟL’3%­₫ˆ{a!lRE+U­Ó†₫ă˜:ïÛ=HXÄ  …Z úeÿ#Å€ÎSOô0Y ¶VV3ÿÊef™¢¦ä°†NX0 H+¾µ6u^ ŸĂ ”EöÂGƒCwü .½L3Ú ̃úËåâ´̃ø*$ÆN‰¨±ÄƠIAµƒ¬be@—|lG¬ <~̀ ù÷₫¾Ÿû­Ü̃ooûÛÛñöƯñơƯn·íV7£óÎe–­nûØÛ̃F·v³ _íŒĂV ›ûÛGŸ4ûèq%È,£Ú7Ù%&䄾¿Ûl•™Md‰t³ÖÚgï§Gä:7ƯÀ†!!û‡"E H †±Ơ±½×~›7Ô*° .¤aÁÅ{”Ă©DÜûèû±ßû^öÇăQßëmÜ@Öüèă£ơ¡<8lZtᣂå„Rí˜Ç˜«70˜ht"æ†A¡­ŸQzYSW÷º‡¨¡’Æêâɇ %ă—‘8R¡˜ùhÁ:Œ‡ÔYË(+-HsmÍ…Pl₫Úê₫c6–ĂáhG.ØØJ‘ÑBrĐGï­÷ÙјsÊè}Çë{/ª0‚b$m+­H9å\;ËJ;ÍuÖ) đ¸¬eg˜Ÿ°{§.4ÄÍdزHÿ†ÂẮ^¹×~t-D™/Ä!DÎ9ƠKw˜t?"¥ơÖΤ'r¯…®Ñ Á@à¬Ñ"ˆ k̀ €ëDª ×/’d²û¼ zj@d„˜ö€RͪNV1Ø;·áBQh8Yk#51æ•Û¡kJ”€ÏØ–D![>¤ˆí’ùåx“‰ù•Ù9Ñ_1ö%N4¼…G¤±ÄC¢(æøáó%‚ƠÉÉ9^|ÆPü\«yǗË{~½®"ŸÿÀÄ•k,f“¤_â7ÎJ«–-xr–““ÑÊZá´́5Qu«º™˜W&›æEGỸ¬u1~‘½²‡\§µ­H‰È̉G‘ñùf2ÆÔøxÚ́ĂC.äµ…4̉¹?̀nr&ó’HBBƒơ Ÿ=‚ÓÚèD„£nu(ùpp7mHư¿_Ïq>Æăœ'’9Fƒ1]cM·ư1̉¿XE?<{ÚR áeÄMøÅóq‚.î¶™¤Ù¬K¹î9¡qOù́ç£= ©RJùx~¼?ߟçó%éW÷₫ù•‘‹­ƒü†…ă8W1ÉF‰̀Y₫ĂÅ‹âwă…̉“7ûjb¿lülÿê¦Ơ¾+9¼<éŸxQ0ÁÎqơˆÄüj@'^p‘'À+ Í×fÚ‹̀@Ưæ$|„V €ă~ơ(¥Œ6¬´Đñ©Bđ̃̃åa#i0º ă ú—­632«cêÄç5:)3÷̃qZ[ÀÖăj½íuo£µÚúÖçœccC­Z¹bCc!¡.2{怼RF;&î³GsB‡k¹®'R!„*¬j5á£#qü‹ÈÆ›ˆ¹Á> ÂŒ1G¥dt;GG)hÎ)C0€ º^dù ¼Àu}ö2 Á«€£k°°`ümlù8ol@Ø7@.“Ø¥W­¸9–´ "ƒư81O¢ôÊÔê@k¦O6²æFh7‘Z¹! +ư₫ï~»Ư~ùåן₫é…áÊDx¡|e«Œ‰°¾íª2«~ר¦4I Z¦è]ldâ½́èr,h#5â³Äå¥H›:­ju à¶̉Z`¾-ö5Ÿø…Ă™3z‘ †áI:à‚O¸Rí˜t{¨Æ¦Yúüùóăñx<ØÎ{̉,Đ®p˜€j)@\© }’U¤­§¤ụ̀đ³&ÏE¾Oæ€ÿ@tîlc­Zđ·1ÏxâȧsÇ̀JV€µzi?ú¾ÀçÊM˜Ëưw´ñƠäC.7‹¿¶ùƠ¡å®YD&ÏhÅ/q‡ØµEßLUăX‰ *ü€ˆÈzS¥D"EJ,Œµù˜ưÙs!º¾sœ`ùm_ßÛûc<2'“˜€]Í1O=ñ³đ1?̃?¾~ư~ÈwÇwḥG°ZWD¬øà. YVÁXFê_<¡ĩ‚‹~Ès<眰ü8?@XB4 &pó0VÚVKCƒ·éÚÅHư×yr5́"¦1FkíBØ wSJĐ€{óÇÇơ"5%‡WÖçT”=éÏ÷!®₫x>^:Ÿ«;ø­Èaa}„d¦K0Hs̉om·¦Óöº ễ<Œ°Lú₫¼¤ûao÷*<ê³=™Ù´n9₫†x̉(Ä'Äí†èz!àhÓ¦{LÆĂ­Ï̃©¿Ü¬í ëçx"¢ơAm›,S×ll¬rûŸ§D–‚»ë•këdÚR~-æŒs!c9Áúƒ9 ^.N¦bVÁ|"«]ƒFf™É¿2œt{ím¶̃M$`<·£±Uâîơ¸¤'?[kÏñ|ïï_Î/·z{{¼Ư?îŸöOo··ïöï  x;̃nÇíØc;ÀÊEs­50ª}́­7Șă0ÓÛü₫Ç×đoS[ÇÓ§ÉøÖ -,¢ƠV¶¡£ơÚ¢T¦F9–ºéĆˆ×@÷‘ÖïußÇ~Œ#®0Jlº[”í±a,,æÉ<ÇE¹r=Ê1t|Ÿư¿`Úz°°ân³Y4œ£Ơv›7\ú‘QÈâ©Ë°É©¥—Zj­–UÖÑÛ¸9ö±ÛÄ7oÇáJU€ḥºÿ#Á%2J%-µÜow!}<ÎÇs—=¢Ïo(–zº Î#C˜2W®€âBÇṛ‰ ‚"a°µïÇEås`T3(7]:fè"4ÈÔèש6®˜]á d‡k„î”Èæzu:bÉ„Lë !“i:iK\Rט]WBºÊµI–ÎÜĐ–S´₫¾ú—ơ>€!œ…lºœƯ^Ë4Ù<’2ua )Đë&¸¹¦s…'‘´à9Ï[½åŒµS₫Û_¡Å>M«4ú'¨Üp•sfè½÷ÖÚKœYƯQç°û‡–Ru­ë8œS[M´Oƒ÷Âpªë?håO?ÿº NÅŒåYêÅ₫g²4aPÂüPˆ́?ˆ.˜)E¡LGÜ2ÈP7ùWqKß>˜Ï¾¸±Ø¶ĐÅ1h œRÖ¼Æ ‡$I-”ü”½‚§¼«g,VK.óP«19>fh5Yô23|Ù§Øö–"\ ~N4¼‚\'{¿úS{gA¬¬́3×Ïçy"sí-µèGï½?Æxù{{ïïPZcÉ₫êĂ.I©÷̃Î*Ô!‡!bºP‰œ‰¡1‹*(ûYE§|ûU/ÓW£LÂâ·6₫œ6Á³Ÿñ€ H|´u”_ç„\z’W»ÈƠ¥×đÿÔÙ[Ÿc21 ¤•÷'°?P-ăđĐJñ&'´Ú9ư™p?™¹XRđq>ÚéÁä›Äï̉ĘWÛ.ơ¢‚2®Á›s†eeÆ‘æç2ï·œûĂĂ&AÑŒQ¤È=‹loú”z»g/'_Iµ9jjªD hqx¼–Yrq‹½P{Ÿ{¯ưVoHIÏqư4›”qÚ¢!ë›ü« ÛÈ-½Ûl6Y >˜e‡o€ù‹1a"VæZî’ô©±b́¸"×ĂyÜŸÉ<4à±é#^|mÑK ăÓ × (a‹È­$˜«'z”D„Ưđ®™ÅËpIw˧Ynp̣¹©‘µk¤·̃ ̃Ïư^ï÷ûÛöÏĐ pÛo·ƯºUjÀE¸QµT́+“:ŒQGu,?Ó¾¦~D[`ºc Îậ°‹$‡K+qµw¤¢%ª´fƒ×RÇ῭̃´LÙ́öÎ2ƯÏa››¨µ‹‰wøe¬:ƒçî˜DT·j6IâMooó m®óasnî'¦’YÅëÍú6V€g¤U«VŒK\uÿĐѹóàÂ¥E=ûyÖóÙŸg?oưvÛoh)́ºĂ#baL±äĐà²Jà, Ÿc6Ñé~́ooo:ơñ₫x´Û¥í8m…‡AD¤₫©“³o§ÎJ5HJ¥”Đø"§ï³¶Y—n‚™!èôÙ묘ÖÙœ—" yí³c@˜t‹TZ·›&ŒƒÇkcXưy-÷#÷{í̉âósHU¡$¢M6LWˆˆoV<–N˰‡Éưh|Q…Ú±4ç—/_à ÛF œ|c|%ïGL~¡¦¬:3ë j:æ%ơ_+ŒLg0eQỊ̂₫w†{WB ™1'Ò]^–¢gíŸÂS¯ß:ʾ̃{o½¡1Ø{Ïy¶Ữ4+^ÊđqèP× ‰ÈŸ¼ó́²û¬’ '¤©çyöÑé á‹¢²À##G©ơ2’9‘Ø›lÿ‡›AÜ,¬½…åÑ:éb“F:n æiLev­sD-Kær‡Êßa¡b†38ˆ‰ œØX âÿËİ ™DK02ü”Eo˜Wwóô(£G790*ï§<¾é÷¦=Ö5rÔa©™IOˆ”Z€.çä)JúH §ưÛĂj€ñ°̀'øl‰°0²ơ¯ ‡…Đ+îỪ(`fs!7Ơx˜÷cÜ—Œ„®A=‰5Ÿ{?¨>F§)‚´E9ÉĐ8MËz’’}¦‰2-oÙ\_ˆéUÀt%rl„Ü…î'ªRîv^pj0¾¶ˆjÇ’₫ÑûĂˆ˜[ky*P`MtÙW‚ ¯ª,-LÿÑùñ.Ä…@];gÓ¤.b¤IQG©Sé́¾¹ƒS4´sÆ Æøûqsđ+Fæ“̃–̃bzÓĐ̣çPû†´âCe+æ`x·V-=}ö'Ô“f¥ #úW·À´‰ÅH’ö²o¼muĂÄÓ ×ííöfcƠæR­IƯ²$á1v*½:¥>́D£" ́‹x`Ơ¾HæÆĐ©&`Å« ›â~A1qy‘KÅ¢Qk L2dURøÍ—/_z¿Ø‰úùåKîGócû¹Ÿç8ßÛ;7†\Ó”­ –RàˆÆè¡©(l°Ù9ëÖ…„¥̉pQÜd{Öç̃w 2 `¡ Øç®›B̀ÏÔ ÓßPºàMÄM™ưIDu\k­[c’Pë 9%; g»Ï2£X¬6aö Aäâ`¤È"‚l~“­Ö¤A3ƒ¤Œ!"ƒƯ]wtÔÁªR͆Q'̉,óê‰đC]fYTâ…k-`Q‚VhŒJÍ6¾sí¸uâÁ£T³ơ$o.̃ïà‘J—´đåÆÄdnî}EB@¤c_ươëû×Ö1²Â¡8‘JĂ4âj‘äƒÓôƒyVµØÿ®Rm³YƯ®^¢¤cÏNe2‚å¶mÁvåàf8η˜¯¼₫…†!9¡ÉU“°®¡̀l9Pÿxơf¡Ï¿A ø?äxÿÜ̃ áùÄÀ0kÎ<ÏÜñ·´F9rDR¢Iú¢•»”ƠJ0Kă _,dϤóŒU£/¯4ê}éÅ₫"_̀d°_©&E˸éÊ<„„mâotTrơ˜‰jư“Ûi¬ÎRèܤ„›ç :»î²[ưää•}ttLψ¼¹f€Ê KvaRTP(‹3I,Q2zï˜j ¶íÙÎ₫=ä£?ó9Ư¯‰“k…Á(í¦J#%=¨ Ă0›̃¤¼+À2Ô9µÔÊƠü<î×q áöƒ·O¡ÎúĂ®9û‰+íçÂ|2Ïô‚Đ ¦3ØO ɳ̀đÈt‰¿É*ñÇñ”×RtŒoç¥̀v/)G—đF#"1ă»ÖØMz»̃ôçrá­d‘I,r]FaÁ E‡±röq.­rĂ3€.c¼"¶®T®æÈŸ̃>Ù”ƠÖ×N»>R‹—’CIëÛ₫ë « âgçÏ)SØ ăh¹ô""W± ÛÆƯ|Ûߤ‚„rù1Öû7¼ï~ô¬*Œ8Ê©@› “ç……´† w¿Iº₫âªZ£4çÇXƒWÑđ ă%p£|®0ó”ơ@–(„b˜S3k‰ù\µ†·-³`®×c¶‡_(³ñ Y¸ASsmW&5,ö9ïí}“íö¼ơ¸o÷û~Û̃îûư~ÜoÛ ¡ÇvÄI¡E¤q¶r¦¨₫WM!æÚv³Ó ƒ£I“™Ïy–QD¤Œ²É¶w£xÙøw©F¡ñă¹ơ¶o»M±(¼ ,i‚›M)e9tÔRñ?{Û¬p³k_Ï,HmjØt%+Iáră–Á÷ư{@>_Ûׯç×̀ BÛŪV<…á₫Ç·z£`²e…UT¦Î6)¡(\¶¾m²ơx´Çí¼=ç½Ư£ 8Ô&<Ô¡Zfaby“ºƠ­lû¶Û I3„}·IGåcé¦W¿ûØ·º2à·d•Ÿ[¿Qˆ”îåQJ)Uë”Yµ"‹*µ€¤º„¹‘9‚¾‚´ủTVd³Óm¤crgëíåø‰Ë‹(´roˆ³²N3]Œá"–—;óU³‘N0 goƯâFƯjvø ÜQÊ^÷ûí‰á|¹ntúç{ëHă4₫#l«Á[ï\D:º&₫[k­Á}´×tô íD¢>º.§₫́.ăÑ̀K= ÀH¢7ˆ%±É¦l IŒbÀº Ụ̂‰ĩÓ‚á jÎŒ1‡Ñʙ١>çw™Â–”WjÙJ¤èH9÷oådLªjƠÔè÷-»‹Z„5øÀñôQçCÔóẨ¯v·cq¾Ù|åc¹9ç^/…Sd“–úc.ú²Ô¿øAI®‘@a§‡xyM¨¤æËäGjl@a‰eđÓÿŸ´Û’cI²Ä@½˜™{'³ª9ÓÍæjÿÿgÈy›‡fsu±XŬ<án¦‘yØ¢¢êqN5k8‘XÈN ÂƯLMUd˾x%(̣Ïú|´‡M¿©»)¢Wl(úq_p<̣̀¯á¤9®i.×ñÏW9/€‰BÓp>®“óæ¤Ëq«û[5;áæéÂB³Đ}»_×ßïN¼¸Qù¥¡™A»8§ư4^¼»¨ó2³ZIkcí­”±¨÷Ûá˜sæÀ¥¼ëÇÇp,•áÎäÇñJ̣¡áfûÂ#Z N üi{¤¡i¾÷ûư."?~ü¨µÖ0t½.Âch‡>Œ}u~^Đ¯³h>à?}ưiË[­ơññĐÅKÔáße‰·Ă[N?Ư“ö ̉ök¼˜Ñ ỉ/„΋Bd¡J‹/`™-Yó.w‡®»vøưÿÓ ˜ö@ê£>B[ؾ]ß¶´a,)Áđpó_N3ăkµ ’_Ư3L©;€=NA«Ñ›qă–9²g(™Øk„…ÅÆÄq"ÂR›€J°×ôưØĐBÙ[yĐ]¬+ˆC.̀C.<è7(Lí'ªtêg;Ÿơ × }ÛtܶÑäcKÛwc̣;½ "ŸœŒ_6gÆC•œ²÷¥Ö6jÄøB 2‡'zÓFBH»,½ ØÄ„ ™¤J+öJbo½myKj¬G{e»Ơ´eɦ²•’½iÓáˆçOq7ͦÊ{̃oưVzyoïv ”Ç£>ÎvB¿Ú†¢¼ẹ̀çîÈÅɃr:î{—̃´•V FÎvnmÛë₫¬Ïûv¿êuÛn÷v¿µô9ea˜q¥n₫N¹äÈILù̀Ïø<Ë9J“³¨)u(îàùmÿ¢:ÂE6lŒ‡ăøÄ/®Û‘#¼ê“¤$©‡C®q”n\ Xë¶`tÈÑŸ#“ô Ø/DÔÀ^¹Ú T!J”•d·ĐloF¢aº<ÂÛiC²Nr0=k7ÔÖ›Q‘ ¢‚d‰gÄqîA`i³ră«€$æs^ïd&̀¼8â­ofØ'rbNsêîC£ˆw“·%ÎađŒ ÷­z+>·³P²HÉaôcŒ|Æ Ă‰Ơn—ø™¤#Á?&¦BB¶Ô ü_×UJ9¯Ó3 AV63ºnoÁÑ+Û½Ă êé=¤ÿ,<ÎëY‹ƒÙ®/mmĐ@‘8¾´F§(́ædÅ ‚‡¯(j ­®₫ëƠ¾øÎ-¢¶680qNÑƯ1,¨ÿPª̀¹–P¾Îª_ê~êp¥„9Ñt×ỡr±mˆñ5Çpah¨q–»NÅưóÙ{ˆ`äåv“VîbnR<ä¨1¸9ƴص8ëE»­#Íæ&+çÇÙF÷_+ÎÙ8­3+5o7̀fÑ'CëxÖÓ2¼¤V,Ÿ?ö‡µ>VƠÄiK›³öWf¦S*æ_†QơÉ̀RQɸwªkĂ0÷¢¿û+Ç/0´±5Yªô‚“Ø•¦U¾A}®̣]SK“uƒU†ë®›₫­=ê4 Û¬ï34Œ¤ %צŒ0¦SpgÀåÅLU»>®ÇyW¹vW±¦÷ăn¬ŒRÊJp7L™ùSk·çĐ¯Ơ¥ÜÖĐ÷ܵ„-Zv;5E¾Oưù±ưÿ{ÊØËèD¨r=ûiÎ*1!\lO;ŒDÁ-YE§ sœ4Gçk«,á5R$ăN,M†Tü“99ëׯ¡'*+ Iȑ¿钰¨h¯]TÀÈÇO1ÆQOl²a¼µú‡º‹¨ ûHóµÖRO!ÔÁW¸rË[ÚökGé¤cÏV\æ`á,öXÊP¨È‹QƯœ;µ`r¥UT¢li³’È{艵yGa|Ü\œRUj–¼ËRÚtC'Đ/L$Qq¤‡ư9ø!¢Ơ3Ö¡ : ñ@ïVm +zh•¶¸z´̃̃¶·³ç~~”—tw܈ 2ơđ{ê9f Ă¹/rĐ9Å•F­µ(„¶¶]ñ:ë‰_·ívÖó^ï÷ư~ßîû¾oyË9O_çÙæ”sỆH!å’sÈ8J/¸¼¨éñ®‘3Í̀ZפI0o`k¹¼r2‚Üù %r9÷Œ`¯jj 'h@‡Î=jÄ5“$ˆ> 1IHY…Åu¥J*A0O0|h,QP2¼>3gôáè?;ØQ®ø»[óî)Å„^HD$ÙöSsÉˆĐ‹“4.ÊV`‡©ç~Îaû !¼œ+ăÅùÊÄ&‰gMƒ̣eyÀ°qx5 vZ`1®]å₫Ú®“ư° !ḥM½Ä1º³S~Éz'™8¹\T,p¯KÑ6L]Œ1UJ¹ÊU®‚ăü*—[û6[ˆ‹‘â'"“_oT,ˆf!ØLr4H†C«!¨çCŸç«¨¿ß—uspÏ…•n¯óg¿A¾ÈÍéƠ‡<4RS|ë°8s få7º¬¹-/°ß́·ØWAâÏ[fbËđ̉Ÿ\!̀Ü’•Vn‹!ÚvÖÍ́dFAï¬qo·ÜÑnỊ́ »LûÑ[B‚i|#cÿY;Ù̉5q…ëJí`ëhÚ ¼lO±?DŒ7†›çô6÷¥á7\yQ[­±z€ù§L.&̀¼uÁª´‚Vímål§1H¥ÖfÆ^ơýÆ̣–­Ă¤ ¿§l/₫=뤈‰Aè7¹æbơ1Qç\¼j¬1Æáak[Ï+ă,#_ÏØlتỗ¯z•Z¬ê]©}ƒ±¶£˦%»i‰—uœnÖ½ă¿ÎSbåYºR©w+z>7ƠWËNgö¯­ …Zm½÷02.¼Û·˜[®„F<†ißöă—/_à|ôññ±âUkư*#ïÍ}ƯRç"åøpøÉ'ƒ8¢„ùGëàÀ ;A¿ëǶm£QzÁưC'࢈3”¼º#)ĂƠôÓŸa€ñ˜Ø–-MÙÓ,»MÖ‹¾À"„Ú…”¤QVM*·:×Û®ªBÈœ5(ÜÓA´€æŸ¯´«U!еïû÷ÜzûơÛ¯&¸ cØăÖ·3œÏú„´ÚH8i3Ă¥8ô  èb›ïÇɬöÇÀ–5( v=°è©­^Íld-ÁW ½¿ẢV×¾ÑÖCßhĂZ̉¡“sÜ6A4̉é8CF£¶̃"Å,¹Å¶éæ–>̃K¬4LîÚ+ˆă -¡ÍÈ)zỤ̈­öú¾½?êăQåăQvZHA‹kơè9C**[Üf£ë¶̃˜¹Jmd̃ù…Kj)·ŒiĂ}»?Êă½¾Ÿ×Yro÷Ûq;䨶 +Tÿ9åt&tw`=ËÓZ¶₫÷Î_$iƒ•̃»‡ènå¸×-¶R ê~pÿđ5´ú¯1Å1ºA÷U£9.-´Đ6D“+TÏ!„ÙKÓè9Y‚v'u;¨† ¨¦Pæ{€ëîgóÜ­tX…8u4ù—z‚p3IJ=A†•†ESL’Ü)h¥Œ30è+¥—̃{ÓÏ®5<,ƒ¼œC´‚©ªäX##“•ÙGöV¦ûzZăNî¢v́·ÏLêÅ8†WyRÚnÜÜơ,°nÄ£$ܧ’+ă•KàͬË)ßĐZĐœå<¯ó¼Î³œg=m»Xb¿Áÿñ‘bƒ%LK´y4’4nA,HƠ'ºk`¸xŸm¢±wíÔK/¼ÄêSíƠä:µR<’w>˜¬?ͱó'á¸è£ØRr£’ºf̀˜Ñ4B^IƯ «_¦¸ ¾³yŸc"B|lƠR}ßö̉ÓV~Xæ¶«?âW„ ßÖ/;zÜ£UAg¤ó…-i§äÂA ‹œRÊ[N1áâLíÓ§̉_¤·ßWÖ9Đˆ‹oÜß7œëoghv̉­@ñY—/!\^úă•£ü?'‡<­*ÉÔSä¥c̃ê7'+[lÿ5v˜±…‡öæ₫ư¥[ßRÚ$¦~ú¥‹Åª÷!øœ=›ü5%­¾ïQóóè=ça Kơf̉ÖÎj0˜“¼ä9íXÑD°ûC-®₫·R§·ơq3Q‚;Cf-Á_È<ô*¥]ôÊ₫ùœØx—â+_ä<Ïïß¿‰j)F:̣‡ĂÇă₫#â’Ó²₫î5§³QÖ9!‡ñÓóEu¶0zYÀ«M1Ä}Ûÿ₫ï₫^T¾}ûPyưv/ê°4^; ḯ×5ñÚ,¢.g‰©]HB˜=%IöP%™€´¦‹7ù¿áă/ùË—/_Ïç?ưÓ?AE'*¥—BåÑ´ X¼@Ac«N`Í‹K–ßëĂ"AÍ©ªp#•ƯŒ×ñ?N„C&;¯•…D»Th0GmÅè‹YüĂ ô!¢̉CỏRO­7¯!ó÷ÿéüŸ₫îïÿî·ï¿ưÏÿïÿù*WÓvö“‰qMp a»BJÍØ̃xº'ó”L`écÊör₫-®´†Çc`b¢´ÉO››Ü€©¸"Å“ªl¬,¤Ó¸^ZSL»î‡¨íeơs]¦;J‹£ 6iuXϱG!I’ö´)Hkíumq“`ˆÉ́`F’%(àí¸·ûYÏG±6àGùñ́O3ốƠÇkU+|Mơ¾Ư•tO»mëq&ă¢An‘4„pGơy\dz<Ÿûó¬ç{}«oo··›Üö¼o¼YÈjJ)§œó¾íçuBäưăùcO;œ=¶fíNñ́ă 5¶@́¢̉B3úo˜tØ%áX‚§ªT ÅÛ()hxØeµùÛ·+^W»N:™Y Èơ A@̣„>GM OæÁ^¢„ ÷vü¤ƠéVø€ơqè“ÂCllïºKOb÷6Sp‘ÊÁîƒgŸ Y~ªÿ±ü$ÖÁÚGcïS`4âỷø­¢‹è’¹Ö0Ư·Ê¯>Bƒö æwàR̉¡1XGî†xMÍ€-×ÖóĹÀƒÔÄK¢yœ Ø0YEü øư¥/ư-œ»^W½œÉà™ô.'ĂÀ¨J”‚–wŒM3K<ơ¦^(bXgOe­nÂĂU)jŒ:-\́1ébô ơŸË?F9fçÏLTg‘gø¡‰5 ª³àjT[̃\€èœ+§ø Í§‡qDhJ̉¥–ªQsÎp¬F-AJ.đơæÉ”[ù<̣qa¡I“¯h»½så2…që³=‹ ¾¥?~·‘‚[‘vó`—¼)¦c?`4Ô{>Ÿ*ÏvΔ¶¸aå4©Ëè½ưú;̤đ­ÖVÏz^í+ơl'Ü8¼ô‡ m%cy¹ïoÁÉ<.\ñ!§ËµÉÁ’n ³Ú;™Oµïº­Í₫×….Î8µ¯ˆ\婯•¶̃ܺ]—ỉâá󂀌§é¥Ê§Ï3[µWAÂZ…óĐÚ®|›Úkù¥ụ̈ëÏD„EˆNu(‹­x•̣Ó`c₫¸0Q*›[¾rAítƠ¦NPz°ƯÆF†ÏX2&PNx¿vZèV:˜Đ>­k̉đû,m‡,iR©Ææec×̀‹ANGĐmYi« J:~O!%I9d0¡±jÿ¢áă¶m˜c₫áô,đÁC³ ›ÏÀyuaÑ„̉đlÓÉg]ÓERUI²Ö“&4ÄFÍ$SèNT AŒÁbG7„Bp}rˆˆCBU»† OÇ“$°«s̀µƠ+1}½}ưË׿ÄnùFBÆSWÿQ?@—ºåÛ=ß1—‡µ«Û ,MÜc©ñáăƠA•I°fp3ö‹ó̃÷# ö)H»Á`Z6<†`,§@z¶´m´a-‘& ₫‘R"2æ üQT‘c×ĆÚ‡L¹I«±Bb&ƒ,ÿf‘7ƒÅH§¦e&¤íHÇ‘{¾ÔGy<Úăl§ q°*.ï̃öûvßÓóP†¡@Ôt7vú&g;Ÿíù(ëăq=̃¯÷gy¾—÷ûq¿ơÛ÷¼MFæÛ¶Û±oûu]Ị̈ü8?J/°€ÀA‚§̀rĂ¢€ÀâĂA5!L1ƒÑR“f-tÊXF Zâ#GÔUđ-ñ±8’%$²½D1a‘£ß)à¸]úJ6ce§́ø.®ùBüĂ)ë«?¦ó́Ç ä €ÍÖ¨'NÓ'ñwxI’qđ̃ël—é[U!Ó¼ËÅvä$Ú₫2Æđ&\v û ^€˜ñkàoĐæ'« äÚä³é±Ằ‚,[VÔi!IOÎÀ  xmáuĂ<ÈùơơGTxˆAE0-1Èÿ<Ÿåù¼g9Ïv^ơ*Rf uÿ Œ§îP¤Kïܱ‘ÊȲ]áÏíØ˜ùăÇ¢ë:™.Îú1f 2e!³vq¸y}ùIœ¬CƒG–₫„iØåoÿ“P–yñ¼̀JÆsÎ^[Oȶ¾ư¦[yƯj—Xø'· ÙÏJÔ6+m®À;OÉíüçÀaPz,;©Ëjư2—̃´œvƯØGW½DIJ‘‰BG>RL¬¼Æû́y?ö¾Ï9çsà ]Lc¥$£ø÷0WuÇÉAJœ—1Né-gzwĂ¥Ă™á¼z£¶v%"ÊœáëêÔâiN=Hc¦´å™¯óªR™ĐÊYö¸K’Ø#(@FyTKv»úơ¬Ođtá0ôˆ̃¬ƠôCë³>+ß UˆFÇ”=pÈ)'MDà¸*­¸³~ëy=ñơë×?}ưSŒ±<Ëăñè­÷Đ…EH2åY[°jS%• >ɱ‡-R¤(,£~Å0*IjÔl¢i—RJ”¼ŒœˆrWH–IX²ñGîú=íG<öº[ <Ÿg;ç)̉Ơ[Ü*ơDÏUØçÙÆyÀ Ú:ŒŒ0ê5ry<¯ç—û—{¹[°íÆ9N‘ÇsÎÛ¶û¹Ÿû–¶«]W¹ÎzCCóÜf©0´Úª ;W â •Æ-I‚‡’Ç5€.ïç„ÜƯ;Üé‰ÓEv(â¹@ŒÛC¬­vîÆ°'™æEaâ÷s ¼p?̀Ä =­WNÇ̃åĂz“¯¨ÀcçÆøHC?0ªý]¦7®ă†üƯwÎuƒB'?Lé÷J¸ZñƒÓ_&æ₫`:bí\XP§>a ´Z\³aÎu™8D®Ÿê~›eøÀ›ÖßgG±¾l%?Vˆ€–ưK9¯óY`₫×,­\bBFç·̀¦bÑ­*)JLË”h"Aæ¥=†5„ ]¯vư(?J3̉°çœ-Uíz¤h¯“Ä>€ë¶BÂê*F0¿mß‹Vt®[¥mƯ:q>ïl]x`¦=2̀(?j4T4iƒé ́QE 1ü .%óCôz8…ÎÇ©Müí¶E:<æäûŒ;:8¢?’³ ôS̀éøóüỮHC0æOÁºg ‚ñơñÍWu₫;­h%wà29rÿR÷»éüú1 í_ÉË̃»P bÄM­7½ôo?ÿ-§ŒL‡iïow„̉ÁÜÜ•ØJKê@Èz¸:Îä§²ˆXÜ–(Ê)ÿƯ˜‹Å¬¨D‰Ẩyhƒ‚˜KÎY7^ëíAơo{ÿ†Q)Z̀ú‚Ùư¹ ¯ßĂîÔ É~I“)äO»M*ƒEGÍơÄ“V]ä,ÿñ?üÇmÛ~ưí×hÿødSFî§÷¥n‡,ä¿äœ(@""0-A'Đ¥?¿?{íµ×=́”Ơ?b†;ơÚ« Àáƒ?ö¸ß¶[ÉEàî7. Äô©àqøM§”Ï‹ü½¸„tEÅ^¨¥C9”)‹HƠC$:uRÄKßï÷ÿ₫ư¶m?ÿËÏÏë Ï/ ú%ÉZ a á'‚´mÆd!ØKâ¨A£D&†$5m¦¦Đjœ·å±_??táWẰ(J„̀–¶½́G<ơÆÉnN'Å'­7ăđÄÍßP@gÉ¥•ܳ“đ´¡¦„›Ó£<åù,Ï÷Ûû×̣µ¶z?îÛ¶mÛ–cÆÄß¶o¼ªmÏ+]{Ù¯z•dM€‡É‡¿º;e5¼,ïf<„{—̃ẰnÛ̉&AbŒø‡—×D”(ÑêhÙ¸qcbaÑ x:¬ !ËÆ̃‚5 L§—8ẾHNMo¸pđÄØ…ó–#ÅZ*¬¥đÇ M[  ¼,xZ²·À-Yë$‡pfÆøehZ›pÏÑ]kH’B°¨œÄ:’¹øÅ`úåt—!£4oP<û…öă†? Qø`Á+Kd܉‘©'Åá—ơ|"€.£€ư × ½Ø çM]đ=Ïb¿®z¡ú ÎDÚ&E:ëÈ/” Ó3" *U Ó(樧₫xü5«w£Å̀@„Ưö5"(g¦qçD8¾cư–nó@»3#f›`.1÷óñ1Ùê<ø*#W ’}Aơn̉pª½lE{6ÁHà¸)9Ö?m0ÆxlÇưíS₫öư›édŸ ‹ú´°ùăĂ.‹^é¥jEm@‡çƠJ­VUVöªÚ]ŒiäCcCđ̣ÈöaO ]Ô½)¤}Ûÿô§?Ưö›ÖRjk¾’­[₫â¤ùfơ4&^÷ûe´*¤àB´(  8Ùư…=²DR`)H ñÈG #=ïøWB0W ÛfÔ—ZK+°ĂzÖç³ƠçÙâÖ–ƒ́n`°5C#ôí÷…ĐÚŸ›¿M°fÉ̉†ÄŸ¡Ÿô¶µè÷Đ'“>*cKG©à¾=¦•³SÇ¿ç’^rñ/¿Æ°ïÈKÿ‰»ăQS{x?]Îl³uñ¹ú·]i<<ØÎaTƒ¦Å†³Û₫¹ Óü˜³ÁL¨ºñ)&G&]å8ÙxsT†â¹l̀2B¯ñ7‰ˆzë?ÿü3ó4ÏbæăvüÇÿá?¶Ú₫ú/ưëÿùW^Xk4,œè¢¤m#£ß»Ô AÏœM,®Ă~.«*ؼë0Ҩ€oàO 8¸ t1íë‚~>ŸÏçóßRúÿ₫CU±CÁ“;pØăîöAs$:Zgd:‰Å¦Â#0ßĐ9pJéÿùÿø÷_¿~ù?ÿúÏ¿üü ,˜&=w ë=~y‘ƒ0à‡î$¥1›‡˜59AëÍ­oZo­¶Gy4i{ÚÁp€‹håÚtø0joÔ:ơG{@;±ÅíëñơOÇŸ¾†¯àŒâ8q†F˜Ñ|øç.ư"6̣Y³[b¿8a4̀+ ›‘áƠ£ \p ´ûŸ¾~mWùÛß6 ̉äâ«H9̉±é¶Å-Sv´¸kቩ«́™9¤5ö`Œ‘*Ơœ+5›¯Z½` a#ˆzïhçj­!„Hf1Åœ̣ö=í·z»ƠÛ£<>êÇ£>íé1M6ukvÙä ¨JŒ,óœrk ^O¨„j¯Îî]Û€Gy˜çC¯{Ùoûmßv68çbpäéÊ×–7[¥•³œ OøLÏï§·V.ʦØcͰUé=tĂAf-"Ïâz®,?³iTqgU…W Z\jNÜ¥GXÉà?Løy¼6+jqZ¾®FB ¡ưéÏ?íûö˯¿|üËîoà`E0B¿°T­ª¡%ëø%̀ÂQbÔHc̀Ë…»/,Ị̈tSøY} ‹°â€¬,C”xăC̀!O9 /`Çeî7'8“ù4@F‡‰‡H8*½¾ ‚”¬9]ÜùÇ]€cÖ¾ZÀ§Ñ„8: Ă>ÁL~®ë,çU®«^Îg@Ơˆ†|R•jÁ a—ï—˜P Q~Üz“ü²}F¨Đ°øHœzï‘"́ȼÇ1Ó[¬óQ iKû±—³ØMÄèéϸÀŸ"ƒNíL6,qP„¸(nƯƯ\8«Âûpvw×¼"2¶7«×<»cvHk‹Ûw³ N£éñ‚û±yû²mÛu]EKë ft+đ·—cÊPdb̉@Ú̉¦ î&y\Œ[!¸GƯŸ6@& LJ½u©FậêßIf¶c évÜ₫»¿ûï¾~ùZ®̣ư۷ǬYA[‚2Ç+i¼ÎƠÈY%àËmqÅߦibXë"„=ÀÄÙÇmu|nY.«Ñ¼Ó»ùxbs¾ÚơăúŸ “öjk̉&Ñ%÷ĂŒO_™<¶̀>Ơè¬à'³̣·¢Í7¼à‰Ó¬$÷Pú$ÀÍEI0ó± ¯Æ¬ËnæXEÖÓjó‰œcp2‚}4z ‹\§ ·á˜¥&Ê”ÜÉà¢åÀó"{¸_:¨OĂ)km;í âÅÁé_¿öđ]l[1ÅÍÑF77×rN‹ˆÆè¿ÛE8RoLæ-n4́ÆÖ ˆ™uô"­·qEíƠc²6߀¾œØàÖóé¥1XK|ó/=Ñ)¶ø¼ à”₫x,!đJæSJ³#ü¿÷ÁK˜…Ư›‘-đlOf6-l°„ZsZ‘́ñ‰·fÔµ8èaÍưúë/­·Çă DÖ¤u¨â#f¡0¾Ùù}ùt`ÛRPă©Z°”ĂEQ'¢ r9TÂuÇZ{Í!OóPµ$¥¿¿}”¿†¿¾mooûÛÛööwï‡éđU.{Nx4~NÏ#ÇD&²œgdLØtœC¹:¦á5gÍ.À’Ç·Ç?₫Ă?₫ö₫Ëß~|||´Ö°  MÚÙΪµHÙdË!#$°ËL✦‚…•€ B8ô0ÆMԣĬ٬BI|ƒ†å”?½ ¾oyCÜfë JVÚB ÜmiÛëN¶E î{ÓFÍàÆû¡‡åÙ£]B%Ù¨«™LV5ë%®viа…Î>èíx»7d;˜‹K Ùu2Gœ%lăüơOå&Ô÷ÉFăQ[8=zÄÈ‹H’$"-4ëA0´lQ£ểh¡9‰¡ÑF6“¯OtªN–°Zj˜»ûî½>>³XÚR¢H÷/·/_¾^í⟙eÔ"!a₫ù7i(1¨4&toĂ¾ïÓzE³§Ny/Ú´YÖ Ø q™8H€`4…ÔCwú8ÜĐñVñ»UxK—7:̀=üàôçznăÁ^KĂÇ#Ïa-FưÈ÷Kmßm¨QiÁ)tX@ÜuÔ$ Zđ#ÖVQôO×Â>´đ¦¹¦KÆ™ă¬~Zá"8´w ëØ(¹®̀í§×ÍÓr'‰Ù›ÄŸE;ƠZ{<o~¶ẹ́w|\G»‰Lç…‹73öt /3Û1'fp ́Æé₫ĐCÏ^—Ô0Xó1ĂưE¿aØ9›Ø4™÷ B́½×Zi M³CŸÔÖÂu‹Z·¢:RpL[!µv˜¨“†NƯÈ4Ûàèë-“w¸9æ2'&íóùœ²4AúÍ +üÉH ÓlĐ“ˆ’±ˆ½GƠnöẻ+ å s9K±NµS,äâœ₫‚‹;7̣Ó':\­¿~ùzlG¯½^ÚȵÁ‹œỨ¨n?Ơ!>'’tæ³´usUô«½ßa£¨sl×u\x3)&Ńºc̃:Ă',¥?G&Æ8g=Ô:RÅ-˜—ßO9F₫f´|óï¤'sG Öi¸æp…ùgE4ĐC@´@ư­d÷Æó{6ørÔ°Êi5Eibº°rd­çƯh>0©èÇ÷µVÔs³Ü˨s÷;ÎnË:ö_„»q2{ëwtr—ĂT^ư«hS䡪Ÿ`/̣vm}IùÿµøTư{àߪI»ú…ÍOL`̣åä¿O¡é&Sˆ_öÿÇ?øÑpK$%Uçú €]®¥­ÂjưÜÆƒ’AĂ œaÏJäC•‚t jñ«-¶ÔS—zÊ1Jw¢yå —)1z;é<ûùQ?t\t}½M”ˆiO»‹ü’#ág-™ôbë÷;‡Œà[ófÓó• oçè)¿₫˯ß~”ë*¥¨(H&d–Ê#@@{ 5KFGÍ·…fôÜn¾ æV¢K…L¯Ă±i‹¥FÍt¨*:LEpFÖ«Qâ¢h=ô`ê´Ö=¬>¶è!Ç{Ü¡3ƒ> ¼#áÎH6YXˆ”h“­§~ÈáÇ?\àÛSµR£®=)nñ¬g¿úóz¾o÷ă~lǶmøñ´§”́`ɦØ• X‚«.ÅJL‘¢å:Ñ„ôp¼Èâü-"=ỗ;TÔQàLY{ÜÄ<¬¼#ăÂ?k!H@—°I„­N’1€â%›V½ ưƒG̃r!9Ï3¥ÔZ ĂêÍ•`ÆƠC5è/µuH_FR,j _üøAZ^p}Üw4?.;N”%e2Àà?z₫É/e‹†ü·QkÚ<¶l“à¶?Cṕư4÷\”đăÅư“S™‡˜Ơÿ ¾½7jø#›)§5»Ù?AÛ_ơÇÆ€‡·×"vƯ”b1₫·‹9¨;¨G]ñBcü8Üo÷÷û; µ³}̣jôê_Ü·Æä]ÌS`TK/7Ư‚hAI±3;~ù £µ‡‡́í@Ä,K±-^y2‚œÖ1Î˃2Ū”tliÛ¶íHGÎyË›)}A_ ¼Ö+¥74DỨºL#ư;;¥ểEưáøẪ ;e0ơ×hÎCJiÎÇĐơ"S9 Aj4Á•‘ÑƯ#?†boưññ€C¦®\ÿz•Zí =Œ>áá$:÷®0q gî₫. Áy>:„@¾2såFÉ~Ü8mŒhtM–`-°!ºêơh·óÇơœÅ Ûí³‘×²Í¾f%è±íó@:rÈụ̀—û~¯W}†çZÆÄƯƯ[Y€û¼”ñ±RVœÁoïnún %H0Dwx²ŒLŸ¢ÿ8µ ÚÅ?Ô•Wñ®Ơ)>3­ÛùÇóiÅ÷\ơ(îñ¡Ût÷¤÷ ¹ÿÛ)2Á˜ZÆÿVÙîëÇzÅ û^ œJ³Xz)èƯÂÜèœj¥Ch82RNÙû?ºˆˆ:}ûơ[­µ\Åa³XÖa±Œ´|ĂZ§™|F˜–I=-Ó•IzM-₫Ä)²ØƯ¡ “#ik'࿯ưßúø4p–6₫‹̀È&Æ@˜úœ ¬hÄèRLg9ƯK{jˆ‡NƠ¤ Ñ„0Å-D—è"—ø¼À´² Ç1•Ö,Qcfµ$ƯSë ’€, Î,ÙK¨û³ó}û̃¾ÿ¹üùîYó—ư ê¹3E ¨øĐzö¹g•³h́Yí3ñ$·üIV5ǬXi]ËR¹vê j F• 6Q‰Ư68N4ủp›8)+"! ‚]+w– ,¬2q+›–‰O“©SÑAè¬ưYù×_~}>×y9Ù¨tcz9úÅÁƒé\Ûu怅gƒPV)¥´j"«É Fêód́ ›Ø3¶†ÍX=ª‡PZÍÍ₫ÆR+aÆ.$f´Ü/@•sx²gøƒ´_Mự́¥8ÓD=ưđC+ƯÔ0'€¿­'!Âaø–͵Z1́¿™S*­Y(̀xØ‘Œn“Mä¬\ªG¡/“ï£C%b<Ñùyụ̂—Ÿ₫R¯ú[ưmÅtm7¦q0‰u€axuû˜wUëZ êê~¶Ö³’ ̣zè"P x?s»ß·˜×ăăăĂBåFºˆ æ ,Û&€ă ¬èz÷´oÛ¶çƯé₫øÁ7§Đ}–¤`9NÎOŸDÜ58çØnÖ¯«_¸́P¶¢ñC^󷸥@ªñÚzZD€°̃¼;q8ú‚´£6M£L¼\Û̃ú£=œ+…8àưW½ÜÚßæ'ƒP—8¥”¶°ïƠ¿µ(“̣;o"C<9…m!Â2ÄÛßñ¤™Q¸‡ —Z®~=˳´âẹ́×û¹\ÅưïAÛµî_ǘ ×‚çƒsöë₫ơvÜź™Lèè VœŒqc+aaHœ`ÿêyƠ ½¤ÉÍ́Ö¦[¿#" ½à Ä‘{¤B@¹@ïÙ̉VZÙë{ÈæÖæÛ‘®ä!8ÏôR6³f{=ă8RËÇ÷Ä äÑgy>¶Ç}¿# ¬_o«Đy¦˜4[ôéƠ®ÖÚư¸‹ P@₫ú6ª‹®c1~›₫èŒ Ê!H´06uiă$’C1PPVTº-êkÔ€æ ƒc+?ç˾ähÚăøÛçaŒ `[ºxb£çåxĐ»F<¡@â½"´ ’Ơ,øe¬¼ÔŃùÂlơưŸ0°Â6†oúnxס´ø³µÖ{ó”¢:1Ă¼’†ƒ[Î…DdÛ7U½®«7ÓÎâuîvF₫Î. Èn—Fđ`Nû/ï1ƒœDåceø!‚ĂCe¾V2ó§ưÈGèu§ï¢ë è|¤0ŒưŸƒ»5;‡E9c ).Ư’à‚Å/üx0ưû¿ûï_ß₫ù¯ÿô¿ÿË?å„€ß2GyÖûÈ3[Ư¿§}Ï»7ÿ{̃SN[̃̀ZgÈ<́ñ“Ưhù@JƒMfDDÄM31ÉÄHÓ́>µáf_°z&1Á’WŒ…·¸Ûq?îB¯É 9¦:L¶¼¡aó³ÀˆøCÖåÏ„·1%A> S©gy:à⩸›‘bŒqOû±ï·÷ÈQº$BO7” ‹‚MÑZÁañî¨ÿ˳Că——º¿ơö,Ï̉ËYÏg"ÆË/£/ulÇvùâêóé 4fÚ°(]9æ·D)¥ïѺÁ…SäO–³V¬$%¾,<ŸÏÿ ùë3p~ü!Â38ÄSJ~eĐơi{ù#^XŒ“+5pŒQrΤŸn*W ! ÎÙ8^­ûÊ÷–u¿¯¢IBX œ6É4];Gu6mBf‰¯/ Ÿ ’ÊpmZr»=UĂëøßVnä,¡ñrÎ?—¶0ù’ơ±ˆ¯…–K͘Ù^V\:G~Âte ®ëzé˜=áli Ö Û ˆÏ¡%đ d2̉:t.„vc đó̉ÿz€OŸ¬Ä Æ s²)̃Ówgùè|å¾hk––À>˜ xR‰ÇÔ9öÆ^yAŸÔ!º´U¨*Ô„¢"A0‰Áŕ1­÷Æ|‹­ơ¶¥ÍËÑ ˜¯³´V,½üơÇ_}üS₫²ù²yÛß̃÷w¿; j”/ÓÊiÔÎđé¡7m5T«ź0䩽z±{̀ rlͨΉg½H Ø£ḾC*$¦ÜSO)¯xi?dÓ:¼«VĐ„LÜæL˜±6f_C”Ø{-Æ{˜"°±­náîm·(4ˆêH̀́|9ºt0wM«©tRxê9‘ú/ÿ—ûûưÇ÷×óRÑ"EªtéĐå8̣±ç}Ëø¬Xl₫Êcfnµ èºÑŒ¼( ™E°ïœƒÀăÛ6“@‚~Çiâkö¡WŸÎ2s¢äÜf1L<•&~°–€"‘±écđF41Q /IçFN¯…5x½4¼etV4W¯ÿC¸˜O8ṕiØÇ Œ¦1ñÇ'xÂÂÊÊ]’áÓ!бƯ«Ådœ©”w)¼̣§?é†e¾¹ÿ%)ùäÍ? #ØÛ+•(MT‚˜̃̃ß0`¬¥ºs"" ` æÍ‡Ơ‘R{³rÁ—ÀÖ*k i–Ư^3<Ëe¾¢NơYD –4üy·¸åíµÇ¡²]ăoQ™¡oÏyP}̉«Đn¨-uñ s yXK]e6*đ—ǜ̀¸q@F¾Ü¿Híúv{Ụ̂v=/Ă˜W‡ßdlo 0ñ9̃ă}UmÚœ™¶o!z±DÛ=ÏÅC‹U”ºœ8ħ Ă©&±…¬Ơˆ3Vü1猦_¿ư¾ªNߟüxMˆ\^,+ú{_ŸÁµ~u¡ÆÚªªT©½׉iñ9LÉ€9ĂzˆŒL•cflƒq}+G>´#ñkÍéÍ›ß&°Ÿ:Î{›Ø¸ñú˜Ó©o`Ö6´÷2u¸f‰HJi?ö̉Êyàt-ö°H©îdàÑ0G…₫ªXØ4f:\:ư¢OH=QB/³×9U™åJÆqûĂb¡?“ơçU Y•₫!÷æeÂÆ ´:1‘Qó¸ôî ?Χ¢KĂôÊ-}U¿M]¿ü«aÿ—ưÀïÿèÖ­~Ø»§Á 0ḅü=M– ¢Ü"À F½ũl–©(.xèzIĂ®µX)¤,4€EÍ ́Ñ‚’&¤½úP¾So­¥˜´Ü³[ñX S„}µë¢‹ ?ËóÇơăÈÇûö~¤Ă=ærË%S¯öJBûûu›C€k¬[Ü60ø¡T6·~›<²SÔˆ]8„>k–‚,´~D“:;Ü(¼bk2´`´®h®Øf•“²-QcˆsàĐ¹ ]{Đ³Htúɉ(Æ3+yc´·¨ç%•TSNCjsÍkµJE×ÚZĂVâPÊ.ûN»I™c̀œ·´¡ºê½ÿé₫§ûưNí0ÛÑ«_èáu½¥mËXV…>8.¦Æ“&Ⱥz‡¾Qpä‚àÔØ¹-¨qÓ©Q§î ËùÉb­@̣Ÿ³`đ;ÉëvÇăGë* ÈG ¥Nœ́F/¸µŸ¬+†úûÀí¢gÙ=†øh'>¡ÔN“…­§sT\܆©—µ©ƒƠê­µx æ=D_Za‰Ùö_“ümiû>Ă&zœ bä;₫è ÙKRÛ2Ÿô Ă!4€ëV ¡ s®”m‰0¦Ă4+©ơ ©\_ {ÙßYœ-™‹À} ,1CúVøYƒ®̃§µîCB­4R½ “áÚ: ̉€ƒ0Jo“ܯiiŒ®Ø&' .†ü¸µgĐ1ÇGưÄ̀ÿô/ÿ´ưØGie€Œ.Ù &¥Mû‘=ï{̃oÛmßöc;¶¼Á‹gƯÚ9_-NBỉºưÍđiÛ|b ÂÏ´Î₫9Œ¹S´)é2bĂ%Hw‡Di ÛÆ°3»yóaoJ‰‰ÍzÛÉôÑ8*´óFñ„Wœ(}a“ơË hœcfå-o{̃SHÇvÜ·{o]£naKœx[Hçô™OïÇFkÿh©ÇÑ́u¡OáZÓ$H&D¼8±ăjä¯/%]N¾¼xaá(ÜÂöbO²ÔữAY±»V_‹„wĐGüåÀ^UËÀÿǼ(Đx—¨mR_tz™đ"S´ JGM(3!4 '‚„zƠ ÙûƠ`Z×ÿRÿß,œˆ×›å °—I³L]̣"m«œÅöûåÇ<ÄFœ½§{>²­ß?Πu₫5MZ« QÓÎØÁuvĐM†ßÀäÏ/¯Ê7̃êçºßÿ˜ºt" :0J÷STù‚SR°Gh¬¸W }¿âh´Sü½zđɸ›ú´®ă°³ædhæX}ê?».‡IÖ§k”Iơ– jµ̃`¯sṾ¯è†ùwî@ÿZ°~€¼ÁÂ… ̃¼ü (34èëdÀQÇ?\Ï”8…4Óđ‚Ḍ0b²³j<º\1̀Yç₫F£¤à cä(A}el]éQ"P·Z–ÜzkqtVa´~ÊBˆBBD@Yˆ(…ôåø̣uÿú¾¿ßó‰Q­n}»Ú{,\¨Q##t89Hƒ®½æ”·°m²å˜Í*ô.Ưf±¡oÁ °e¯,v×(Ñ́́a}©hÔ²bœæ@ᢠ  ×Ç~¬–[a )F 4{‡ùÇợ1q$ IRJ©¶ IN¬-m ª–X\ägJ©̃Đú¶̃zî]ú–¶öœ28EL¼ñ¦ª6XÛ—û  FØƠ®ƯléSM[Ư¿™`È̉đU—6 Ú₫‚y´,_v°C²'̃g”lyøúT^û†­Á¯{N;™,˱g¾ÖjRD‚†Î¼€‘@mm LŒut¾ÎEç# Ađï“h4<<̣ öÀWbđë¼.Ç€ÆdƒñRE„G~ûPơ­Yi3ĂÇ!›œ†3èụ́vëv@Ê”8æäû¼¿‹ÙŒĐY½n’ÆU¤D-¥Øßă;³†ÁƯÂ2^g¼Îđ!-ÀT‚ÉNw+VƠ²ä×ĂỏDe1<]€Áæè‰'4ƒnßx†œŒTƒª²°ă₫³¼ZÊ1{Ù÷ËO+œØ£/¥ÿdy-Cxâr',1sư¹‚fàáY¾JĂ©'N{Ü÷¼ùØÓ̀ïc?¬º… 2¾–₫j×3g0Œ>ñ̀BA‹Âˆ52³`c0º…±.«/»03¶-l[Øö¸[Ó’v7ØÙ·[Á‹mÎ+øSF ÈÑBJG)XgÂÚßZÀ£("́,RÜ·ưH ma£N‰RL1hđA“ÁfQîû8h|²1E5£4´*¹[6‚̃û/pºLâ±?/|₫3÷Ÿ˜>îQ>“Ư–Đ×À:4˜»iî¡«}d-“véW½œÇbèê@¾WÄÚI Xo₫‚­,́Ƽ̣ƒ6…„Q > Í↙%¶¡!‰ö‡ëdeˆ9–á`¿=4̀…ư;ܾ—|«ƯƠŒƯ`ßdøư°ˆG|ïơQ¿₫ø½“¥ù¢ñn} 3~h–j~VüŸÏQúûgáúơLD”Zkó¨‡ëªc˜×Ñ'nÿ„c¾Zø¯ä$Ÿn8`ÿyrá/w•ù{öGsíyĂÆ-tù‹âÁSZ—±À̀IûÄbJ¤®L¡c‰ÿßî ÖûäđO•Ênß¶‰-n«Ù¥Ï5Ú8BK±#FŸsy[ñpÜ÷Ê,/ ĐGơ…»¢qµG€lè{œAÜÖ ‹ 6R›V0'¡_¿ụ̈ø…ˆîÛư/·¿|=¾₫tû)n1×|Ơ+µtñ…™ˆÎUëƠ.,Ë=́{ß÷¸ăxè±ï´ûƒB… ñÉq́±Çæ}JiămźaaLÙX/4Ö>«Qn:±rbÓyßÛøPŒF9ÅÉd[ X"j¤ 8)£f Ÿºk·Q뽉'ªæ–k¬lmó± ₫H<åÇÉ–¶Úë÷}ÛwÚÓ÷Zkí{ë̉ÿüơϵ֫^­µZko6·½ÚU¹–Væ¨=f̀£<{h­T̀ªŸY›‚Ce’$%‹;¾£¯D»n.Iªå%%Ú‡psOi×Ç]̃ü©¡a@́âß|V¯048/PD₫Çơ|¥Wd-ơæË[́&ñ®ư_NŸSÔd”zè^ƒ`ª¤úƯ đlvêæ©/€OÄ@Ó˜œz>§…ăø$¦.·É÷+;MFéä«.ç5q)ưè₫Ç»Fß…ưa­üdèûö3_×e{sĐă8´Ëóù¬­ú‹q†çJfå%»ăÆfK`ï*ueH‹ºêÁơ·^”œO¬C €•J1C kE¼0 {V Œä€ï¸)ààmq³Â‹'Ơ{œƠ:­H'_iVĂ´€:¼b_Î{53Dç­'²±á)¡̣ÈÇ‘‡ü÷<,>sÆ̉8fÈ34ÀûNú÷êÍau‰‘ñUºơó¡¿°È}FÄ̀9gu­‚r $Ü·û‘[¾Ư¶Û–¶#9e·°ÑÊÈ%X}́̉ ;2\€kzƠë*׳>1ê©Æˆ₫ª̃Kă„E§9 yÏ.× Kzת²¥?£ñ?̀®´1”.Yà8:MâƠ,¡öY~¬Ơ…—üäCWßtD‚å¦M Ûđ ù öÉ »Rhô3ÈP³æÉƒ ›y¼Îê¿/•–d- °?·ª\·” à"urxØ" ƯJzỗLÏÂRÅQ`hŸfè¾ăÙá]µ¾KưóÉç\´øë77̀Uî¼Ä4û̀µƠÇù¨µN3\™ü(\.f¦̣=_µüúñë/ßY%._iç ¢ï3a¯x1c)P=¸Ư½IS78xlE¤¤6đ%åU¿o[“ OfQ¼¶DØAđ$;|>¶!€1C²Đ¤‹ˆÑaIÉSå_*́aªµÔ?‘†m*MÁMv 8Œ³·Ö¿“Ô«wFp— n¥)Óÿơ,áµúwàđÿ²%p¼­Q ˜¸Ju˜ óùûk'àơ™1ö^£œ₫¸2(ü©`sj4̀@u*¿ñŸđª(Ø^ƒÉ€QêE%"L³̃ÑdÍØl, ÍÛ? X$g;ÿúñןŸ?ïßö[¾Ư·û·ưm‹ÛƠ¯«^—\ ½8ă­K‡ơjùˆÇ-Ưnùv¤c×]£*iYD˜¸QĂ#Ô¸ué±Ç†ÿ¥­­™]¤Qײ•Œî§†NÆT%bܶ¢…:!\,_g<¨ó¦XuŒRŒN•­.­Ä³‚|Yç8(zµ×cO)åX«ơ0DW³ˆÈ¥—-ÆJeßö-oxy÷í´÷­ßú­3½”R[Åa↹)¦iÄ4ü.ö¦1…Ë) ‰°́ơVYô"q¢H)&Pø7Z¡́@— Băû>ÖÚ*'¿q Œ<'u}0_w¤Ç‡̃»™Ï .qĐÅ÷.'‘¯Ïơ 6á›̀RÓ„¡›œb…ñ÷f]¿ü¤]ºkưË ̣¬;§i˜ËĂ_b<%”˜•ÍbxØö9Öe¤đh9~ÆÏß—ÍymàååBƠuÑÎñwñ…Æ ?~ü@aa ưúEºœ×Y{eï京$i;4¸Cö::~ỏ0Xpª‚gœYGc\̀„E®¦i æÊ€<¬´{N6óÂÄ+…¢1vˆM:ø?3'a ađ¾œXû™s:”Ö̃?›ËÖh)?C}:Om¼)VΜwö>àưḉ>¼IÄêvƒ;À̉~MĐÙz“fbŒÖæçbăô5̃«ô°ßq&X±ù!N‹£"ÖFà°…íHÇ‘{¾ß¶$×G>^ Ö`ó  6·àaó‘´ø`Ÿ„¿'ê~‡ü=÷Ưu®z ß§º‘Îú{¢–ö–È#¥¼‚¤ạ;ùß »7JûÍh{$„ø#öÂỠKW0ZP Û§ºeø`Ó8öƒˆpO©O@\yăM4£¤OJ^osª6jVû2=Àœ8‚0üÍhAK'¾̣́4!K …8°\ܥͣ^='Ç8…O^Ú Zđ~ÿúÓ ơmÏ›®Q¨Éâ¹¢¤1Ebªµ×‰ËhˆC[Ô‡ÊÙ“ŒEä”óGùÑZûÛ·¿=¯çTA¬zîר îµÄ_ƒvsêÍܾ®́hÎ1Ó˜ú¹Ç6†Î^âÓ°›°ÏÙ®àúiÉÿ‚á”L¶§<`› „a¥ x3@¸i_êÓCz™|yñä¿Û k–¯üT/ Á Y°¸…î´í̀o¤ââ~(&«ƠÍø₫HƠđ©oû¿́|. z€Q„a>0p)ĐÄƯ¬f äƒf ›D=MĐp‹hW€-̣¥ d _1Àc\ĂÀĂ¯+º4:£ -ÙƯ-¶Ï¿»ä_§·Ø #:ŸơùQ>`„úö¶+\g;«Ô¹ä =œá|´ÇÑ#÷t·N ï[Ø”¶*D44²×ûĐCk-å´µmÛ¶5ïf>9j1Q±3£M±ië­_zW5ø”·d«6˜@M±6±É†’z%3¯4*•h· «:÷,Ij¬(Û­MíĂ”iiXÆ9æÚk‰åj×ö}ÛÑ úr̃]væµÔRK«­´ŒoÓ$x²¨lQ ï 5s<‰sĐÈ^ ¡v¶E‘x‡ :m[Ü·w}ä½Ûws (±rHÁX¡=niîiƒ\¥M5fbt8ëR 5#—;›|¼ˆä%mÊY₫àóXa¶€&uÀƒ¢€Á”Yk{QßxØŒ "‹†dŒLty}½~]ÍRxȯ£ÆFæâ´̀ùLÏ̀rP¤Ö-Îú4µïlû§ïïêñ={ïä®(ÚFúR&×ĂU_½ám¾1h?]zz ×“¬K—ÉÇ>(Öq4€Oe,µ1&Bmç4-́«Á˜>˜A3-Bmb_k‡á|̃ÜéauÿD#Ă©Ưá¤ơñºß/µÛŸ˜#CÙ²GNùïÇvXNeÀÖ- iÄ] ½ƒff8•9ƒÙ¨ö5̣́̀XÓÂĂɾü©itÔ1·x»owüºm·uĐmễ̀1ÏĐP)Ú£ªËc̃g*¢K§ÎvºˆÖ+ ^Ơ •fËôœÎrÁÔ½Đk‘§ ÂϪ7°:$FY¸A«K3ă#€IDAT X­7<ă³ÆĐæƠ—ï-ÿmÑ‹àU[èHư=Ó& "gw‡đ˜”RäÓÇ€½^ Y×XiQ¼Ü÷ßQ=úB2xÔKU÷w”“±¸×Å»¨À…}k}A[øk[ë½Aô…₫¤–Z-;©hËÍ)ˆ¤/₫6Êx0M-­”Rfư3ªüUüĐƯzxÁ\.¹¾ŸßEäº.„vùàˆˆàOê»%ù„c©û_€r·%3]pđk–₫ ¹Ưß’¦÷ă}ôÀrØËÜ—576‹Oè²ó…@ ô®¤p]´“8)uî/Ú•¤IG̀í§`/V6Ơê˜|* |IYÆ›7¸¯2¸Ơm×^y$fŃêx›ÛĐ̃'Ah(P€ÖV›6÷{!„Ñ¿©èÿ×>¼çÁö&,M&v¯z'ăzçó½8y-Ö¢î‚́¡eègÇŒ <øQ Đ6đÊ\Zgk@<ÉẦ$ô Q¤[³mj¾Lf:´ÿó.“m+H‹üFßBoÛÛ-Ư 1tdÉ—\‚›á4jMÚÙÏG{@ºçû=ßßÚÛ}»ïºïqÏœ´ÉđÜèÜIˆ„Zo±ÇKnØ»îYÍEÇ…–-hÍaM¹6-˜Ô©j¥NEËƠ¯\̣lFˆæªĂƒđÔ~_ráj ^ô¤?ä>Ö÷ ‘"i×ÓÖ6›,.ŸUª²râÖÚ³NJü«̃Ú·oßZk~₫™$£[ ´̣j¬åàĂn“xMŒæÍ« Ô÷ #Á S:„ ₫.üêÍáª[I¦«OUMœ:÷mˆêü4Vr-̀4L'æK]°4@F\Ù7to_J@µ7“"±é8̣±ê4păª‘`”ÎĐC!ôÏsÈ9 Z˜­5D £)H0@‡mêEĂbÍê1 › ‡@!s¾åÛ=ßAø¹ï÷[¾íÛn€Wˆ̃3{J 4YêÎĘ¿n.:`×[R§Ó+jDCưœ²åxFópNù<ßưˆ_nÎS" 1°rˆ!¤€3Ă™0Óƒ¤7§A kX’Lë¼?,ô½Ô±rPG÷²JV^¿bNÀ¿÷đ)ÿçy×i5}ẹ «O¿u#2-́>ú4Y]¬/Pª®ĐơKư¡s¶9Á”µÏÇ2;Cœ Ưu8¼Î]}Nû‰̃¢#7ÉáÚu’i‡LßḰcƯ<<_Ưez[»£ơvO@dhxfƠ®T{}O‡ÿ°2ÁMP̉rçzyy6©_€)ƯĐE-dÆD}§»ÎrƯ¥z ‰ÂGúéí'<̃NMûäØ:1!WÅù½dt¯]íØ²cˆÚ̀]^¤Ébă3ç&̉;‹n¼ô'<{AẳxÔ¶3d–đÉÎŒ/́.×ù0Ñ'¾Å¬ù¸n(ôoïÖ'Ä«=̉¹QN£h&nÚxh‚\ë6Cï;°N>Ù{­;éú´ø³~âỒb ´ƯưÀ>̣Æ“‰I.è^AB ̃A¸9æO lk–đfwem̉¾ß¾Ñ7":̉ñ¶½½å·÷ưưă çÙΓϫ]N%j̉N:¿×ïù̀G:̣̃Û×ưë—ưËûö~§û‘Ëø/0đ cÑÄk¼ê•S̃ËpÅ̃v‹Å 6_vD&w`”–j¶<–&CålgæŒi;Ü6\¡˜|>êÊf£ -²N)ËJú¸à·¤(‘–jVªs×Văß¾¼=®Ç_ÿö׫]µUpúÏp¦’¶´Ư®Ûm¿!ư÷8/q(“t‘Mr”RÎëe¶Ôb‹†}ÀG5#@Í.b"² 8G†–PN™D Ơ¨đsä(Q¦BîÓâw.Ê(’˜¹ơæ<:V;63Ç~RH*îX¡‡*×À¡ô™y’Â_O\öD ở»ö´'%ca€ŸLóơ{U$¦½ñÚ(&%J*:s—|¿*éÉϳ… .y–현 âäAI Ă×Ï'qÛ³Ÿ3ƒ“ỀÔˆ"‰Xû‚źùpß{«kÁÖ¡¤˜¦̣Â:åÀ+dè₫J ²ïFæƯ.,EÊ¿üí_0q¢&«:yP»|́é ,_í`‹ÓâÉÔM¤6¬ö:‘̉¤‰C̣̃óñ4ÜuaS₫_ôi’F́hăá¶Íg·sŸh~/ú¼Â ‹B#²…œñ0Ⱦ̃ ̣PäC`€y…íÿÉRimƠ±ñ D“0²ÂZ:^!V)NXün €m¢˜›ô“_‹ ~—†€v‹ˆ™—ÎûCÜĂ~¤Œÿ#`ü§à/́ª6Û?ÑÁ‚¯¨µđj̉lsî&!³$¯¡tÄv|¬úóI±=$%fvưìWRßÂ÷:VD¤2f”.Æó郴¹øÏ›§ÿØmè_aXKga3myă’ÍgÑop²ûÊ/̃ß|á¨,.êÎƯ÷OV:Æ,÷‡ç²IÆ–è„‚O¯R›†A¢ô³§ª/`ÿĐz½xqÑZ¬¶ÑJ3SJ ··’˜´ûJgÛË(‘e6ç̃ËPǦ}Èdåkå~½°¾đtơ‰Öđ+¹j\ºA}a)¬czLñ°Y[–Ơ©Íf|:yç>©0ê­’²û‚ØQµ°PëÅ8rq33sNÙFØqv™ÚöÑ#Ù8o \T„E ªMÛÚ{çZgÎv¹Đ>ß|,kü4ÖÚ@߬')°p“æÊ BC9j‚©û…+–|G³Ÿ¥s0ím 7ÙÁ{ÂzăEà7 Nb4‹›èơ/V¯₫ÅCGÿ-̣Ûùí£|ª•ơ}»Ÿơ¼úU¤å*%mö8ûùÛơÛ-Ữ¶·÷ưưëöơm»çûöÛ~á§–z^')5m-´mÀ³<·¼ù8öĂ8)ù˜x—½çáyWËU/Ë(­HIÅÿđ_óµ§=oy‹›]ifT~³ÄTó¥öZkmÔ0Ër ÷D^I›6HñG>4+ªsõoï{̃?¾’?&Ujḥ×Çí¼Ư¶ÛưvG3€\ôÚ”̉–·ëº®t× Íñ%•fwS“b\C:SLñ̀Sº e°U? hé̉-m€ùevM¶ˆÏÙ́¨Đ0§UØÂ:#Å2>Ø@Á¢Ô‡̣)¦ÖZƯçö|uf±b¢®»`—œ}{ËOù‰#ûøöó¯?÷6^Ơr¹:bƠF‰+†2Ñ)¶ÓÉW\ÓLC‚‘b¥!ouY3"Ï^Ñ㉅œ8­cÀÛív;n1Äó<|üpʼêrÊ·÷[yR"!ôƠ6±‘ˆ4j¬%QâÀ̉[®¤É₫d kÿ&̣ Ăäh¢CVZ½l•/ÆfK£µv^Kù9 ‹†!6>K2|Ÿ°̀ÀU;ϯĂj *® \Ëb#üPÄ÷G6Î8ñ<¸`xÿÊÛôëƒ}UFñoÎ2GN³t‘€³Ø%Îs‹aQ2…Ú]+ïT:\M N ‰"‚’ùNÇöN‹“y°:ë‰v« i³„›B—M#Q́JeⳉbAÛccÛïq¿¥²G¦µÿpeñK'*Ú›¤·‘æ×7>q¿«]…́ó7¼97f̉®¦ÅÈ QÁË̉ ¦” 1‰³fù}-}UA—^kE‚xI•™X:7±1Œ úp»gä©ăĂ3đ̉ÏĂ>`ơœ5Ég’̃ Zƒ•ê…>ẓ9¡̣zU»̣Z¥Đ+œü™¿î¬LG50o₫° ^Ơó:Œ 3r¤@NÏcײ/]!„/ï_Dåñx<¯̣ek̉k¢™ŸtSöàp3Yµ ÂĂ—®‘ĐW/lZbă½Ïñ©¦±’\Ñá—…Xº`à†jh-‡̃{i%ïYIÏz>ÏçddQÀKÁ9ª¸u4í뜆‡3'RđB‚@ ®®/ú6Ut’—áCDĐMVÖ€pŒ•µhéhñÓp vU•("’ÄB^0£w@±…&"Î&__ÉZM,±vϰh|¼81³Ñk–Í»kËù6r¤v'DV©Æd]í&Fô؜Œ!¾÷³AZ”…DCæG¼̉zG90@}¥uæ†Ü…Zà{dæÔ&.¸jƒ̀&‡=fÔ…OücæŒS~y1ë¡îضj0iæ¢đz÷`…Ûlg0‚üÑ‚(ªö*Ă2‹1A!àÜ!¿ÎDT¨)öøV¾ư¾ç;~ÿ³&½§;åéĐơJØơ €MÛzˆÍv;ÜFXƯ¡—ûß‘R‘Y;ëæ“g³I†F–I…Œ¹Ö^©%´!Dôˆå–o[ÜDExư‚ ƠËX\¤sOzè¸kĐ#ùEóh2ME|́ăĂSÔ±Úc2ªƠ¦Í₫ù0Q ĂÛ»‚•‰á+Dç„l + a Ăƒ,b®›́ÛÀ<6‚hí́jOÉ‘Ñ(–R'LØ¥½î₫Â#Y‰-́á, ¾Ÿ]d¶]”™Í9w´ ³Đå·¢à™Ùæ²50 "gƯÿÚ8U1¦¨Eù.¹CëÄ{mù>¡ó0¥9̃wùŸá, 9®¦ˆd».êÚYÔêÜx}`2Y^KvÓÊ™‹ ‹v×é®ù~h"ͼ:ŒÑk‘@‹üWÉ©>¤³"ú}ÅÏn¬·Ä®…Ơ•KçÀäS}C¼¿ƯUơ,çÇóc=zÜ*À Ë5¯`,0g2{€*Ü/¦‹~„½Ü¾l¯Ü‰~…˰x()üĐdHA‚$‹¶ä₫ơbhíü~kNÏëOw‡Çr{¥Åȯ<ưúñ«ÇéË­F' Á,Ḿeäú,­÷˃9(èửëj×wă;!.sÓV1|%ñeđlO"ÚÂvÏ÷·üö[ưíïûß½}ea­ Ơ/”[ÅJÂ(~pøå¹Ø·¸É&½ơ*pÓ©đ™¹¨KO•°Ktéy3¬=D;Î}̣#îÀØĐv9Åq| KO!ñÁ ̣ºôr–̃û‘À!ÖxñELÔ§I+\¸réăúØó₫q~|¹Ù̉vlÇm¿Ụ̂SÜyǘk‘̣a' ”Î=JDKcƠ'G‹Z9Ẃs„f=K¼îw´̀!ñ^|1¸p¢ËMï­´cL=Åcˆ́ụPSH ’BBQ‹jŒ£ߣVäÅ®iÓí–n8 làüNl!5]ûƠ¯¹×yRD¾1Á~î# ¸}ʺü/›à¬-¸‘aÏô"yr₫ºoưà~à¥âƠ6m½ö-n]º¶–̀N;̀^ÈÀÈØcµJÍ-;è¸ë´(§½œZ)r²‡b»ñBƯ†ùC!eoYZđÀè¯.$ƠJẫ·<\Ÿ‡Ÿ Ê Ü“eí¼5¡0ˆ+:á|ÔCgæ arÊ—âl)ư-ăXô†ßy€Їçç¡YåÉľYM¢ó(È0ÿt̃¦¯X“xSHB"AL2¿Öh₫oè‹|û]y}́`Ú°B ˜vNZü‚T¶ÑBp[¿Dp&ư&Ḉ4,+æD;uCư#Àk¼S›1RŸ™ë5d6s¼0ơÜØ½§¼8NWY»A¬NG4|6Ù³́Œ)¯œĐÄÚ–Ớô· ¯z9êu»j̃dX=zÛ†uå•Ù¬ƒi4NÜ< ¿×mÛñAB´hUfơø—¢ß ‡&ת}e^à|<ǃœ¶fÍÎ>œMh<t,¡C¥àÑÀzÆ.¸Ơ[|i>áèzD̃8 ₫?Ù‰™øăùñq~x{cëjé$Ơ]UÎ>ÁörÔ÷¨‹yM,»½#;N›\;¨—q÷à°”Vđ¬5iÆ,Y1qH!o9•d†¬>¢¤AĂ¥Óç½C†c +́l~1Ó₫Û̃âvä„<ø™ø[1:E~¥uºB¼Ûh:`Ó%U¸´†ÅºgơG aj ÖÑ­ƒs/­êJYÄéëß;Eg¢̣Ú:wOƒŸ+¥u|¤/mÆ) 8Î?_ùj^E9ä<)g2Ñú@¥{¾¿mo·|«½>ëóÙÏö¬R}·*RÊU~½~ư?ÿÇÛ¯o_÷¯ïùư-¾½moXêÆ-ö–½…ª1‚̉3_yÏÖÜ÷û‘¸é¡ƒÚ̉v£›,VÙ¥–ZM*Đº¹¡ăb1‚`Ề0SwêÅÉœµwÏ đ:À÷Ñ ́q?â³Â0"ŸÂK¦r̀±ÆPC @Tở«ô¢ª¡‡'?Ă¾=¿ựă—·ưííx»ï÷ù¡&G|ˆ)¦«^W¸Đø«–Ö[ Ñ9µ¸VhÓÊæ:âZ…Zë­qó½UtásæÏJ“G₫”¥̣éj¯1ÆØb Cól5Ø̣³}& Ë`±â˳y— «[zc§êµ)Rd Û=Ư…³¨Fe?H€J2 ‹gHz1ç2$G?}Đáu Ê£>¶•+ë$²áˈĂôIŒ1¶ÖÏgAº€ %Q’$¹hÓïÏï&«àĂïÂ÷p/V\[@$Ø3'17ß.ÖëEp奙LŘ#$ %#:™“!}L†¡Íi6+ A+¯ú]´[a<‘~çÎ9ü ́½Ăƒ;ˆ7!XÎ*,MʺµÄwÈ|e<Û[Óa\±Zw¸xc1NM1eÍÔ ÜN¢c ^§ »ZqŒSŒ#ºØÔ­¶À Y¢¶y«ÅÜTÛa²–Âp.wѹ'ñùí@ä°amÚaűÚ¬í¥³ü÷´ïy÷êß$1C”å̉ ?=ˆÿXLƒ[·Á­‹ZBˆàỊ̈<Û‰Ơ¸ji&ä(÷Љ÷ûĂ5K ÀŸ²©ZyG^­H¶7½]ºç̣ú:÷¨W®Ï0­|‡>^ªƯ“e|÷© ˜íÄbiHƒÚdĐƠ(üRL˜T 0%%„¢WTkî/ÏGµ̃ixÅ%‹ d}¾¥ÿxüX‡Tâ₫ËS3ÙP«xi°Èü58l v%Ö¼ô¥{VK“ßñjó­ĂăØ^’ÎØ„ơv̀k}#ØL®ẹ̈;øä;|<äÑ~µq¸ziÍÄÈÀuÜ<=êălç̣Ă ‡·°y›¾Å €«ƒ‘hˆcˆ–ê¼OTf‚ñƒA´vJƯÜ[‚y<,.C̃„¼º ñïG’Öû2Âi‚¦ÂQ#çØ“ÉƯ+̣l9ÔRl^Ó}?̀–ÀµN˜—cÖ¡ñ^‚édk­¿Ú9̀f#l^ä/= ïưíư?üûÿp»Ư₫ë?ü×o¿}ó%ëû ’h¾_†Ú Q›¿ƒ8đ *5…»µ@/e·k8¥/J|¾¸½¯ơ3›‡©¹ă…¦…;ÔcDÅŒ̃r½é2øy<ê·ă§ÛOÿ.ü»³[ÆûÙΪƠ1Gy”V~á_"Ç=íïéư}{¿owxbà†x45 ùº̣uÖó¸gy ú¶Ư¶ÍÎ́[̃́ơw1‹Đú‡lSé€0]ơ¨2$ÿ;íº¸Ñcki‹Ê´‰‹­pù -nG:¶´e^j²ÄĹͪ©>ZÂ40îà£=RIßÎo·‡q¸ỒÔIIcŒmà_á ĐûÙói÷´ó,’&K®±¦˜Đ˜£G°À‹wKåºöưØ9p)åº.\Œû}aPeà =@ê)6[ÆÆC[ª˜"ôœŒ]o ]*w!¸Z†ñüu^̀Ü[ß̉æø w.½ ’yˆ˜W”V|paÇĂX`=vö_^+e]â0 ‰“Sœ}¼Z3 3 ch>>æHZyœ¹<ˆ^ªÇ×½F ®À–ä³ G.¬zp&ápÂÀéă\íÀ¡Q›`µ̃¤ ÜTx1A³ë[Đœ÷nŒó¥úWR÷»ÔađºR¦×d¹p`Ơ¨&§`óJ¾x¼gâ˜lôá%ˆº½`%4 Å₫ܯ—sgTM¶8ùƒ7?xûP—ZƯ)Í`lfc{rfåHÈW¦À†F¶å~;œ?»  •¡q0đÅL¬QÑ‚F IIA¹ùLäà©À8Ẫ‹¨…¡!ÖàÏÔœ“€ñ;ê4^êö’ÏEcÉ;3(́½îwµƒ—V̀LĐ„`¡{¼zÈđÈ(_,Ô³¥•³@76óJZÈÉ̃h9ĐơÎDúFˆ$¤GsQñ,đ²{ëơW!"ç ˜gA~ă R¢àUÁ„Ơyó'È2ËE­~đ2̀ Á™J9Ÿ ðËN.e4W£•yAÊçAG¬ïr³d(æ´¹¹ơ^íL,RÆ\K^đb‡™Ơ¶GQ¡u—éhäµß€,ƨICï&}úS±ä͉ư/¯düưç†ÊËB)Ä¿üü Ö®F"W8¥t¿ß‰èùx:¿,Ù?˜D^ÿKvèlk£d©Ñ ’³¥MÀ÷8P¦ü‡WÜS£Ÿ#ƒ± É P̣í–éÉ<Ÿà ±, \&gnuÏí’¦à”à §7đq倕́®B£÷›Ù‹ö̃₫́ ‚m1æ>:?´³)&'÷4ßûKëâd'}QËù”R:öăËû—ûq/”ѧl4!yƠ‚8—œ¥·ĐC±.1À•úܦƯ&ˆŒ̉ºnk;û ÁŒ®@¦³êä#ÁÏđÀ§˜Û‘RB"U«æ´(†Èѱ%E¤¶1>aÓ)†bímaÛö «úYŸ«YÓƠ.¼Úg{>Âă×ë×#{ÜtÜ̉ PôÛi’lyè°¼„ɽ‘uá ·Ë´ÖkX†»¾/)QẬC7«©aC Ü`& \Ơ È‚´‚#ọ́?¿2£ëơ´}åX¾΅È¼˜äXqÂ&#A1Jƒë\Z78°åœá‰„mÙxƒlb§̉á"_lÛ¶#j4Đ~Fµü…5iæçÓª©¿zÁñÖ—kå:ŸÁE ë/, gc¸™û¼+Ö“Fø&"¥j ‰ˆ„̉–”ôº. œ_°?²đíí-„PK½Î‹2:{9₫‘¸=Îê3XCN†™lú¥đé˜8ʾºf[8$.vz,  ~¥x-±~>¯íÀ:×¾ÎƠ±Î]Ÿ>}nh™‡đ0̣âöEw5kÉÄœĂ 6æ…y×́©ÈÔ±̀–ciç|u¦˜\Vî=– !mé~»·Ú°\è°đ́ ‡¨¸ë•IaZ`Üäf| ÜàN´̃¨O*çL͈#6¯†lÅsÎÀüpÿ°éyé \ï&Sjó#œåvdöë¨Ôœ§x®ƯÅÔ»¿Í“ĂKúøåÆaNE€«ôú`úä€ó…Œ`³˜ÁÑÈLE!ëƯË,ư½%ÆÉ&dá¡îjưăă#pfΉXˆ.S÷ˆơ™€’?¥“í'/¸”?đâÖƒ”†kÙKĐ9¨q‘¢S¼;µƯm0S'½́S/ÿf49Û¾ûq• «ăA8[͈Bpß&̀uaˆ@.¹ü^lq»̣…ÆÏbêûƠ‡MÓƠ¯g{~+ßRH{Ø-J,î{Üáä7´œ.G2UÀm¿¡ ¸µÛ¾í{̃)“†b5•z0hú‹…f¡Ï‹ç40²^µ‚ê: ăY!„@O?âfrŒƯ±™ßEM)¤PXRΑ;å 5Ä÷sßÓîû~¿¥Ûö#Îê1j/c„iQ̣̉™c ¤=áe»´ºqJ#ŸZ]'ƒwºoû~߯zÔa“ßa´ÿ"÷GĐ x\&ÔY³ŸIN ,$ „ˆ¿›´àVÂ?9%’&g=Ư…„7b§Y0blÿ|zÅÄ1éǸi 2Ds²kzŒ–ÿüLüÎG.ƒBă{…5đ^4.V3ÁSJ†'ºßI†ä—ÓÈ ‹´l­‹dQ2,¶—¸î`‹ư€ 5‹³ í,ħ•€@ƒhĂ=Ÿzy7>̃Å'ăø^|ؼfsèÓ;Iv]¸X“Û£FÜÇ̃hy‹L6'#M1ÇÏv̉Yj±ê±É³<ƯÓçç>¿ơ-?n˜h́$º®WZɪÈú¦:ÇÖ}»ÿéưO, ®¼tÁÓ ™²=í㻩è‹v¶ÏÙ™po?E¼Ư_g‹ƒ"6u^G ‰k…?#ưF†_‡#^î"ŒŒĂµ“¶é3¤‹Í₫̉Ă8̀`Fcá%QÜÓIĂ¢/tÀÏú67[\,xyƠÿư₫÷yÄ.–pü)‘ḿ\óƹTk$Ä }—fÀL›0¨øàRo K ª7P 9"±×££+™ïn1ÇPwµk;6 Ô©×^WbØ ŒÖ9f6¨ü_ÁËÖ[éåYŸ |=¾¾moMÚYϳg=Ÿơyµëlç%:À̉Ë£=ü>̃̉mûvô–é @>¬ôßnhîû-Áq{̃90FÏèXđ:­èvH\傲¶Ô2Ç"MÚÖ7L̀8rëÍœ.5ˆJ%SâúUÚ¶­´̣è"2ÑĐÀ`üơv„ĂFäC wµ+‡|¶ѳUkƠú¬O©°’‘­vK·ûv?̣ü¶ 7tĂM9À̉̃›a±¨±À́ÂßwíÓCÜ¥¯sjg=Ö«’R|•Á 5:Wó–é½oƒ¸À‰íu*y¯A±À„„5nIR¹‡®ª$I’(Ẹ̀0ĂÖo$u¥ĐM:•8¡3Vá8øơ_±@‡Ø…„F¾RàPCŒ±¥A*»Œ ŒÙ̀”s¾Ưo$Tkånû…™øÇÈ Q²@¬0Lwxu;£Ă߈ça(©ü¤ô^ ç ~°ª"–Đ³@bY¼q@0u:úy7_6¿yĐHBˆ3g+2èÅ»}‹kN10×Ñ‘JæMăê† Œ¢¿ Ëp¼|ßfyŒütpë1LXKÿ0üjưͳ•MD¥ộ¼µ×oÏo×ÇYOxà[*µ̀æ2n?}ưé~ܯó*Wq9%Êăœ33.)¤Húm»ạ 3€ỦĐ{§@½w~™23G!†I”úÀ!åTk5¼fC´L€Dê÷ '̣ç>-P qß÷”’4éµ5Q́Ú¶¼!âĐ™åp2äÅ›ËÍœsL^@xf{íxFĐÀû¹Y[=ë82êûW̉ă‹»ÎÀ=éw£¼yl.¬9+÷Ç‘==̣q{¿ưéOúơ·_¿?¿?ÛsúƯú\ưƠ˜#¦¾øéf+²4·)¤·Ûû±ïZ…¦7«V2É T,‹,dbˆK‰µ̉‡^8Kø¹ äÅưS¼ yí“ưÁ‘ÅŸt"ÖKº–L₫:×+/ƒG:›ÿ¥Â Ăyr²öC\¹ë/ŸÖzK¯ôUuíOưú‰Ï|åOˆa±qƒ¼¤u“×cÄăˆ)²̣U®Z«´^Ë`đkw³©Ú§ôñeÉùÊĂ3†Ă₫—ị–x^/·ù¥×A¼óû!*pd´Ç·ëÛßceAÉÔ´f/|[qܦ”H)Å$‹xI ØG̀óK^9m$Úơ¥@ ™^ëEßẸf`"î#Í`A¬~8³gĐgÔת[»L.¾Bvi£”„æÉÅO0ŸY-#Ø¥öf^3׉Û놂î·Đí›&?äwAcsWZÂhü§øvàŽ#ÄëL¸ơy5Đ(„‚"ª½FM!Ô¬8«ü.àÇU©åoå—o¿`e£oäÅđÎ÷JÏ/³ f˜Ùùơ¡iĂy¬ª?®̣À@àÏ·?§÷{f́́W¿‰Û?Ö^}ؽ/>wœ é•G>À›Û߬ ØÛ~»í·c;¶mÛ¶Í©RNªcÜö-„đưÇ÷ß¾ưv^'P( ¶ØSĐ+ëüOÿñYÿå₫Ë?ươŸ|xgĂ}\¾Hÿăÿô?Ñ?ÿÓ?ÿüóÏ5Ô*ơÉÏ3d?~|ÔVíû8Íæ5uª½ÚǼb̀9½3’Ï2ßĐEhwp8½î_û(kX½ªö Bn5ûu@±.̣l²¹œ!Ă”ÖAư04Ö$5oÈçáåÆùLÎ4q”vfä‰`6ëë߇·42”¼órÎç!8ŤÁÈKJZkí½c3t™Ó\#än…q­¥9ßvVîwà‰ábM&ÿ«YÜ+¹×¤O±p6ÛJvu8ĂH  )ÁjÚ"œ [Ø̀„~ÁÂ>âp⋪ª9eY²*œÀ£4ñckªFØÛKÚ€÷^¨̉ø"XUµ§‘(L/?h¥­nq®˜r«Á<ñ‡ÇÑ#¿ÊöH¼̃¬AsÍÑ@ô½Q vå‰_…ơD7ç}„uºäYcKâØÜA\Ô»¬ó¦O¶ÉÂåơv‹w ?$”´÷ND)¤{—̃bƒô¹ö$téܘ‰×D¹zƠgyú3†ÇƠ%È!„(Ó ÇöŒÎ]zù”¦Ñj»Öœ\ˆ́°̉ÛööeûBD¸¹^÷œí„­m—É7FˆbÈ:†{̃‘M†_ïûû±ïûû}¿ÇqlÇư¸oÛv́‡µ1äœï÷;ÎøÚ*1…:gë(ƒ=Gy´Ö”Ï—‹•áŸÿôçÂ÷_¿ÿL?‹H‘R©V©%”ØbZˆL)&8Æ{ê»́`²̣̃íj×£<Îzư<Û Ù¨qW¿ơ¹×ưHÇQ#÷t‡úHÇv<†HÍ›”‰bc']WH¤(Q¢Æ¤ ôhØh°GÄG«&ö#0„–™&dv,̀ב±OÉÑ!Ø?ܬ ‚¦vẦp ­·n¬ăÉê<$±uêIíŸăuºÁ— QCË% [¸Ú0…‡±†?8¨₫›4´ˆö~MàÚ}«QV5*++‡¢D<Å₫ăœñù¼­7H5&o5,“¨ÖªÔRÊU¯³W»®bu¿ÿ*½L['<mØ6_N6ç·GĂ₫€ ÿ•ÁÛÑÎÖ°(,—mÄ7(£±úÜU¬CƯ_¤ ú·É8¼¶j­©‡ÇuË€2$qâhĺ9U¯ÊG.æư2æfV…`ÚÁ—°`Êf¯Íª11‰¬“íTl’[ÿHUq̣¡±\¥”óăYàŸ ú¯½‚σZöHG ö}R PÖ!®{­;írt₫Œ¬G Kf½h[—.ævŒ„ÁTæÁû đ¼ËØƠ¸ạOf)ă>9£FÁYBÚ¶-…„èI(‹ DS®V¨€mº>L&À§Âí³Äß\‘BC(⇶}0¬Æ†₫Œ¿̀ÔXCºèP}Ó«/–ĂÀË©9üt„cر¨µQûöøv]×Çó£öj68‹­­}› h„Që[øÉ@­ˆ'¡F?ÿú3•RơùRëËäëzÍ­Cûë…Vïœ-uï6Doy±rrkgÅŒX'lÔæ#Ø̃ÑUgÔxï&YÅèOË~aƒ«Ünaè6=8ÙÓŸBx©û¹°M`œ­^úZ3Ê$åk§´²*Vâè*ÿƠáçấâd–ßÎr¹ẤÇÜ0T̀t.-=¿₫qư/ËLÀ‰¸̀œ¼]UÎÉ3Óºø\½a7BŒ &Á.´´ïf7&%‰ï\IŸÈx³%jĂ`ö>*rLtö|>óÂÿ†ª_)¿»Êc– ‹pgfˆ}çTa,àÀEưQÛ\èË( ‡ü§®Ơd Ñ~Éơ€«ù‘ÉĂÄZÉ¡£̣Eï­ó%Ök|;*́•4¦̉¾ưÙÀ̀§†r^:Gí\(CsưááG0Eؽ·Ôºt€vMZ µKoÜ4¤œ®Ô½¹íKđ·?ñE=t¬‰’4iPeĂSúÿdøS¹9,6w$ €Ùÿ̃pđ_ú<ëư`U ?H¸ú•ªÙÉa,RĐ}»ß̣í¾Ưß·÷ưư¶ƯîÇư¾[àî~́Ç~lÛFJ)%Ù„ˆ»‹EbPâÖ*̉ûƠÿåÿü—oç·ÇơPƠïÄ5Ù̉FBơ¬)¦ a ›'˜JU­ÎÅt÷*2Q1téïûûƠ®gy>ëóY?ÊSbÍ‹gaJ°Å홟·v»µÛ=ßoùÖ¥t`}vé °óđ ³âM¥$¸F ŒM7I;!C¤ŒGDúR7¸A₫2˜rÿDu˜)•^@áC™ÿ2ˆ Œªœíg¹©lÁGPnÜ"ÅÆ-i•-m#buÄm:øG‚ôS+T́´ßÎÂöáđ\ô=ÂËS-đú[ù2™]öbŸ`zåSloæv3Ú'ôëµU+;zơ¸x$§XhZ7iă‹·#ÍÎS”ùT‡”$µĐpq4( ÆI¬GU)“ă+&ÆííQ?ÊÈñ¾Ư¿́_̃ö·#8&»vđ"×'îGù€lÀÇT¹1¢—³os̀·|{Û̃̃·÷·ưíưx¿owøëßÛư¸ßo÷c?öoû¾ï̀ _‹“$i½ñHk:öă&HñH ¯ùêF̀À̃·ơ­kÿÏÿå?g̃Z©÷t§áB°¤á–xñ&¢p(nq ÙÀlĐB®z=®Ç£<>®¸ƒÙ¢Ă¬+üL'"̃Ú[éåMßP4ăf¡µÆ"đfC*Ỡ{ ƠËD¼Ô]wÛ«9ù´wNT Ü´¼\l×hÄ%*©T‰!NhovÑbH9E‰[ÜB .&ÑE»îØúG`[G¸/ö(CƒÔüg°Yû©ùë_ư₫+ [ G₫4(Ât5®r̀±ü±¾£ˆ9GÙ,epưđÀÂî㬻¹³ƒü*Å0{C:[9ëù,Ïơv?Úas†ÎÎo{Ü1ùqiÓÊĂœûN´È€.ƯJg‰]£[CG´–>­"t” RQ™awEÁd[Y ëĂ’ëØá³3D6so9dŃÄaỤ̀æ‘´«XË́}]T&¿ÅîNk|…3 JFTü~Í}C6#5DøJ ’8 :ü=ưƠ^¯r]ơBơƠëûùÇqă¶… 8?Ø.<ÎUfÓ̉8M 1:XUj3̣’XDœëŒ¥nâBí•ƯƒËD€IÙœ[×Çv ùwv¿s iđßnúPC|»Ưj©D_åbf¸÷LÜ7'jË~™kÂT‰Hi¥J½ê…›8¹ơ³Bæ“ÏÏ If¡§û'ªÓïM”ß}ÿW–º Ó´N·'Ƹrh¤ó¢:ס9¦a<5‹™©î•(Đ?µ K7 "É~ˆ’ºyå:»î# ÈÑKœ ÍQÓz-bÅ1âxiT‰iKÛ×?­¥ÖR{éV đ¤Q8ƠÜüÉ₫ù„Ef1QlƠ À;C©›¨lmÖ·üÉÛ¦{~đÚÀ<70hJc¼Ú”Ǿf¤T­µÙzº½|N³¥ä0_;!oÇq DV/íkÆ|PMàC„Ù,"Ărt¸¥²‰Öé- {µ¹ g}8ÿ 峟̀̀㤱ưhÜWc₫J@H! H“ơ£ºÓ8¹i"ÊMÛ¹ŸëBúDS¶‹GÊ#¼ió‰Á<ªµ+©§  œueÈèx À0¶–éU[ŒaÂËåà̉8‡*’u±‰“7¾ÖÉêxC£Đ'—Û®êÛ!̣™úß̉NḶâ§ K»0qü,q›#¤C´!]º™©}iÅ à=2ŒY‰(hhÜÜ~Ë;s”™¦Ñøt̀ø()«yb WF ÔgJ̃=₫vưöíú¶Çư¶ƯîÛ=ÇüuÿÊ7–/&¿êu–óQ̣_÷@‘‚*9†øQ>~;C‘²·ưíï´vĐư~ß̣–s†(V†ơ.)væÉî |†.½HZægùkÙĂ~K·=́G>̀qO'bá€êWP›Îvîqß7ëPÛ³ 4?ëñ¨)ïƒ÷71¾•óÁµ«_—\6 #ơf J4è.@µÉV{ÍỠ—Å*‘Ơµ'ŸÚ„%ÍŒÁl¤è1 BpE„»‚̉ÈÁ !mJ‘‘u?î̀ ƯL9²Ơla ôm¨¹k26¨1‘  Q¿Æ“¤,¹is­¼™“ƒÿ’+ơZđ™C§n©ºÉWæcâöe"^?yn÷j„à›‰èÄơAD¡eä89dθѥ•g}Z‚^}>ÛƠ¿oơx̉ÁC­ ÀO´fZ uëÅUĐÀÊåDt¤`eQc¿-RlîT‹»´Aˆeè›I4Nư=ïµAkT9ØvRO9dD`6j: TÏ zè’ó₫Á/÷*M†½¯;BZä™̉ƯüṽD#•É$Y£Ûgá „ÆQeÅM¬­>ÎÇYϳœp‘'N  ëxÿ9ĂÚvæ¡Rđ·g6…~Uéx „ĂÍë?ëư\ %©/ΆXö€ÆưµÖ1$—µ»S¾u܇Ѵ‘X‡Ă•Q5’ÁùøY§$ÙôIƈ3$ä 3;·QOû߇̉Ÿ{3 ¼ ün|­Âgc¯ŸÛ<]ºQ:Âqư üǼ?ư @hd\%Çéº1>]ÊY¤jÿ4sÀ„ÓÇŸï5ºÄ…₫îÍrè¥öƠ6G"«ƠæàwÉbÅ3» Eô8Qă±¥›îHW5¾Å·Ûq³›;æđ1DïƠç¼( ¶̀»¢=•^LOB¿̀̉ßW5yđ1•5µÏY3Ă|ơJ&÷óˆk5¤ooFj:bîÚƯ³’œ8·HFײíÈ»₫‘œq÷Ú'x ‘t(T₫₫ŸQáÑ3̣v¥ụ̀âå=¥{ÂàŸÓÚ‚Q%3±̉ 81ÍLAfk5Đ©¹O j£rv¢ z€Ï.×ké̀{ÍO®®hÙ† *F1œ(Ùúd.d’µn¤Ơ&mÛ¶¯₫Sü§₫§ï?¾£iù=«ïeƒ̃£<œ§]™êùÄ.*°YA ‘cÔ¸‚ôÎ̉¡ăñ̃Oï ÿú }x9è@hl´:T}>5ÓDµVZi­A\U«¡/øu¶¨L‘̣)5™”:u4F%©.¦rÈIŔHÜZ¦dñ#ÖȈăÑÅæ…b7…tlÇ‘œ̣{~§}4i­ÀÍÀYNSRÙcn[ZùàÈ©4̀¿>Ûư~ÜïÇưØ“ÄDLæEƒ‚<]ßƯb3§jĐ,SêÉçÏ#ïú₫ßx±RZo}²&TE¤hñ*óÈÇw˜̃ @Ççơü¸>@>ÑY–h÷.ưl§cN¸¼UëzXâ É’zBhxJ)%•½î[Ú®z=ĂÓ¦(%G'Ô éZă:#ßÔg?#é2CûÈ,£2ư ́¨ƒRáÆ7`ÈÖ-23ñƠ/êḍ$Đ„Àà€ÉƠˆÊ1<ÄO/½¸”eâ&LªzöÓ q¶o˜?öHCœă'¹Äe`…?iƒ́4¦ƒr Đá¬'†é¸S4b §zup¯E¥µ’í%×Ơ¯®}Êø̣gl·‘äº…Í Í‰b,¹•k¹ăôBïÓ&V2\h;uû{mxÖ,;R¥i 9h5Ç@\L¼)À°«BơûíưØc;àî‚ê?×FẨC'%Ô&d yÛv‚Î……÷-6Üo–>6HG,¦µhNû *c”S)% ÀRUé‚ủµ—Zj3Ü?ˆ‰·°ÁF†xq÷%‡SXvÑæ*b‡ö×Q̉<Æô,„€´8S!»é¥ë*Ơ„Hp®9:†mö8̃ºóWWÙ´/̉Y¾ ÷sÇà¹À̃ØÉTZÁ–è«]Ü–7üo<×øécsÎ^L³1l?ÖQÿZÆ­<ïQ×ú~œËW–. ¯8iF½Ö—r¿ƒâ¶cé´êFhÓƒáé@ë‹kdåÅOiZË́hbbo7]¾{•/bu;7L>ú ơ¯#Ë~ïh¥3M°ßơ“ƒưéÑ-ƯRIIÓ¶oñ˜L?Gúư¾{¶ƒØ9?‚<·`m–^?œ‰†¥(]Œé×G°l›Jѵÿ±ÛáMV}˜Ư5-~ÿ´úyî/%;/ƠËÂ{sK¢¥˜p̀úÙĂËÜÀZ‹ˆÈØè#½́pØØ¾úw$¶H^Áf+%uẤ†…0‘E¢€ËêÿP†‘_Ơ Ö./欓uÊÁ#3ÖrYYq­E9 XÏÆ3Ù™?|ư“y¼‚äNïSRøú£†‘èEnåÜâ>r̃¾¾ư§ÿ×ÚnÛÿ"ÿË?ö¼úådÖu2hŸ,®ëøØ(½ô78$x”Ơ ½™¬"ÚYnG©¯4]nÜ éú@ëdóJKm BèÚ£FÔ…vkFÂÑ–È6QË@ ^6† P5&+ât màØ·íí¾ßß7”,0¢æáƠènK*EÊ)g—î!…U©ÏöDẸ•¾¾moÀ±DûâóˆÂ ׳öª×|."ŸÅ#!¹‰t)­<Ëóy=á;~•kåz†b“ÆmĂ Ó£÷p²̉N!d Q‰¥åVZÙË~•kOûU®3g:÷²?âă£|œí䯕ªẉë´Í'hXi“¨Ú½ĂN… ÄÖ&Wxª’By‰#ÅF´…™Ùd¸ăéPUWO¾;Siç…:iƯ6uÄ[6mg?Ư>Øàä`NY´(À¼²4¹ƒƠ`$o±¡JaÛ¶¼ez̉ózz#m·xlÎ@ \­ëư’ƠÙËné» øcN•2ëơÙª–cñ#?=Jt,Óƒ ô ư8ûÙµ_ưºúå=̃ô[cÊ9‡nồ“]†‚Mơûíưíöv?îû¶çœ¡VU¢N$Ö<ØÑyO{JÉ!s§†âq¯[́ík ơ”g†a|´ÅÍ¿›ă ₫Üỡ1¾°\!JJj jT̉¥öZK…8»Jí½£ÁÔ u¿)wcöÆ ¢0Àœéaö!>[¦1ŸÇ}dÆ#€)xîØ¨IÍ o˜29UO:‚¼Çcẩ}¿.3Ö QúLÈsäîMŒ“ç×cåƒô0r$¥ỹµmG>Pú;î‹—²̃°}\­ñü í₫Ü9gưNÿå₫Û“'êüÑ'lªwưûĐê­²dtøÿđ/½pXDW̃²Gt-?¥}î³ÿéj03“%CÑđ œÔö±Û¯¹s 2ô+ï?6¥X^’¿1î°‹Ù@´ÑÖúû”±%CCr6†*~Ë~W₫¬ơûPr÷¡ÿ\{¬JÁˆ¯5ëù‡ Á$†y°âLƒH¯æ=/ÈZ²¾ø¬Eü`\¯(₫JÛ^?· L¾–ÿ Z ÛIåX₫èmZKđµ_ṇ̃O_đ̣M7>p——­F̉UlzÁOSû‚±`V´>u]{Ó¶<ÆÊ€0VÇ:r`‰bêÚ ú’1rdØ»¾¾3W’ÎØë Xï“®vfÄë•À+ä8u´JúçŸ₫üŸ₫î?mÇöưï¾oe;Ëi†½ÏUJ锡ơ’®›…¹̉̀" ¢™B€LÄh^3¡l«zoÍÍiy8uIE¡Á?Ă[=x¦’³H‡–_đ©À…öº¶ÚjCé_j)¥œåD?pÖôƠ¯³œ¸æ„å" 84m‘c 5ơ”cn̉RHYr©Ç.*1Ĭ/ÆơRN!PƠI¯tƯ‚´úñíú–éˆÇû₫~Ë·/·/û¾ïi¿ïwtD¥–³œóñ8×dz<Ú7•«] í<ø±₫Đ=în±‚ĐÛñvÛoû¶ƒ‰ Ê T¹åÔRùÈîÊ·₫Äæ€8>Áđ₫V¾ư¨?ơñçăÏ?ÉO_o_‘Rl›ù?âw©½w!)­ú %V2SNa7y@©åy=Ÿ×óq>×óª—=˜ØB11ËgÓO~â™mÚ óÀ¯»̃÷}ßOÊ–·]öÛ~k­×y^6]É ÄôåÇGù "é‚:‰]…‰nÙ P†êC2 h¥!̣®×ăzàüÀá‘s1ä=›¦§`13„=̃xXơ§Î ü.=7³<₫Ó~ˆM¯J•jĐ[ÜZlN:§!på̀d ·GÈB¬Đ‰)¥t¿Ưÿ₫ßư»Û}ÿå×_¿?¿Û¡…Hi4rp¦Pw®ƒäéâÇS·†=6ÚÛđ`”ÉjX€—₫đƯbơ#Đ>Cydư"¢¬VX¬R;k¯î=EC„æ›̣y­6\„ăvôÖ1ˆ!âa|»½á—9Á¶½J/ă0o­I«Z5è-Ưpo篪{Ø-ưu³°e!-ù’¸J̀ï' £RrµŒÿ§µâ÷j[G††Ù'–‘·ó'ßÍWÖ¾dUî‚É́ăÜơ²ÈˆtƠwế"Ö·¿v5øE œ9œghqÔ‹¦;6¨³)¦¼ ³Úh⯲h ¥»t„»9¢¿̉{,£SZ­µµf¶Èu {l‰_7ÇKêTăù¼ĐähÔƠcÛ¡ï/e½—Ä«zʹûŸˆ=>¯ûựb…ÂWŒ-ưg!7₫¯<}^ÍË œ=Ạ̀Ưö^ªoª/mƒ—Ë:büBû3üÉ'bNógÆWiӯĵU"‚³¤Ñ.)XV.γ¡NfeŒ̀}L'oÁw%û cO>‹¤åö ê¹›÷3₫OÖ{°¶b!„ÇÇù_ÿËqílïûû=ßeØ úÁŒ9!ŸX:&­¿¯]¨ ‹ÀåSˆµŒt·{ó6:Î2Ó^;C Wÿ̀PrMŰ1ÅăhnÉ>ñ,~G₫¢A³]đàµÖj­đ¼»êu•ë,Öàøóø£¨:Ó@$ơDzIË!7iYr– shQI!‰ˆ€1ÊÓtƠ*?ÔcˆỈ–¶&ME›¶_Ï_¿]ß~;CXù~ÜQ)éH·tË·÷ÛûYÎgy¢~}Öç½ßqü\íºä*­èd_ưúQL—Øoù!ØkÅĶ́‚ÖÛöwz·È©$8Ưcˆơc2æUß÷Û~ÉÁ̀h®J-¨Eål'₫₫¬ç}»û0Ơô û½¶ûr–³”jµ"›IºÅ¸ª\íÂăƒÄmømÈbÊ)rTQ[3)iW˜¥^ạ̊Nà¶Ưnùv/÷̣ñQ>àNS¤@äºô™`Ap0±2øÓU*̀ÄŒ¶§̉¤]ơˆïˆ"Ê9[ •¢'%íÛÆĂ†}©›6c  Ñ†µÖní¶§}¿öG}œơ¡Åwñgâ‚téY3€m‰¿óá6lç_¢ K)eÉÛ¶ui1̃™§(Ó7ag'†Ü`[E5;ÙCu{ïÀ‘†Î>˜WÛjéŒy÷ªG¡=–eØ;ʲ7<¶8sƯ­ç³˜ö£€Ù,¹•P9fUÙ\)#ǰY¶7¨ÿ·ư†›Ø¥k‡V½"¥á*Wéiw)̉p4pÚQL?ø„¥ơV¸¨h I#_0Où ”Çx0½Ôój̣ª×Ơ.—«(Î1[™S̃²«€´Ï9dm€½»AäoÛí¶ƯL7†áغ°fX’_öY³Vp©(lv©ƒ@ˆÉ-…$ÈwœØ /FBB'v¶‹Ñ4ΫºL]\ü€‡t]«F²¢É§ơC[{Ú!CÇeÑôK`ùGë]•hZ©¡~;¬“ {œ­Đ,ÙS@³₫oôŸ₫̃_í纭t½†y• LÔßËD‘ñÏ×o;+₫å/^Ê}™_@#%ÓÖ6Mw¬*6µ“aYă(›¸«á(À¦Ï Mư~¢Ù„û¾ÿ÷ÿưß{ÿíÛoßûN‹gưïëøµú_¿r̃¬¥Đ×…§ó²5}ê.tÖŸëăUƒÊDDID@lu>½3CüzweL›µ[X %ç?ùƯ‡W–¾fé́|ÄÁ[3‰gi>ÎH?xüÙ`âÎ#!U†u½.Wyx) åÏ(zépé^+-"ºäbb€)% 2åg($à3 !_uà⇂¾_zA¡lö;)åly[Û¶º£jÂJ‡fÑ€y€¸/÷/̉åÇN°‡}qĐ·ă>ĐzßÉa»e’3K µ Ák·`Çm5³„‘‹gxÍœ#cî},x/|Ç+ô>d¾¼Ă_vaܶ¼騶íØ‹¨÷µ}©•³Î tƯiºøĂ“Ăen8Û?ù…ÿ÷_6i-ăú›ß7ööåå¬ĂơßúâÄƠÛ÷=px^ÏZª¥wM2<¼t£…jâ~ öăVĂ1Wqˆ¬ºD]ÂFƯ§!2Ạ́cf Ä‘çŒ]Hv÷'́9¦àPZ » e< 9çm³aú½,q1ɨ̣ñ$]ăñ;đ?FXW¹Zm_úª¬ßÏï?ỵ̈óăùܯ8/¼Wtm.ÎQ×}bÔX-1,toÇíïÿ₫ï[k½÷Ç÷‡/lW¼øYñe/׺ÿ÷¿¿°ùiù̃Ÿ>>Uæ ‹ln’øÓ§£…(‡çbä0l<û¼n¨ôoøXç¿ÿO¾‹yc?tóNôÎRÉ$àm‚g:ÊÙ¨Ñß°Ñw黨4277ŒeñĐh°HÉĐVöưå…›…í/Ñ{5o ±]Sd“jyEê„È·´ù‘a Û{ïjnúøƯ}ñ.¹^Œ5–4́&­-`hă¨¡Ú›6@æ°¦Iđ±£qJ]»oJx¡6&ÄœÔ₫Ö>>>®ëê½£p” µR5ư“׋n£ór’Á¤«h ¼Ê¹?Ä 'ô}¿¿mo·í†²›ĂHµ$uH™¢SåÅLBÂ)XZëñ£üøQ~<Úă¬g‘‚Ÿ{¤O%Rö¬óL[Jéå|a!ñƒ#á geêÔ[7}Q3à¿Swÿo£¾¼n˜(%0GT%¥D™2E CÀ’˜Dʱ̃đ¸ÙĐhE» +>bÚ6Ûl‰ 1̣ư8ÿcˆœXI=nJŒ?½ÿéO_ÿt×ăăèʧÁ°àĂïCóÈŸ¼¯0ŒdÊ ́¨ÚçXU~ç9¾ăjY€4Z]æ—ưîÍ'^ó¼óÔ„auæß× GâqC«o± "˜™`újv½¹T ×ûz@ô¢ÿÔÿ]ƯÿíBú½ xE÷½^̣ÂËĐ^Â’»‰,e÷::pî~ˆá¸1ƳœµỦ9„™ũPî­́eÖ¥bVQU?4‘ndi‰‹náó0dtk«µ./«í`èÁàgÍĂ^YOа!83œÛq;¶û¶ßÖ¼YUrz!»G‰´‘íă<íE¶ë& (¾]¹û8µƠÿáíà̀¿œ¿ü¯ÿü¿O´%¡“Ó?YíºTåôZ¡+¯[uƯ+9/ƯÑœ́§•]̣*øô³>±wX_G¿ç­ÏÿN/]á̉~“9ha^ú>ÿÁ ×ûÔÏ¿Ÿ/z/_>Q}^^è¿̃¦Ø?ÔåËØ68Œ®hè È«w›́—‡pÈFưëqö»×[¤È‘™ØÙ#.^tú¯Xâ à̀£¥ÁĂËvbđâ+ê/̉Ï0g„ۮⴹ\²©·´¹‘ØçéW0ÜèÀè”kŸÈơ{"²¨@lÇÍJyLPk"ĐÊ¥aƒí–ăp1DvxÜ¡oÎW^­+µÀöh kú÷-Mđ̃SRUâ¸VøÔ r­íTw‰=É(ăp²ºeA—Q@’”5'M4A%ŒÇÊpÍ`ˆø~3gôVÊ\§ªnÁ¶¶-n.¯TƠ@!‡̀Ù ¬̉ f÷‡·x;ûù¨€Ù÷ÛưëO_…ä¿₫Ă¥‘+*0Ú_ïà†à“}àd:ä́ÎûB¡¯ª€]·j’Ámßưđÿt–ó¼¬&û(`eÔ^Ï~>û3•t<ûvÛßîûư~Üg¶åíØơ‰ ¢!áeËgfƠÍ1Mº´£Á‚œÀ¶6s„aË¢/¤TS¹öÚ´a›v#s'³ÚÀX7d GL03µaÏ/‚ff¯;ª đÀncÙ€sxá1“‘ơ®!Á[z§½÷> ébL!ç¶$2@xḲ‹‹‚ûÍäd牮 À-€©­·~örk&C€ư%~:cÿ»F‘s¨¨]U#Ç=YÎ$§Ø̃ö7ÚÂbe´M¥ Mwf1!g<‚†, †ëÏú|”Ç·ëÛGưøQ~ |“ÆŒ~ă¾ß'Çcur”®ª1Åûû]º´«‰HâÈ̀4M±7h?»…Q Q/Ô/}‰óô¢‡° ‰!¸ßÚjd’^{Ƭ̉­±ÈmÔ9H̀ûaä‰úqà꬀èæëăÅ»­Îh¤̀©HÎ4ôÄ^xÀ¬;‡Öb-C CYÑßƠç¦#œŸ\Xh˜'·Ç…®ÇççgyZz‰oûfÀƯm#z)ß[†œ*³R₫¨â÷yÖ Ơgbù¿÷]°IïÑÏy~áø£øÿTE$jDëƠ¥×Z‰±›¾B̀*-wÅÎưÀ¤„=Í5Đ81_† ̃x Z¿_§¸˜m€5çP¿(z±®…[ºáX„ăÅm»ÛŒ=ám·!*†1E·¨¢WÅ ªùơwÜ5 đä©Ơ|Æm₫”° °W ºÿwûNûßÊß₫·_₫7́^ÇëïX4Ÿ˜6/Í@˜ôg3Äüçúç̃ûăñđÁ­î=k€—ñkïñ:a˜Éô¯”₫cQ̣âù₫‡U·º¶“ˆ™*6ÇøQsÓ@%^ªØñyĐ™G; ñå+?u$ºè _ªÿßµ+Û’†–Ú?_çNáei‡–n´Ă4p»id«”*Uß°æ¦y");ư0-Ö¢~æßÖG*ƒç½ß-¿N‰&D;₫iN·c„Ñ‘Ơâ!Á¦́$›ÿb>‡ k ú ¨óà¼_W†ó¿Ñ¡vD9 ê…«ï€FX ³U])I¸Ëφ{ .~‰đ`ÛY¬»åĂçøø=oN^¸t9gf†Ï×¾íG;J)è@ô¼Ê5ƒV“‡®”V$ThœïhA1"I\X”ÈØÂÉàa?ÅnúGưø¨(` ˆ–̉ơ‚vmă†Â ÚÊ=îĐûñÓûOÄô×ü×K¯µƒúô“ iÉÍÿ̃ñh*¼QC0 y :́ O¤`™Çvå¸m·Ûu3bF}Bü**O}öÚŸưy”ă~™‡ém¿a\‹R|'¨8°Z\jqor9Øl;r-µỠûm»aGS8„2ev‰9GgFâi‰MïÅyHÓ,¤àôÚ¥§˜RO°áˆHÀW»bŒ¡$1ĂŒEíÔà <´‚®ư2 Mo½ơ¸™Ñê¢Á…µă3p(¡ổ¨9€[û”)H 6LfđK—“I Û¦i[ë…0G{|Ô¬1s3ü–߾ܾ|9¾¼Ữnû ¸€mÚ­7m­Y¦[ÜăU®̣(ACâ$Á]ôƠ$ÁHÖ Í^DË̉ùë₫ v2zuç ¹ØĂ»ÊÖ›4=ˆ³}œ|‚^×h?1·mßoÛ …,ºv/ ¨¡1¡8àŸÔ«êXL¿₫úë?Đ̀ĂQ§S÷º§Æ~́¥”yøØNÂÀ¸ đ<软´wgÅó$cgq˜É~…đRmđ+xG‰SU7Ô2µ ›Đܸ©iÛ¢QAPôù€Rß¾D]z-éuóqµ«¶élæx?ÎVơ‡qƠƯ₫k¨?v Ü{OjøkÔèÅ…UQÊ.o ̣¾la4éÔ‡àˆœÙO ùÇçêÆ\ơD#|Ḿñ×_~ ÊY‚¿tû¶«h«‹>PŒŸă5N!®­úæ?T‰0íyÅÜùÔ{’ß;x^Û•toáŒÓ¿̀ÿó–u¨L ƯÇÛ÷fÈÑÂî7?q`ÿ³±i­Ô‚7h°^;í›ùÿÏÂyf]Åc¿Z 4}»„É₫Åig2#ü5ƒ]•ïß¾ă5ÕñÀê2ÏÄîä¥ñJŒ÷/ ơ×1ùŸV[zơ÷UúZ~;!Å'₫Ÿ’,±ëà$!Ç×1̉5!Ï}síWh̀)&MÈäÎÇ{›{Ç*EÀ«‚\DJ-&Znµ–ôä· œ)ô)®ØŸZ¦N†ëÏÂd‹œ¥ (b¢fH2K:\/Ø6Ùu[¡¡X÷V"^’ÀG¤ÏïÖ–ÀÈë1zp# ¸©» y²r‡Áf£Ö´ ̀Tô&”„ª¦Båz¶óQ˜Â›ÏZz±r÷e§0ÅA”•(Yrk­Hi­YFµû¶hGpµm§H†+ƒåiêŸ1µ7êTm>7,µ́m/¹̀v`os0fÙ%¶̃À3É1÷Ô7Ư¬₫#G¶)ăTƶ—$æ ́è…Œrx)2q‘b¼UN“µŒC]ítñXG?¶-m[ß„ä-½E‰Óa@¦íư\É˰̃?à{‹“ü1pŸ„×::ƒr”n®!†<Œ̃“ÅgîÅd¬†Ss’0Î{¹̣̃º¼§Ô¹BÏ;ê¤B<¥•çơÄù}–óưx¯µÖ£íè{ß̉%Ê>ÛUÍq>„B₫éÏg=?>> 66uT™±ÙŒ°±FG£E‚ƒùr¶̃·Ê•“RŒñv¿µÖ0 en«ƒ è‘fÑ#ƒ¡;b2Ñlik¹y/Nh‘ ê÷Åœ‡¿¡Ă`8sÏ5ØámÜXÓæ/ v)‘K™ÙX$ØäeØ̉û¬ +Ù÷¸Ûñ~{¿ßî­4<é6ÿ9î÷í¾m›ß@™‘R£f›0.…XÛŒêßS‡¯rí„>êXô'¸M÷tÿz|ưé₫ÓOo?}yûr¿Ư÷m1²r•ZKm̉Îv–Z°z›´ ¥́˜¶É‰£¶0&Ú&÷`ÀÀ€¶¸Å§‘Z²-Èx5̀J Ë,Sæ»ZOô·Î™Á†bH)¹«_L3T-ƠĐzRI/8ÉúèhD•ô¼N½–­l¯ c4j,L…Zk4ˆ¯ê6 2ÆƠđcû¡D2ü[maÚ9kg=ƯOÛñä™ĐÀ‰};"g’Z2ü w qj̉’yTx½ˆÆoµ•ë̉aZ€ưÊ¥³œNÛ°ăLæó224ümz¹CK¿·*ÙDMF…Jà…Ï̀souđ(V¹3>q́qíœàå& „ÛÇæóc4dä°4’ˆ4´gK!m¼£‹û•)[=æ†Kƒ°ê ›hơí´Z^å¤ư,‰Ưÿ$̉¥'0J;́bÊ1ƒ̃™Đ‘Í@1‹Àû·´à;!R`ö(囨ÿVJÏüOÎú³îqdzϟ#|©Uü‘„ˆêo“gzµ¨!`ó: îO%₫jÔă’ÜWÙ.đ—1s«Í_/§ËàcM¡C,[ÙÂv[okX‘?]sU«‚-¦ˆ±èñ-“kQE\c¨ANCÀë0i­4¢µf7Ïn3Dà+B=́1ÅPZÓ ÂÄf2T N”ZkeĐ?ûT#›Œ'(đÛP¦ jI§”@à<„ å¹ĂËC-ƠÆS•pp”REFó¤åz»Ă—`ŃD¹Ô©̀ï:Fܪëaµu[¦ưÎ.bT‚´„ËzXøú»ÁY%¨ktƠb›€ѺZ¶e {ûä®ß_RÎĺC÷¤ùâáëăQø#2ªy ̣6-<̃Öô”̀#(­Uu¸•Ûơ7Q9Ôfñ‰B ‘’ÚZ/ÖdAºjLz3eFœb)¹ Ê5ăFăKam½Í‰Đ~„Ơ[vvß—yÈaª•púî»A₫Öï%¼Læ4‡SBÓሠÉ/çQ Ñ]¯¤¹á¯́̉Ót-ô7D'爭¢jçƒü ˆ—k•î6Å‹:F¸Ç_Û€ưĐÄÁSe$#~Y‡ïeúÇ}$Ôưµ*-¹œ´Ü“€₫ÆCºƠưµ'† Ö¹«ơï[û¯©óeăç̉ ă{÷¶Ùßưxá;­…îW·‘"5ăËëKŒñv½åÔlÈÄ{Ts‰RûŸi¿Ñ3ĐO_9ơF2Ù`ºN`f×Z!UôÖ ±Ç(³Ä%” L>£‰qRU7“~*DZGGŸ€‹cÑÚ(G” D$:Q¡N"d; Ú„:I­ë Û!¾†u +Œù¤*€ Â/CF›U­6X&'+øÑúƠÓ|ükờ¦Ạ̀ aÛbæû¯Bª‘Đ"eÙØ§áôúô:º±¦ê´c eŸn8ií¬C…mŒƠ˜R²Æîa3;²>(¿I¥\rR)ä€ÚĂG/ÆĂLyªÎ9Ç.ö%c«%G˜HFẲ" X(QÍ UÑ%«c/”ÍFB¾Œ6Ü@́ŒJ„ :8̀ Œ2 QàhôèÇÁ%—¸ÇÁr÷6P±Ä‘å͈)Æ!LÔV¿üđZr₫ơ—_H̀fS"×É́qé´ƒ·ắæ§ééơüúúôú|y>ŸÎÓ4crÉYÖåăúq[o!†\2&'ƒ´̉Âsƒ2¡RUY¡;›SæYGâAèaÊY¸ŨxÈ“f7ƒætN@ÿ”³KL©W2³2wU™¡sáÂÆn@x)Ü %–÷Á®”bµÜPsµÚ–TUHyä µx{E &Ú|»UU5³*”öùؾï¶|ƠR#Ôáh„@°’Ê÷–w—¢“ae³˜¡+n‹†ÔÖ –]ü…®ZÊG-×Ï–Ûv½êHÉhlØ`à È<§GüÇŸRÉ4æO°Ûf*₫Œ=UO€®¸đ¨Eª•rGå|†³€­¹§BáY¥2À.·ûÛ+ …' ?(-6jùE2à¼3ÍË́á[Oó­gNZe2ª´8 ûTKèH•Øw8È̉Œp©ÆBqµÜ€B—W £¥ĂRárÊ ¾́µR>ÂéÅPDvê\§¦̉§¶! ¨Á$ù:S¾T|ÛÅï¦U= ñô ¾³ê§‡ù)Th@zW÷RJ‡{₫]7¼áØZïDºßi‹^_†­W₫úö₫ÁgUQ_)Xf*‹£e½«äs>,"¨>>ưwêAŒÜ×1-Œ₫várĐrkÁöeY°&âV”Á‡46jPpGmªwơÀñ–Tí̃~=¾Ó7ˆµÑhÊH1ê‘áT+—‘kƒ Ñ9 ë6lÁ?%J(±°9åz£+YIÙ³¬‰Yñ³¡"%<– XøÓ §d¤KLº±ƒ¦aRMÂ…F]Lq‹[ÓU³FNQ¯₫‡a7”>yQȉ"ó0γtÿ©N0‹”¡ùwü‰Eẩ¥±Œ$œRÀ¹ÅKă#ÀbHúR{̃ó–?Ăç—ơËóíùwóï~<ÿøĂöĂëüzÏàyƒqN Ê$Zj.*O–Ñ€G§ ns0ñ´:ŒG$óA·¨8à ¤¶-aỴb’ÙÍî’óÆ£ø|[ßf??OÏÏÓóy<Ÿ§ó<Îó8ĂZiåœ;©Óà†”SZc܃×₫åôs<6QU)]ơƯ »°]̉`•UUµÇÜRXg78í4émÙJ)ƒÔ¨¸újôY®7´²Ê a/H…©J[²Ä‹ÁƠ u¨TµÖbªˆN„Ä÷û1{€FBÚ*[u­ªU²Ê`·ĂÍ ²öŒ…;Û¥n Ê&6Ú40ðơ¥` wvà±ÖZ ‘ª*ê Øă¾7B×¾b¹ˆ9NÓdG“B]Óºl ‡â5ÚO®Ù{/ÆçÖØÉMOÓÓËéåơéơåéå|:ăÈè?nyËá¶Û¶o{Œ±”Đ²Áy<Ÿçóä§Ó|)§”²Ñ†n=Ụ̂„½ï>äœAơaé¶¶̃zDp w‚%”’ü#ö™Á­Q~Í’.0 0z²ÄÔg6z{ÎYkÍæ˜ơPư ¯͵¨Đ <Ô™—D Á@ủUôz̉¢‹éÚk ””Û|}1e4§ TăÔZ›¸×-{kOPsVKSnQ9.$Ú‰7 ­k­!Vî6K%ÜwW̉BXñ_i¾́ø¤npă8¦tG xØÄQù$m®ø.è¼Vø6¤rLă› f+ÆúC9-̉ú+æ)á Áµ¬¬Bưx>k©Ë²ÔR9í´•ÜV7¬cÎ5k*-‰5BZx--$ù̉n+Íà¿v‘^̉ ·Úf€&º|túAĐBY+…7&6J©BeO{ëđØ ¯˜#na”å<–¯³T¯å½‰¯ŸG »é¡*¾c°KϾ£ëÀ]wÉN¸·If´ üăϨsµ•Yp¬Sª¤€öÔ{ÎVĐ½=̀ÑÀ®mµRá.N¸»°ˆ–N‹ûÏ=Æw7¶< -‡èA.bơ Đ©Đhéß÷çø'­ZĂÿèF°ºàp >‡äWâó›©DD˲ Ư3Å–Ø×Ñ»×»pVuw‰<5ü^¹_ÑV È9*̉3èG°a9>,©#rµ1‰ñûäeù SA= ƒ*^gKA5öùëeM¥Êmt¨Ék}¨¶0ṭßÀÖxÏÆ̃¥Å !~ü0ˆ„è0W„ƒ˜ÈT!™$ ¾Ơjuä-T–¦2=ûú^âkŸf4¿­¶KX>Öq†ÆTb ¦+æQP%A%ÅmNº²BKzTD€¸»Ú2ÖZ»ṣb›”&™a>J‚Z+z6κ!¼̀%Ycơ×ZÛÁ¦”ÖmƠ•‹–D+É&EX56§̃ê®H4ce^SªñqO;;å§v¾̣J B¡„-n×pưẸ̈—×ןN?½Î¯/óËÓô4óèFk­4H€æ!zæL4kq­j‚jQE0lm3æ±tѤÚđ„DÑjë¢m²(Vq·p÷ñº_ß–·ÉOçñü4>̃ÁÔ;¯µưˆ…^9¥.*M‰ÙMs‰¦c›ˆ³!£ªRVYm%pÆz»-ƯÅØYckªŒÜh`Đ¢—DRVª SăSU„j%UUiå“]¹ÔÖØ¨Wfæđ2‹’r°%ù•«¡J”IHVÚh¶ü­ >ª°́Èô¢ˆÂ đÇ-7ʤ ;˜Zk1³Ụ́–j̉¤±å§>·ÏmÛ–°@ÔNÁ˜ÇÓ—S ñËơ˺­PmH*¹d­ôhF«íèÇóp~9½¼<½¼œư³Ư·e[>—eY8‹ú=ơÙÏó0ƒ6†ăÏ’Ç’ÑÑÂÉJȡ䢫[’Ăt­w¦KÙÁYçµ×ZS!”̃̉¢¸ÑX½i81kß‘ĂU'ç 5»ç£j̃ˆÖXUÙ“©đÎ##LöÁ̃l.Véî Ơ龈£`ừ₫Z­1䔃›»'wpͨ¡ÚĂä±upØ×¥¥TfÍ÷«AÚ [)e?M4-±ơ°)“Ö²é¤Èv=ªÀX µ77û›]•à¿d£µÆ.&–>ü}:x‰¬¦Sœ2Á,Ù&Ïcx¬S\ư¥@E† €›Œí¤ó«£|ªT¥µ/÷­º‹–'eȈÂh3Úqr“ªJ%…Z·wŒA…́Ƙªk ÷HiÄ 7ga1:flP› iú[Ë’ƒ¥á[»yøˆœ÷Èí:b©$¨Ơ1àƯ÷§é=)Íé†ö-Ú&0èñ10€Đ{ ăÔ‚>¡ƒ^©p–E])W²–ÿƯGP»œ_©(•ÑĂçÁ‡‘ÿÏvè»Æ?uâƯï¶È']­l¨Íˆ’ÿ¬¿BZBxYË’á‰U05?{Ơ-ùáûƒĂ÷z'ĐEÜưuy‚ºûqyư§âï("¢e]–u‘SØÛ• $ï?køßiç+Isè̃ªcDĐ*2aN”h wÊ!¯¤rJÙMDY±8ơ¨ƒ©jÄ‚ƒ!¯î¼AԱРJ^·”X¿¶´‘-9²ùZŒvTJÇ3Ä:á~„ÓµÖxæ Q¡Caă7¸̣c³G‡†TÍcưiäïf“­¶UWPê­¶pr N–nÉ–6¤öli[Óº'6ĂQY½ưöfŒ%ƠKD:b ˜¤½8& ¢ª‰>̃ɨ§Vöe*Ui¥2K3ûĐ4̀À§ÂŸ\ ¨ƒ ‚b€éŒ-jÄt—2WºîyWYíjçD‚¿·6ÖZ1KƯ؇ۣ ¨´¤T“¸¸HÏl Ëçöù¹}~lKXpÚy_–…úÅ₫̣×ë_x__ç×çéùiz: §Á̃zéØAÄi´¹J5|פ’¤E­z—*«³©F…Î=0µ0,³;œàSNF“ «À‡ôücûđÖÏn>çóp~ÎÓùiz:çiœ„ư5¸açẮ¹dđJ¥®ăAS€D3å”S¬đư¡y…µ¢c*ÇœéjØËĐi'ă*#yyHƒ±¥P©º"Ë™_¤iîÙë½Í ö²„SYinÿµ–Ä~5¢&Eª4o-hW£Å€ — 8ũxO4¡ ›/'äœa o\́ñèê–aK»œ/Æ™´§åcYˆ¹oû °C₫>¤”n×Ï KŒ%Ê()§ ̣§“?]æËËéåy~‡Ù¯ªÊ{̃÷ưº^?®ï·÷ëzỬ–)ƒ5¸aæót~>?fĐU+R1ÄZ+—Áa½í7¼+ñăWs0ĂèÇÁ ƒ¬µ§é4úK+Ïâªb¾Mbü)g ÅyQâă$P ²¤’ +G­ª*¹h­7&m´­³Y‰ n°†̣̉`0­IÎ;ÿ¶NKÆVT%ƒĂîËSH[vagcfø/ Í [ 3Ư›̉)‡;ï~.«K:µR¨`¹x‘qwÆr¶ °C”YwúSk05W|Fÿ9ơøH@¸¹ kÿ9ă0\æ+.Ôϸ‹ÑƒăÖ§—7ûÉÈéèáTm–èys6b³¯‘)ÖƠ@Åo “7ăM5ZéÑœ‘ŒÅ>N8ƯªªByđ˶`₫&î̀ÿÉAœ eáåK¼e•RJ!——…¼nDç‹ Z–Çe¸½ X₫ —¦:ë¾®ëÚ³́˜èq`ævjú6|ëÀóQ¢"3R© ê@Lơđ³2‚îÙ;Ụ̈×-ö›ß d/?% ù©G¬(]ü‘öN>]›ÿisO "é­¥¨*è”»Wơ^¶₫mI îĐ2sq„„RU¹IºØµẨºuÄ+ơ92œ=qkÿ÷|ù×;y•ăÉ꘦×N¡̀ïẵâ˜ă] oÍơ=@?₫S]̉}÷¡¾ùk«9û“*÷îu4)RœđƠyW(ûáU"J5ơ¸-Ö›ÈC¤H‘Z#g…JĂ©A5Ath”qÙ9ăà/Ùûđ0·rLî˜â_9 o²ßT´̉_–/,ç5~°Ăä§Á Ó0i¥ŸNÓÛåƯä&=i­5“írÆd İíä}lÊ)‰Bµb@ »¤b­ t”QXˆ{/9̃tsßRläk\—¸üå₫²å­xB±œmyĂđ-̀.‘ÄÄ»Qcdj¥-Y©m)°^E%T?IPF\ÎR§Æjw¦ºQ²AA{Ø̣”"X™•Á¦ƒ mÆÈJ°ÀÖÆWN9<ë#Í÷{óơ–v•1I侕RbŒ­0Gơ6ÇQeürú¾Ü¿̉đbÆ”v}8סåơ<ôƾ†Xn‚¤æ̃Au Û²-" Üă.Y"²6II<¹6Ç4Fë¾™Å[„‚"đè‘=–‘» ½5ù×ú¨äÇƯ¾”ÿqw=‚Ç₫ơ ~êü4‘×3Ï{|ß#Ï©~ sơx̉q É]IP ï>?ÛUÇ3»a² ¬xÑMưε6«×»ƒ̉µĂ«Pu|ÿÀj•zdL}³¿>¾à·ăä 6 jCö¨#Pơ5Fÿ²'µ£3Çè[åuîîdµ¯5zÎç2r̃aç5„ɾji)j­=t0ªTEJD¨̣sÍQE[¬K[ûèko­ÍØ»7ˆ2¶e6Ç}P§˜Ö¸èj0ĐZO¼9±¸Çơ+R0䙯iÆó|=qÀˆ/âÁ—`oRÄ*§èb”A»°qZïüËR‚̀ -`ñ¶Œ³Ú¢'îNh›b…RLKZx½PÖ }xܯ¥ª ¹³ÊœÓW ¶=vqT0JG»nEбq•µûˆh>6X •Óp̣Ö ³Ÿcwj_₫Ö1“›f¡>X§µ Ÿg ¿P‰É́±L³É!渆uÙ—u[oëííööơóë×ë×ơă#|,a %è¬UTDKü Ÿ¿­¿=OÏ—ñr/@́üïvrŒ[ €æhJL=Âx1ăPWZ}D¤­¦,ÁÜÔ’Ün$KôƃÉz˜{”\©niûØ?ÎÛùezy.óe'ØC!Y ×……›qLqÛ70¶¯@U3å̃öD­ŒRZ)£˜¸Óæ<Øøyæ– @c*Í-Ùœ˜ÅaI¥­vʼn 5çyN¬̣F‘‰S«¬rkÛ-U]UUÖXScxµ=í)%§]HÁ *eĐ3ĂEñåhÆ“;]†Ëy<ÏằßÚ²Ă}fV·îÂÈçĐ”P¥™ÓߘgB\&””Rb‰<êéÈè0)²Ệ]£´IF3Ö„Úă₫¹~^ău£Íö‰`QC}ÛïïèD² >í·xC¬˜¨q ²:„+ªù/9ç†a¨¹6_Kfc¾µVˆÈ…~É£Ñe•ŒKKÈ™ªÅóbgƠ¾Ḯ#í`ă&₫f̃qf_€IDAT`È¢+á’6Zvw¾ —'!˜¹…ÂĐ¿´ôV­9€°”¢ŒBró8ŒÓ0MÓFœn,#l¶^*Z ăo–a*­¥8ÀY0±,‹rL@3Bc7ê „ØÀO »²¥åưô€́øk%k¬!ăȹâ´̉zÔFøé.„³ÖƒVPîze₫‰jn{„~_hPïĂÇóÆ̀†´8EA¡éˆ<ΡL¨k²”\˜ÁßÊ!.J„B}áÚŒƯ`;¯ˆ.zë́)kZÅ!—‹†đ°S}E‚§£xà–¢º+dl®ƯQ Ho¾cÈ ̣ÿ̉R°zÀ>”îóƯ×÷WÚĂT;Ẁƒ₫ÔZ†¸Íàÿ^vÔÿTßƯ¡ÍñóîăNî.p§ —ư‘9¤îrû=XøµŸ:æÄÀư<ß<¦÷^Q̃«ô₫qhJ=Œ„©§ưt‰¤ĐQß™î@Ëÿ˜*ô¯|Ÿ“ü8¸øô·j@À½ŒdÖqÈ ¨1₫éˆ̀ä̃Ê t÷-ÙăêỉØD œx—d”>̀[Ù.³ùˆ³sÔ÷½W@âEVîä\̣V"ZĂÊiÆƯn‡Q“†É:ÖÅ6&̃ ³ØwIùÏñ„Ñ*âP,¬±`ÀcA”A6'Ù!öĐúq[ă*¬Đ˜c¬{¶èUjgo\ke”J²p`Y+uF¦¦hm+UP¡LZéSx÷Ă éÈ«wmSo3épÔRÉƠÖgϳ́槉wˆ"` NmËû)ŸÀOE l±ÍN"„–Ç̀Lweç¹1•tNa {Ú·}{]_<ÿøv}{¿½¹}y_ßoû ÇgO{¥ÊËzM8ÂkZÏù<»™ùŒ́<“ª—}Ç+[Üná6lƒ÷~Æq`G?öªd­§40 O>¶-m¡ y‡¡gÉÙ6iW­…Êág—²/KXÎÓù<ÏóyF¸OhÛ(ÑíN/tÑB@L=̃0‚b¤˜ˆö¿Öº Â(€Ă RLJk’µàŸcФH™bĐÍÊ U7¬\K-l$ÎëµÍ̉áh.ëæL”i><>ù=îà¡Åîc×]“k©“N₫„êèô£Tb¼Ăi­£kExW̉Ø.¹,×… íËn”Aè>&?­DÈ÷·¼!jT¶jéºÄ¯@˜í0Órö¼ dI_à&f[ KSK-‰øˆq¼0ïB5wTÑ©Ë"_kƯ·}¡%„9÷ƈ„ØwU€ø…Äơp<"SMh#Qa´ắçÙÏ“`™˜…9 À³ ‰—£Pmó€̉lkƒà< ÑCÇÍÑBÜGÏÄ qØq´Ñ† rú?Lă4Œƒ¼uV…û‚É$1£=¼;íÁ‘h³ˆ^:đ‘Ä>D3Ëz~KJ©.D–ơÓ™¹‹¢ú•đá¬×Z1̀(n9›ÂŸaÓ ́D轆'µ4" ŸÄW f¨¤IUPHx ŸÅµÑ"ËBbÂÊóÀœEØ*ưAl1‡c˜a‹·=i~ơ[6h ÿ•vi4—Ç«f @*‰Y PIr¼w₫<½ơºh±̀€‚9ä°§-054Q–¿·pON:S@!ôE§;mEd ·$l8¦-Ih3ö;!í`­C‘y¦Ö÷SFÂéù·¬¬T²ÑE¸ ˜*›»¬6Ï₫Zïú¼LØë]f:?¨¾×Ú_TRµÓ#@?¾sÿ̀đUƯưv"z|Ùl YÈÊ»á.;£Ö˜›bḱ¡ó&–Aÿú̉iˆUÈy³äî~Sá<GudgQL~zƯB;6íĐǺ?ị̂qúÁœ|ÁïYwVÙƯ{fhßZ}bæđø¡:c"y…c$R‰ƒÙ»2WđŒ±  í¯!̀ôù-)” c³Ào½´ÉMpĐÜP̃§W ሰ‰¬1̃ÍaK¢J`°¨À=³Á T¯åbkÜaÿâ•G¼..[Ç]“c•lmÎRQ¦˜‚«’ÜóÜ)…SØjG(­đ-åt6q«Ejw¹"EI[sÚAhÁđ ><änưÎ’$ïép! ,’b-içơẈ»J QÉ|+U«­-6›Ă P†és[ÙĐÙʆÖǵ–$ư~eƠÑ4¢fâYØw«¿&í•×V2`×̀ăü4?]¦Ëûíưưö~ ·-n̉ÅŒ9naĂͦ¥ j€Û•¡÷¬ûzÛnă\Ă 1÷u»j¥ă#G¾²ỤÖ«‰ñßÉŸ>·Ïk¸ró²2ˆ¡9ÉîóÑúÛvøÄ‰<ĂæZÚ!Jéè1§ûj5cl";̉*«œ(éª YHî#km)%ÙÖˆƠá0æj¢&ƠtÜ"¹‡¥¹¿÷M ¹ƒIfÏ;¯RµÓµµî2”î ÚqǗ¶Ç}7́xă“Ç«µj̉́q9 <{+©ªÄq[é”Ñæ¬MÚÄMî̀*FUƠz[K(1ÄÓp‚Ư¸ –ƒƠJ*EgÄë†A¨tf˜ÜÄ)ăÖ™³œT—jªØE‡ăB-·Q©"¹½k~ób_XưH+F̀ƯÖNœåvư¼îË^JA^ÛNù K€Ơ/b C kXñIq µ?¹éâ/çá|.³Ÿ'?ơ&›F›*6”J*è—v†Á{oŒ1ÖQH!…´…mƯV¹Ë@ % ^‚`Z5 )EÊ* ¨Î ßă8£œ±¦ªe_–Ó˜âưÁh– ÷•AÁöÀç'%úû gW1ª–ˆEDt¨)Ê1Eß|W@C¸ö§•9L¢9Ñ81ơ₤5ˆ±IƒµrCTZr|…èăƒp¼Û0¬Ă.RH‘)…²¯ơCZª,ø>ZàÆr½gt_2QSBbÙÏ̃ÜiÇp•;ưø/±•Ö–7Ö­ƠZ©N'g] µ¬́»Ê~M¤`ăă´›†ééüd´aë”J¹f́>(É™uN¢æMmÑrà³)NÊcÔa=Œ³P†ÁÈUIx"ƠLlƒ% )Ä…µÏ5°6Ö'>PÜÍlgăƠ"zäBILïÛsÔ~B+âHùÀ渃‹ª3¢<.̣Z$[zĐ ºÛåap÷—Â(ñn&Đ?§0æ;?NƯï•´¯ÚJU™¾̃«z¦‘•›Ÿ5µ÷]|ÁR=á§GÆwIǸ÷÷|è¦÷P=ڻϣß.ÅÀQÜ|;[©]÷ưÍ/W@¿¬ô‡¯ÿR´WÀ=¦G²£1V¾%—»úpµf€¼%~2u=†î¤®óç’W`»˜V6 M²ç]¥®ĐG–§ăxi˜F?ÎĂ Îô0 ²¥A2…J FvûÀÄ>Œ˜±" É´†µÖz 7́¬œL¬5Ê8Ç »MgÖz ¡ø»$?a XgƯ› oùÆà·0–ªµƯPN1F¸|„X0–[¸­iƯóΫ₫Tt÷\rbĂBÇ냆v„ÙR£pX̣ó*v¬-o5T«-Ó`²!Å@ {•êæïd b¸Øà1´ÚXâGøxß̃½ư„ÔÎ?\ÆË¥^)Uùl)¥}ßaÄ2@5̃%úÖÜhÇ:T˜Ó{í§mZĂ7NªREé¢UU1ÅU­ Ë|!"À5ằi¯áº́KÈ¡¬sùÉOó0O~¥¬3N)…†ưi8½L/KXđß-̃¶´ƠÊÙ¥̃Y+m“•(¢ªj¬qËÛ)œæ0OĂÄe@Ç^•n¥%ë¼̣ ^Ôl,XFϵ%ẹ́o¯‘»•j© ®à„NÀc­1*­b"ÆE ¤Uó:ß(¥• ¸¾),"̉­±V]-YÙ&©uL ÇLl&ăÆu ›‹n7û`‡Z«!ăŸÜ4³ø)¡(=Ú„™AâÁ‡k2樂kQ¦́%æh}:?SúƯcP¼mi«¡Æ6­Öb-âŒC)23ÆD̀i!î¦8cĐ½Fp'6¼­”S)R¬¹:í’NFCFº ̉|aJú… ̀©²,‹üÅnœ·×Ó0aµ¬TSJë¾¢̀!¬Ûú¹~~îŸ×xè́€2{pĂËø̣Ăü´ơ¸ưeGĂ‹ÀL%g¢'æiÆÁyGDptù¼~~Ü>>oŸX#®sÙ&°éæÇjæÑó0ƒ’g­­T÷¸/Û’Ú́ ­kTÚ‚¢@:2èRáưc (¡¼8SÜ¿o½|ö™QLzA-Íú„UCJ”¹÷!­!-ô;uÜ#Úù‚/ÑóêEü‡nª[đqË¿uá`h­ºnwâSâ©Y×cÑ£g™œËņ¦skÁ·̣[¨Ñê„ØOËÙ0w_oávÛo×ưz‹·[º‰Íek„TÙÎJ)Óe†áz»†¬²^yÖ¿i;¸XE‘º̃®(TØ"í"ƒ_\¯²x@&¸%Ó©„›Mv7,ïœSâm¿Ư¶zLIT¼X`«æ¢«:I»äi#…A›˜4®¿>̉æ?Ä!]HĂQ̣ÉÅÑ.•£fè>\N·«èYB{́zbï»́‚æ%¯G­đ½ÓÜ¿̣=ó§ñƒ̉q¡û…̀úz÷;ºĂ¥*O¤Xá~¿đŸè®©ÏƯúư÷hZubư·Ơ£¤ºÇÍwo®ûà₫o₫cEÁ‡¼öĂ„»À÷}«₫¨Uîu€üÓÓÓ8ëº~~~®i壩º¾‚Rư5q÷>Ûg94%bؤéÛ+µ¨r˜¥¶;!¶@RlKỤ̈f”1»‘>xüè·Íằ¡ôĂhơÖă8ëóYĐpyÉ‹qO{!¤wLaKK0©¥PVæH½yœÖ‡ưœu¥¥Í÷—²"eµÍ”å8ƒ•‘R"EÀưh8IÿIz*̃ù~,€°!λø`̣Ÿy 9ôè¿ÿ§Í`]´ +,O|À »kfdÈ)¥¨Æ»UA¹{̃M4NÔ Đ9cónáè4ʰÅ{-¥–q/—K­ơíímû'}ni{[ßÎĂùi~zNăéiz̉E8+8T·í†f!m|íb₫Ó¢œr£Á’çoëƯb’›mVVYer–,*®@*9×tuN‹…âi<×óụ̂₫a>>ĂçfŸáSƯ‚c0›ÂÏ‚®f”Aæ×Ky§B¸ "€á‹r“Nö„Ë3«¬**Ǽ©­PI5…Ö¸‚zÄÖœÆ8Í•¤˜µ!YLk­³6É被bUâÑT”j¢D©&§ØÏ•ZpAbGwÎ)¥Œ5Âcæ‘ö{}„s±á`«`¹®©„/jC…Úè˜b¥ZTÉ”ÉPY¸h,E\̀5éj8SÀí¸çĐĐ‘sy„(6„u ¬3Lü9X:'öT©lưÎÏàïư0 J+2´…4miăQ)¹f§9˜Ox¨ê/Ăå‡ù‡×ÓëÓôt9].ç å”b{eE¤É:ëÇ!c ów*s8{LÅHÑUg²!KÅ”dR6¹ØRKƠUƒ‘Ôˆ)–ఔؤAà®çÉOè› Æ®µîa‡–æsưüÜ>ß—÷đQJ!M'’ĂîŒ;û3ëéÇ .rn‚–,xc.̀ü4 ÓùtÆÁ{¯´9nÛv[np@Zö­_̀U„< =÷zÁtdAº—D.ù¶Ü8 ³m4Î~–Ç,ÚI˜£ júơ ® h̉caÙÓ „TCL•æ°’®û·•øƒÉ”O42âc.œ̉D|˽’f^÷ßÁ-áÖlЂɕÀEꘫk^T÷¨Í÷“ï…œD8$LÂ…”Ï.₫•0½‘y£Đ{z_¼7a¹ˆt%èÔ·°¡oµ„eM+§YQ%Me,*¨+8Ÿđ§Ê9#fN+í;çÓ|2ÑS°¨ª ú[Ă)ÇÙ0Zˆ…ÍÚˆKưfk†eµÅ₫%!œàÆÑçÓù§zÿú¾Ü–\3$7—öTÓ¿ú?ÿ+=éø¿~|…Pªỏ÷ª_n(&÷ĐÿØ"uWˆƒgùjÍ”¥“B]%@b₫^éîRÑ÷Mư£6<®™†NP›̣A0ưå:ôË^5÷̣;=₫₫ËñO]ÿ;fÑ÷ˆ=ßLîÿGwïM&–?6ª„˜Đ%)´ç¥ƯØO €\å¾c2Ưkd!EW„ơåKDz ÿÅç7‡Œ_Y·CÜ*~Ú|ªÔñøô¡´8̃mpȈŸß×XZcœwhzŸ±•Ïwûƒăá³<«ö7‘©X½$Cd ê {*ªª\3ỦY¯jeb½¶èL<ñLÀØç¼çÔn«í8Œ̉¥ÓCÔG€ŸpS6™ß\Ø :NÆû4ÊHgˆîËE&€Ở_å(Í“N¼–9·­ƒ7öl¥ƠàéVJ+…Ë€°mi[‚íƯÜ gß]«¸WkQJq§Jgt@ ”óÂÉ#-H8BG̉2b*1FXƯĂŸ”§¥ˆLn^́BŸ5d€ñ:@ÉØ™`﨣†Ûúm¿}¬'zŸæq>ù¶jç®ÙVÄ€¡jm~đ…P!gƯT&L«¹C =Óép'uÎ*›fဨ£ç IåđÀÂ" j¾wÎe2S‰mÚ±HĂäƒâ­Ư_<¨6G?Ă0¸Á9ÇfˆÎQ¡BæâøËCä|”}w„Í+s‹‘+ÙÛE÷oÛ• áÿa3®µÊ"ÅëÖÁ¾Ăh#]^U“ĂE%ö/,uˆœe͘”½đr`»D…”RÍĂlŒa–ZN_óB@Ö.ñY&Cè¤ç-˲ï{­•åѶ»4Ç_*Uopñ2 ñ´¡pë¢í4¸a0Ăà†Ñ²ă ư# ́`é” ±M(/u°̣U9wXyÔ:îܧªwû8®I‰Ưík×;˜:Úü$Æ/¤àÖßïÈ8Ñhæ¼xin3sFED-Uˆd,³îÿKA65₫Èơ0ă&ÑB`„…/¤s6Φ˜̉—·ßX¨†uܱ mi 5àpÉ¢o®YeÈ Ă嬣J9f́à̃ú+̃TQå·¯¿‰i(ûAiBt}_ÄÆ§Ø TưXy÷ẂyÀæ~™¯l lÓTá¾y:{ë§a2/æéü¶đÿơ>?>©#íH›_züª¹suQ\rk9 €Ú(*¶ú­5q@¦nÊψ¹£ñÜưùm+½ƒmw$‘{‘êœúÆ·|ư‡Æ<ơtÁ÷êoÀƯ®x(0‚|„{†ùq ÔΓ´xÚƒ®Ô‘Ũ‰ÀÓ₫ đ\»ëëLw)ÈÊáÔBù)¼Häđ™éá#µz£Ÿ†đ¢sÏ£’7Œ[ơñ£„ wƒz¸ ¾w·}[·UơÑà…ÛøîßƯ~²B}ûúR€öBy‡½Cơ%A%t­úC©ˆTn…JÎ9PÀ¶-Nɰ̀́€̃*ZSăÈãyë¬126ç›îÆá˜n‹̀—‹‰%±G̣§ŒD•­|´ÊdJo<–1+•ưT¨ëàbÆkk± nº;µ¥ˆd. Ä óÖ5®KZdüpÍJ.i±ÊNnÍ8Óï~üƯy>ỵ̈×_`óƃB– è4 !‡OØ̣sÀÑŒ i:ë\u² âóVª)¤/¿}a²8)öĐ#Œ̃ơ¾™mƯ×Ïơóëíë<̀ÏóóëéiJ§ù4ă<Îçé|^Ïó8¬o··%,û¾¯a]Âe0Œ6³Ÿ'7ñ`ƯÊZ Óú×ÿæ_óp}».ï Û#ae›k³*QëÁ Zi°ÄÄ)— áµUV¤cµÖ”RPi†‹«™füSŒ1戻ÀËĐp'?!Ÿ’}l*³˜¸QWr.Y‹)'qûB*Ücœ­VàY”€AWíˆëªXÖ6SªáÛ}7ë| ¹ Ѩ•œFX\FϼR£À7¤H…q7Ÿilx̉²-‘5am¨*«ÇÁẢ-sCÜ+÷G‘ßdȨ¢j¬)$б‘q¬¼ơ¹d­µZ챇}Y—Ïåóăö±„eÍ«R Ö@¤(—¬H́éÇùÇ?¾üñ¯¸œ/ó8O#›Q⌹& W½Ä+[¦è—RL1©&ÊÜ]ÖU×\SLø4ª*gœ̣<Ô,₫0àïaßö Ư\ø ñ@iå«÷äÁ]^â²ç]+ )6èËK\x›4¬Ç©³îixzF7J±ƒvd̃ÉJøzy¦i²“5¶êZUM%åk©!„BÙ(Æ…́_’ȸÁlqăƠ&së!¦(}w¥”7b¯ưä¸fÜ7¡¿÷ ̀ÍEÖDéº]oá¶—]ú8G}+VDà@²Nj*̀Ú$ ­ÅĂ¼Gá@6ÅçA15ëèˆ!>¿jPµ´28÷̣€ûÓ<̣ïS<̀û9ĐFÄo)°á•ä? †ï"Ăe¹F¯Ơ2°ÚËgöăï~†uí<€Fá!ËañÚÙ˜L¤”‰´±ưñÙ¶†ơËí epâÆ`\j6œ>VÍuçÎ(óơ·¯û²?==ưOÿ—ÿ)ç¼^׸EŒÚó̃ê¸Tˆx4úPæư-(¥Ô¡úàN×N}Dùß’/ºÆôwYâ=0¦o^¥'¨¯đÍàáƠjăîKđđ4A‰<ŸïăÆ»_ĐqIÑSûÎx«̉í?QvôTÍj€Äî´'÷7¯.̃öjóîf42’“c×̉ƒ7/Íø‡4¬4¬º´Ú‰‡×T-[l{µñ´äèßå¥}W-đí©̣É«¼N½·*:^¤µ X¿ÑH’ Ñï\d¥û¾â ï¹Í»sƯ í¼q³Aù·§]î’²AµqhA„Ƕ6bĂ׆wè(co“µ’c™!‘­or¬É†¤…¿À6 W5´i¥+ ‰Èhe)RKX0ÎÆüˆÓ9^ ¥x&¥–¹̀læÙ¦H B¼ÆÜê¡́#"¢PB®ùäO/ÿ§—ß½ü₫Ï¿₫9æˆĐ±IMLPn0”"ÊA:*-¹Öºç=–hµơ‰…ÂÈ0–eW$|ôTQ5Ö˜TÚÓn"·[®₫ú¹|~½~='(–5óÓùéợzÛnïËûụ̂₫±}l;;x¦’àÂ{Œ6p T2Úhằx™”V9æß̃Ă ÔZ9³Ưzñ°Ă‰'-̉R +;q₫´đyÑ9C”Œ¤öÈ>ᔓi:Tï&[­«®¨†ÛTœCQJNYFÿÇ}Ñîé£S#°åE“OñV]¹Ó¹êu¶ó4L`9g—‘NÅ#ë+¶µ/”4ŸÄ*K%F(ǵc]2.'ă´3d2á—<7'AS¿jÉ¿r ÑÖqßÂǵ³î31 ̀–6d{Qk{*Ƶ6)!†T’2 ¢0z…ämµ=¹Óó?z}zO³óó¹ /­£5¢5K‰€̣u‹{CÔRØÂº­Ûº­·uÙ–mÛö°£ơ€µô$̉Ü”2hΔÙN1ï±DÖvk É÷D {A* Xđ‚rj”ÂföÉ.ăåi|zpÑ+E¥»€̉’5Ú`ÊjÉb1¤@Zé”SÍUWñ “KáîÀé€ÚĐÏưsK|áàz©I{ăg;nœư|σ.ó3¶´—ĂÜfƯ¥”ª«È0°‚ae†đ@rÙc‰¨¶̉€ÓZ wï,éßóÔK=öeA}¬Í§Uµ7Ä—tᦩŒé€ư±.q¿¯¥ºjb(vy‹6Ó×Zja«¨Fñîßă¾ï ôGNË‘Fc)¸÷ÈAC^S%s–Ơ6hâgjø÷?₫ûÿëÓÿ-ªø—í/[Úà1u‡7s­j©{̃÷uwÊ9åŒ2ÚiA5̉ËË%ÇûŸÂÖ£¬±`váOl‹Ö²ZÄñ@G_¿±¸µ_sßΨT1z’T¯¾»ăë+ươ·¯W{­¹¦Ÿ“µaçRéáWd“Jw ó{Y&ÓưÔªîûêø³bîU¹X,´‡ŸÀk!êóäú=ä}ßk?ÜuÔl»ëÍ߻ר¦Ç“â˜ÿ|¯Ư¿Z_0bl̀Áé>‰‰–4¡ºă,56aĐ÷æï$Ư}}âăú<}ÄO ªÿư éw‚Ç×ù›üïưS7|`€Ñưbôßø¨ñjOöê¿Ù÷ï©û÷£(|0$m_Ă,ơ»C¨₫iÇ/UǵNôưâơxƯo”û·w®l†£³FA/>_0́ĂÂqX+mZ¹™k3Ă:¤]²vtà@Í‹¥§Hà—–e^Œ0g”&N˜Œ66Zjq€üö:K2£ÍèF¸”âƯ 5̃ u˜†ILÜÑ­Á6€ôA4>Ê₫æW•4i«ÉÑ’—ë~Ơ¤‘¨¡…Ơ)î2`gtĐ@”l Q"J…ÿ—t’2FFV[‘Ê!cHœ³9”ÂVܧ₫„ ́i:=MO(æiƯx™/—ụ̀ĂÓ·ívÛo˶\×ëụ̂¾†ơº]·°ÊÏ6EfyMzXñ5Ç»2è‡uIâK6̃­ä#¸ÎŒ%î™Y@¢.;ŸưPŒàʼn:_>2¹°B2±™·í†¤‘!́×dXÊ,ë2xÏÖ[ ]Róư¬¥îa[X–åº\o·Ûơv]·”ü´pFp˜ ®Áđ3Æö…X¸€·†,-é ÈŒµ5®đÔÂ7e‚ÊÖj;Ûù2^^ç×Ëx™ü4ÚQ4H ,qÁ €³f­-¹ÄrEUî8´RBVÑZóT*§Â–ë~ưØ>–°lqÖD…Đ?Ùiöóy<_† $^ó8ă7J0- ˜êÖœ‘đ«E¼âsHjÂZ§Óf`“€;®M‰Î­q̉âÉĂî6ƒâ{óh̀VñÂ)Fª;L4+*æ.̉±•à5qN9ăŒl¨¡œB¥¦TB‘ĂN;‘Ͳ`v‡XC¹ÄÏG.cM:©`îÄ·Fn=H̃æ<±Ä½́1Ž́E•?¿ÿÙüfo·Û-Ưx©DD–,‡B ¾i´AIÉ×dKà}¤²‚‡ -– h‡=Ô2̃Œ́ae;HïX¨9{+n¼c©I1âdïûéÍ·è_₫öTB¹¾_ùË/ƒÂàV«t:ZE-½ZA«wBÁïRÚpo‘rßk–’à®q̃0ÙAAH%"ؾ1ÿ7`™\ÉüA4‰èwaíƒĐñàùS<à#ß¹q6襕H?̣Q'J€₫£jjˆ_¤̣+,|ZđưZ«ªJ́Çû¸o` /EögtƠăøª m߇'Öă=|÷ ú¶ºè –Ñ}\%ßèn{jÍ]µ÷]dO÷uÛ=Ú¦µđđ«^çî µ£úđưouÏêùQ’vGïÛKó†4€¢HzØCmYå5ÅXq_ÆŒ·=̃‹qK¢&©'uñđ‚×yg³e´gjKN¬”‚IÙ‘̀U«¨ åÁ‡Ñ³54±äg¦uÁƒ¼¤Áâc‹t˜a%RWਘ6fAÈ`]«Ó—/_Bˆ×íz ×R‹^|?1B÷ ß’VêˆÈæ§́Ë–[wǤb >Ô«̉ªÎj¼CÜ̉àI‘ÙÍƠ\ß—÷/₫Ëä§Óxz9½¼_ŸOϧñGỊ̂`@½/ïKXÖm]öeÛ·œsÍ•¥Æ`!@ˆ́₫±—­ǾåÇK2º•Tˆ4UÍVTªj­QEq»ÇơÆ̉CíTÇvr/€NzLqÏ»$¨&Ăêbµ]÷ơæn×ízΧñ4ÚÑ;oÉîó¯Vµ*³å6sĂ‘UUq=Ï*]t f̉¤­²,lK²Ü5…ÊBË–¶1Œ§á4ÅiO»8®íâ$]̃z%[È9-ïaV€Êm‘.TJ¥j”Îæ|.¡C´₫=0†́`p×\ vËÛwøđ,´T™€#H[K…ö‡¨½¶R+³&2¤¬2ÆTUMfOa€?B¤]᱕!+£Í^wĐ—6ƒæqæl,I_""ÇGëxx´·1iÜ÷}Y–÷ëûûíưăúñ¹|Â÷ÓæN¬°Î°$¥¦ pJåP̉'%5"—| 7öylưàZ«®z°ƒÖú́Î?úáôĂÓü4³Ôê9ç8«n Ö.x%k̉û¾êÏÓÑ’h9M°ïÇ₫‹´-n×íº„å¶Ư>¶đ L†œ¾§áé‡Ó¨ùñ†«‘áE*Uz.ü'IoªÈüu\Wª¢ÏMĐO+¦_Új3eë‰ZFṿŸ¬̀Rʬ¸Êẵ«ÓQ~Z9"É@ưÂ="g™{@¸b…IJhؼœœ·°A₫Æ?{ äÜÇT ! (HXNª‚·erakØâ¶¦u‰K(¬µ«¡§Vú/¿₫e‹{ ÎHÔJw¯=¼ùq勯“rZ·•ÓèÑÂĐD…P\iỤ̂jŒë(…̀#ä..œˆ ÈÂ÷e[Ö¸bêxisă¥á₫²+o₫ n5)_«fh¡H©ª¶eûßÿô¿;ëÖÛµîȘR †v£ p<åäÓØßåd!­@ÆË)?pª©TékÏă Ö×6ƒoªøsƒz0áÿ‰‚áøªÑăÙÿøZ; ûÁZomߣ­;*Tç}|¡'‹÷QưyVŸjBơ)ÏZ_Î.¿ù{ÿÄÚ“Î; đyZ‘pW!4{æ¾vîqº9ĂQ{t´­æQI)•Rª©câ~ï9‚˜k“˜ïœ:ïή4Tߨû:¡'”åé÷h[RV}÷7>^Ư[ư[WÿC5Ü_‘_èá½µù«5*×LF ,‚‡û¹f€pt}¤̃«• Ú«‡ ~ó”sTà}ßSL —µơˆö9ƾû…aúVü÷pXJ-[Ú6Ú(̣å »b†˜Æ³M‡ơ³ŸÁMB=€ĐM§nŕߨ$z/¬ø ä?>>₫ăüT)&v:/TÖ´.i¡H‘Ón²üj7HLNqω{nêלc9Àăª ¼Ïƒojù2I7±³l¶¸‘"»XḱèÆ_ü/§ñ4óëùơ‡Ë/§p„~xúáơđt‚Åậû¾oûÆY­rk{XÂr[Œ1`¢Ñî¢^hÀÜqèAÑP¼vÚ!'ÁûœHÁ…ª®E0ÓP¬°¬¶ÆŒVzôă‡û€}ö3´•ªªCû¨Ô!o•vZ)%eXm̀bÜñº¹øe@Øó.spô\·´Ñ%^.ĂeJ̀¦E3Hmj¥ÔapTÛ”£óËbúe=X}˜h6ºyØóf Ö%Mf œơÍW›‘QÎY[½¬KÈ}©̉ÑŒ)`:—)UÖ¼ÆqGn(µè¢‘Ư6úqÁrθj)Å&6gđÂ=‹ë|§}ëu¿ú›À2ÊŒ~¼ŒÄJ̀~vÆN¦´RFYo?°É ¨¬Đ8¿­··Ï·/×/_¯_ß–·ëvŒ£”Rđ0íxO¸øsZi0₫Å8•¤”2Ơè¢M5–¬#ç”]ªR­¶~́ƠRѳP¤tÖ/ăËïN¿ûùùçŸz½¼sçœ×mÍ{̃âvÛn{Ø©°ÈhFc Ôö˾¤”næÆ₫›ÆM~: §\².ºÖJ™X‘3đỤ̂nÔÖYd¯vøưé÷?œ~x=¿¾œ_Χó4NPS`‚´lËwd‡1Í2sẽƒt—1xñÖcmÔZ#èc Ëç₫¹Æ5—Œ”„N7£fï2Yö1»€ù#&rÍ÷ MżvµD-\–|Øk%"\ZƒJ*2ăuX¶^)́¬ "E5s¿™ưaÛ†ă ¦Ñ!ç!>b@Q÷¶%.·ưö?¯áʈ_µ¾ơđ§Ö:×üÛ×ß¶Ïm²Ó₫ÇÉM8tXîT“-UªÆ2Ị́t>íaÿ‡?ưV"í8 ̣7`P ¸/‹ˆfîVa—̀7̃nokZ?·ÏÛ~‰  ¥ä¦ạĐôÑ­ üz‡8¢V9Ü=6»!ưöËoª„tđï—B÷ˆÿ ÏÜ£çïÀ§¾è̀çiö̃‡̃?̃ûè âÆ:t¡ªÉ;ïĐTÇä©ÍO©ÔO»ï?àC­uO.„üØnj`Ư2d°ÊQǦăĂ.êƠ™Û̃s^jKÇ’đđ‰)RŸ”"ZD‚xuUđ× 7$]Dk)nA ñ†Ä'©w¶iJ€«$ƯeK5„ă›ư,â¡,iZ%9¾E•8Rº₫¼é‘ơ î>Jº;¸r‰¬¿»È¾¹VjcĐÜơf7vwqUx÷yùbúéJ¦]rdØfƠêưàKZ¡»Úåç™cË€­3¶ưÛ@ăP5›m´UØ&|vÊ«ÏÏ"‚¹l*âgÇ!;n¸Œ—\sŸO.9&0Œï $dH­yƠ»ÖZź0Úñfo`Œ·m‘ă·k­Oú4 Ó1çí‚c—°°\aIº`ƒ§¦ú—…f/{Œñ¯,Jƒ¸B{gî±‡Çø‚'ï忦’ ổA4f@¾IRƳ‹¥ÊB-óÍë~uÆ}ùụ̈—·¿\ÆËi<§ói<èŒ́à¼s̃Ïgø«”T ©DQR J!¥Ơö¶! ÉYh³ï¸åDÈ‘…ă5Ä 0‡Ü0ø2Gï<_µ¤˜„A9ÑFsŒ÷²ƒA„Ú*‹·WkE¯T"èѪTѤuäd;﬛ưŒ9€8£‹RP!gדŒ±f Ë5\oéÆ75|²­}ßßoév §y˜g7£0Æé.B£ª¬Ë¨i¥Í)¬ƒRÏ4a<ñ9ËUØù<ƠlÜ9‘ÖÔR LÀpƠZË^B [Únárà•yJ!EjĐu13aO'c'?å’;(¥¼ơçù|™/§ù4ŒƒÑ1‚ ’]÷+/PƠˉ÷&æ0PöŸüéyzÍx™.†̀èFt¬•QÖÙq§4Ê)Å”}†2åöđyû|ûx{»¾½-oïÛ;́}™PW .<£̀́æÑ§ñtN@縡 ÂO5Aî")đÁ4ÆѲ/×p}Ûß¾l_̃nohˆ(Ră0>ÏÏ₫yÖóÏÏ?ÿ₫ù÷?½üt9]¦ảZ§˜B`̉Èd†JƠYDzƯ°ïqç0í;L~¶ûíäŒ9ØÖÏưón©&øª&“üô4<]ÆËy:¿œ^æ§Ót‚™UBăŒÖ-lkZEg…‘Z›%)$Njʋ*-û²́Kˆ!×́µÇÅ3jásË̃Ô£y™4+¡Ûɵ-ñsv©ÀbËVx‡B©3Oó<Îa TØ5RƘîq—ßÎư₫¸ «óëmp͇>·µc+ˆLd{J%Å·´maăÛ?ÜnéJ`ÏkỀWé@+ç[[ÆèØPXÙE< ¤–µR:Öpviµ­›"ơ4=M¯“!C•؇Ăxîb4¸ùm¿}®Ÿ±Ä%,8qP®ƒÛ#CxPpL!’k^U¤íÛáxëb3đĐZî‘è]›¹ëØßé1\û±G8̃¡ÇÚY~ÛS¿NMzÚc?­5lÄØâï[Ä}3^ªÍ;²PGo–<=”ưG8^» h£çyÆ¡ÖIæw|r©¢HûƯï÷üô\KưÇüÇ5Ai/ª‘°jt’1EG8đÙ¿>!́w¡pơçû¦Uo÷‹ß'$¾”Om>rûƯơ®5₫ v=¬kæŸ$ÿ<|Ñ7Ë™§ÔiGúßttÄe h»{Í’Ö]éVï̃jfù“ª¦ưÿFS‚Ofé( ±c¶çơÛª÷₫C=>íÛ'«F Çï0Ú¨‡Ç믘4ƒ…ovÂÚZesÉE£ÍqË)>bÚèJF×rơKKF^„½–1ùµf0&›B©GYh6Đ€b;Q¤¨PRiÏûÆFÆ`k«(^“2£É̉‹ÆgAư©ú…LÉíĐœ5¬(”`•µÉÙ†¿øW«m¡¢›´¸ăèQeZ…+¦kŒÁhé ˆso†ƒB7ÂaÙË ö~{Ü0ói8q̀X¬Cˆ4i§•Q̀ø@Ç¢Tö–IEgưr~Y¶Çctóæ£ß̉6¹©P™Ư<ØáK.hÚ-Û2­Óu¿.qYậ±~ ©–uN9Áo²u­4|T‚̀Oèü1‰(ªˆd{Ÿ< ‚¨’öÚ9‡~Œ°ÙR]scÂfë³çmw7bÔŒ6`̣­gí±¼QØH xe„ C„ƯvµöÎOă„kƒ}̀Z†Qæi~B’×–¶e_¶¼Å—¼¬i½í·qça>Çóy<Ÿç3ßÔh !hÈļÔÂ¥µZ鱌sÏûù2_–}Ùó~ ׿~ưëm¿̣R7ĐÄY]A<Ë©¹MËLI5gĂ~̀’)jü`¬ÁD… ~­´áÊAíªcj„ơ×íÊgYñÔ˜ˆRM)̣v›jÂEÎ!MTFd¿§–¶ÎË&Q¥+óD™@Db®bW…J¦œ)\Ê“Ùt_ÓV|§5G jÚ¯JU¬]À=+µ2“›H‰““‡±bNå¬ó̃Oă4 ƒ6Íø°Øÿ/Ûr‹7¸Ä¢Á t2)ä`‹U¤J*[Úpwđ+I)C¬Ñ!‡ªë́ç‘FÔH{ØcˆÅ—2”ê+mmÑÜEp7¡Ñ£§q:g„ xë1̀ï*Ơ9çœ{}z•ĐCÄŒÄ÷°¯Ëú¹}~ùụ̈Ûơ··åío©&oưd¦—ñå§ÓO¿úưï~÷Ăù‡§ùér¾L~RZ…¶m[Öåº\?×Oˆ́á̉ƒ%"׬Hơ‘aH Ư"e*)…$c¦NƠd­µÄ#ÖÉM§áƯù`çœw^kJ kÈ9ïiôG¦́—5®°9+!ưx’øï¼ÓNkÍ÷W%"†ÉÚ¹ˆ"°åfđ”YäĂ¡¹(Ørc¸µÜ±ëá܆· ,&s›”…UÍY¦´Xœ±L¡IÏ¥o-ª(I§8l«0wHkmŒA„œ$[±[WĂưœÓ̉ ă-l˾\÷+Îà-̃–¸đuK£›Ñ˜h̉̉́ÑôˆSĐÇjŒ½)ç\U•ÊJ¸ ̉/ăLk½óLS„co©)§CJ §Ä0´ö9F[^È$V„Xc­eR.m₫Fqø~³¿ÿB¾‚¥ưÚy¤Ïx׿üFÇ¿öÿ(MwùëÁ́ï|ôû'?üTÏ×G£Jx5R~^?µÖlF¼éºôÇïư.È9(nư÷$—ï>ú!Gÿ]mô4OÏ/ϵÖVÚăø÷́)ÅÆ_—ó%Æ(ÖÛøíXXîHăƯ;—λ°?X¤×Nå1i°Ñîy§Æîâ/4—ƒ=)¨¿bįWh^ª—„ß_Iư3¥® !ù û®ï•¯ƒ£Æ,:.bơÍ3ƠQÔγ_»tëïA"—1®EƯ×Oº:á(%ơA)ë¹Cµe%Ê×W›¼ùz—דˆï<ÜéßÓRKát§£èo×o¯oEư;¾¨w³ü5§¼ÆU~Û̃èÆÉMBÇÇr ½Ư¶œ2L¯¡U¤tƠb XJÙiG)vz¶'‚ï§vÀẹ'u‚¶ !ÙÇÙÚB¥JuE₫Âÿ8Ah—~đÆ;çœw“ĐXè\÷5— l ©À–cå’T;ơg¬‘ˆj:îUNÀ‘p™oˆTˆ×1Åh#KÁà¦â››Mó~9Œ_Rä4ûvLB ×ưÊ\<]œtÀ<î¯ø̉`8Ïçgó¼ï{̀{ç-̃náö¾¿ëE;ăf7Ÿữˆ—é2“7^UE™$<;«Œ°Ó{ïO₫t:Ÿp¡nûv6ç¯×¯ŸÛçW¦n“ÁZ[ö­µ¢ÙƒqAn[ú²vJ+´Zh:ÄaØïb.ӵѶÚfó­—Œ‡>èç₫Ét ,¥(¥B &­t,qPƒsÎ|Éɵ9á–/•]‹)9çÁ1Ç5®µV£#/¯V]5ZŒ̣j`é|\?RNKZ¶´ ):ëb£9ào˜VP5ÅÑÔO9-q?Uƒ0¾`öv èÀGƒ%p?BS-nqß÷u_Q·„HÓd&Ü;X?ckZoéöeụ̀ẹ̈k55ÆXKE×^fµVTï̉WJ%“êPkª%klLqÙ—Ïơó¶ßp•RX ´Ö̃ùóx>M§i˜Pơáz€ µâi:Ïçóé< ¼q¶mû¼~¾ß̃¿~|ựùåË瘵Ç6'wúĂË&~:ÿô<=ÿp₫áåụ̈4?~¤B˲́a¿­·ër½n×ëz½î×ÏíóokZŪ÷Ùσ>RØQđ2ZmØ+u³qÆe&)N,¥¤RSZ£ï»§]˜*°*Æ(̀[%̉4Ll‡`ưhG «¡”Ÿb¥Ơ0gwæÛÛx%‚ßT©P€÷%É*ÈM©45dY[<ÇܶÜ( _cjJçPkµÎæ)Ă{˜³¨®W}Ñ!< "́ï ü°ÏoQó8S%£ ª眵gø8LbH1­ÛzƯ®×åú±}|¬×ưz ×-m{Ù%1—%ÚÆÏn~½¼¾_Oăi»m¨L˜pØùö"¨wúÄ>ÅÈ̃i¡Ë<(ĐFHü•jŒqÍ«„W¾-o… ́(¶È’$^u›f3ÙI5‹SUÆØãw­£o°…ê7íü}ơ€áïüçÖë́i l~uú¥¹Ùcätñ,=vzdV×JÊ^HQoIw™è¾̀x°N鲪æưFWÉæû-^‰¦º;V%•_₫ú üÜ–Û‚̃ÊÇä@bhæ̣ööæœË9ïa³ù ̣âÜLo¶=hfqÀ¥T¦̀  €îơ·²à^‡ÑK¿^P'é8Óv°(}~V·Xxyµăơñ[Ô½dä(Œ*±¯đÁ"{,Đ?¾Ó£Ûï=úză›ùÓƯµH}đ )9*Đfsv_ ££µë«ØÀ̃³°ˆ`elÆsü²ß¤Ö}[ÜyZ}¯P®†ø[1@]´ÿU‰(’ ’̣R¿á ¼Ø!&…?…&1˜ađƒªJUe”a’’Elk¥óƠïsh §˜±yKËÓ©¸júzj†îr0…|y|ÑÎEm:ulºR @ç¦;*02™?ÚâöĂwË\Ÿè»W ¯,RâêĂ"­÷Ö8” JÉè€û[̉åjFs˯pŸĂï(GáŸđZÖTƯ€h= …OX(rIàŒ` ƒF̉ ŸÂ˜HkÍÔ?Ï~†÷1H!æÈÇ\)g!ƒæi¾̀môÇçÇ6­a]ăZjA— Y`€’¨Ç ̣eˆˆ ÷w&ùI₫Q[·‘Ø$ª1nuÖÙÚâ®Pà­iƯË.—%NÓhǧùéåü2³­ṿäTIb³A –“‹FªÇ[¸}l×ư"‡áT%¥GsäÙå|yz~ụ́ơË_ưë7@ Ö0(­«ư|̣§ÙḮ¼™Ë÷u_?–íă}{Û̃u…àäN£'?YmåÍ́y—€âkÙVz\]5”Ö̀ç®í̀Ù͈j6Ö*[ܾ~~ưrụ̂Ëí—_¯¿b¾6êèÆ³?Ïǹ •.ªle»m7єѠ‡“?ưy°.˜ê@`ơ¶Ñf§Á ¥cù‚—ŒØZXc/ăåùüüry¹œ/Ă0Ѿï·¯_¿||ùzûú¶¼½­o(~°pƯùuzưáôĂÙŸ_æ—×Óëeº̀Ă DºË¾Ü¶Ûçúù¹}.q¹Å[ˆ!S¦J£Ù‡À¨Øö±©-q›;ăd É‹ISÊa&€Ñß±è|(B"ºÔhö—R¼ó^{äú ~€ơ–XFzçq`ư‰d'Äiy÷Ú©3|rcï4s*₫¢d¥”ˆUx›ÙÛv½¸Í!?Å`V¢joóOµÖÊ·L"VhØBđÁđr”Ï9cÁdƠ‡18zÆ̣º'Ñẹ̀ÏÛ÷u[—mÁYƒjeÙtÓ…Ï9úSĐË|̀ «>'h ?ମ íơ&›G’@ÓË‚V*=Pjö́ƠS̉-܈q́øGï[p"‘•đ¬ïë7Pw§Ù¸¯ûỷÿ–;lÚ ”R æo»„¤î±=†i>„Dÿ½§#E‹yx;uÎa_æ™ó· ₫ûmøÛA ~ÿy‰î:Ñư „ÿÔƯño! RèjJLpºô¦¥´´«Ó|†¡Ộùù =Øq"ºÆ± a½9:íÔ6@¦úÓÔŸÛ#T”} ¼¯tû@uöOwn]mJŸ<§çñÍßñƒêP`ds7oê™Bô¤€Sq|ÿ{’ƒoÿ‰D¡Çƒu\ÇáĂ_Ák‡ç‡ă{|/æM\(ê©HÈNm‚Æö´÷₫¤ư½ww“¨on˜û;iÇeô·3úÇ·s¥‡‹I)ơ£âj3G”*¢2‡RJ^ {#‡„ôD{vW$f2\ (Ă× ®X\ñ}$:BC”X¯PÅ^Ëùđ”ÎÀÀ¬€ƠÖAđÀ^–î ÀͳŸYI–B” à|‰( Kæ¾H=kî1ư5F*=§NRip9 ñlsÊÉZks›àkn2É…}x’&æäàO–O€«ƒVzµ«h|­µ‡…H{\ƒNĂư »If!Ç-ÄpM×úáŒƯHÿxÁ7Lp°µ2Êxëça>Ïg4\µ̉ÖÚ™f”6:–B TUÚi¯ưà‡ÙÏ1E@"ø·²N9,ÿpc²Ç%L̃ 5ç}‚%̣̣ộ̣ôb­-©lq“Ùû·¶ÎßÙç×çÁ_>täè\îđ5ç Đd«@£—.à>&¸­ ×ÜÓ^tÉ5;ă.ú2ŸæĂ×·¯T5µ¸"%«Ónö́­‰ß^v!„̀d§].9«J¨±bf…o—kDĂŒh ӼͳŸG;Î[Ô8é¤#¸ó|†~MĐëv…’r̃ç³?fPJI)x̣'dù¥”Ö´Ö\Q IOk×{Êi;s]RñUUÑbפ‘yBˆ%ni[ĂºÅ-”óͳ?×ZÑƠ†•Mˆ©y_®_̃–7˜¸‡XÚ¤´7₫ixº —“;=Oç±1Ù*!HQzhùîŸKXàV VÄê1̣6₫†¥ïƒ‰sQÂ)@¡6 x4¯uØ$ '”)0Ià?Æ—ñ0†ÇÏ +F[­¬"M¤™Œ ²4£ÚÚÜ÷Áï—e¡~gé…̉’*-«Œá<bØ̣ÆÙ ¨jJæíRØDhîè¢ñ9̉:îÄÙ.Î:E₫¡®)Å–ˆx}±êßgŸƒBvÛn·pcºTÚX{ÓÚó Uaµ=go½&=øA¶<‰Ï“{è^Äß· ~­uÍäÅ/å/p®K‚·‰ó4¡?Â0]+C汩JwmSƠüÄ•ơtÿ;øFî?¶È¼>îûêè2‹»á4¦LW¶ÔäzNZZ÷lŒG°d>¬œ=X¢{|/MƠÏ(«₫=¦WYÉ₫xđˆHHWÀññgÿ2Ú}î;ƯóƯwˆ¨i¦©Ơœ£Nuơ°ëƒ,¡?t·½hÜ&²éà¾̣ư+ôür“¥¨₫ 6{́GÍDd¿‹ùîđœ|¤¾–U¥«A(C .h¤6º´3¥E§ib́«µT\`´µ 1¶jèSáÙ& „ƒƒц¹ÙMvÚ˾„Ï1Ê zÈÎ Ô{ó<mö´‡b {²C NrQ›`³M9é[ÊrôYkB/A)™#—A vÚcf?£0†₫ §L-^€49ëNtÂư¥£^Ór€m‹7^4Ê Y×ñ†Ú;çl”ñÚcÜ1óàáUcæiëñZkÉ̀ pÚ]ü…ˆœu£O₫„̀,E*¦xK7°đK)à=ËŒt£m;>{*É&₫)¥tƠU×Ñ^{£Rˆá®ïëû5\Á/Ÿíl•ƯĂ¾í›!Ö@•–}ùØ>̃noŸñs‰ äÉœñé.Ă…Ỵ~½˵/0 º…Û-̃Bđ´©Í»ăđÉUÖ™C'*P€k¿’rΈ>d_¼ă²ÄíÎÖ«vœ́„Ô„ͤèË×/ïï[ÜđŒnö²Ë´ç;sƠZSD¨`”Q¢:VnÈ©¤× L°Λ̃yçÜàd¾â°L@±-ĺ¸Ö-m¿-¿•R7<ÏÏÏÓó4L1F(©[>Øó8ÅÎ:äÅ"ZíÛ˜â-Üb¯ec»=új9N¦´’&Ù\fđ=F?̣t&"2–—gƯä'|F¥”˜À s„¼bŸè.ÿù¦B*Û¶ííư 9 Ÿû§VΉ“ä1«RéAûº+­¶¸íû~Ư®£'7‰Û,Çô-w4—ˆ)± ­̉N»ÑŒàÁ£ipRLo_ß–eaHßüËv`wp(6T(¥D™̣sɉ’µ–}f⾆u´#Ô¢!¤†i¥'?•\à[4\xjqQm û–Bí¨Á̃>̃kÀưXĂc¤B³›7ÀỀ(é¦o™£yK-VYç] hÇ‘û>:T b²äµ¿øËä&T¤[Ü̃×wª´‡ưF74p0=ØjufƯNˆ!Ơ´Ơ î™\ÄBV®­QfrÓèÇÓp’'Ä÷°cVíûMa*BWÀùÊJ v¸ŒŒ;F7Â^· €ă5¬Xnñ–k.TÀà×JŸƯù2\ççÑŒ˜æÉÂkµ=W, ¦ˆ­;gn48á*±ÄÅnámí³ÇN*@CëgK€Î;n­´sNW %(˜ÅùW´È`×HÇñxÍZTU°Î”̉w ßPØçµÖ—•ªÖ ç7ázA €~ù²/aƒĐ¿ÄeËÛƒe…V,áƯ<»‰;WbÅđ¬!ŒB[ØXq[;3VÎ׿Ù₫"ă‰ơ=˜¤Œ6¨`¹Ej̣ÓüăétúS₫S^s—èÁñ¡Ó*½ï6/ù» ·C´}{»Ïá:^¡qÓ|a”⇙£îÆ„Ê}mĐÀ̀R¿ăKK§ÿ{±¾ß…θK*}/¸ï$>\ó=·Eu&–ÔanºO-8¾ÿÀ¨é_¶ÜÅ ?°-úS;àµüÉũXƠ\wqÄ»\`̀¦kƒ;iđ÷À²wà­=₫?.₫釜Wj´foƯ¥J’%{à䄨CđkAá@:̣èÇ'ơBØv¶™[ö;ßu»~nŸ7!@ùjb›Ütr§ÉÕz¯¼qÆ'ƠC¸i´hđƳ/M­!x8̣ P™Á £¥¯”‚̃7¦¨#O<à":ØÄ'îb*…C‰œsĂ0đíÜFø‘=í×ízƯ®0\¿¥Ûqœ+«Ÿ­¶–lÜ"%̉U? OX…ÁP¢JZëÑ£Çqä¢1éƒS.PØâv W„Rf€ Z̃y1"Ä[‚GónđĂèÇË~¸ÄR) ,ûxû€Ñ;F%x«ƒF?^ü¥ÆZ‡Ê§`đƒ¦q:ͧ§ưiMë–7̉oaƒO|ÎYâ˜.b-Ú{Èz_̃¯ûuK[Îùcùˆ6i5úà)df#(S~™èmănô‡å-u;Vđ¾Đeg³¯IÓ`†¾̀Àp‰uÚá€đ[J.ÉÙ&à÷J9„Ơï+ó<¥̃³¡J’}Ö*Ëf,ÍÙBZø{F3R¤ºWKv´£zY6Ö₫·N₫~³?V÷}T¶̣ăÍK×IpE9ºœÉYL;xs€6ªùè„̃ÁĐ¾÷_ûư=+zˆ\ø½Ê?bø¶YÆPª, ñ@“óU›¦ñå÷$ưX|;EÆ»'rSÓăâ`²̣›ï»«|‡̣₫}WVµP9ăŒ<~ÀïÚ™®ë¯ y·ÿ €₫Ưh­çy₫7ÿæßxï¾|ụ̀_₫ËßÙÍé8Ö2D£Nø¨‰ÁƯ| Ụư;¤›o1‹ôăÀAʃ₫’Úà( eÓWư'¼k´·2à@c÷²]êhXÔ‰ƒùº‘;ª48?đæ)ÖÆsKH± PÍ΀́%¯x†¢3oíĂ)TTUE±̃d¾¾ª9îmY¾¹™nƒ¶‡ü"Ưnx)€ƯƒNăüÄ*:¡‘ÓN¼öx[U©e X̃x§œ8µ±u¦:ºé2ñ¼cÅ5Ă#k@WêŒÔ€½êÛµL51”©J©£Xÿ~Ơ<ÇdÙ¸‡P ¬aejoe?9X²p$J yå%GxSîo=™2*–˜#ب:0’ÆaA_–‘µF›i˜@ÄŸ‡y;¤½¨B B­µä"X­ơö=îS„…ö'ÏĐ´•X+ ¢`”R´Äàúʘ¾ÆXâ¾ï×p…ƒûèGX̣a"|¹R Èî>ù!C¼÷¤ Rɯ5Ök?¹iæÏíÓïÜLä £ z„è¤Â~@ ³ K¸Ưä˜Êoé<Ÿ•R˾”P@EÀpiµëœæÙÏó0ûÁ;ë`n,£+眷~̣Óö£8ñ1Å%.ˆ³å…´ªÑ§tRYå”á['=è™æS:]âe+KĂ&ÿ•T ï.¥°ÄÅ90^ơ¶î+UBưF‘‚ hToióÖç’‘Ù7Úv|gA¶:ÇØ©"cS­µWQ»XuqµỤ̈í#|Ḷ̌¦"J%f<ûó§÷ü»Ÿ^~z~z†!çüqưø¼}i¡@€'ÿùrÉ¡xïÛûgøÜâV©‚@8øAL'Qª¡VÁ$Đ‘Ï1Ö€=ëYRØPÈ—Ù£Vưđ7ZW]¨Í™p—‡6ˆ¼ñ˜a^ÆËe¼à8¶ƒXâÑ€,W)E“9p|XÉ©¦P§I4ü#TÛÚLá´Ö̀££(-a–4X§”ÂM!µzN¹”ÂŒ!@Ÿ½Fl‡Œơ€₫íîæ™U  .rá¬Ë¦ »a–sÜâ¶—=‚É1”€bCJ';Á₫Ë{A®@¶³Î{¯Äܬf´HJ#}­µ'O *Jæi£úä¡ Áˆg Û4ùƒ ×ÇŸZEÊ)·]·¼gJĽM*)¥êÍøµâ6ă}³²Rs˜©¢˜ø₫ ˜É!(üAăA[P>é;ô-¸¤ ÷{"Cˆî9ßvN¥£ÿOks"é+™Ú»Nơø£'7µÇ%ºÿơß”‘́~UÏåá|Ÿư"¤ë»góÁYăÀ ÑÅÀưóïTídănà“¨÷LëRªÖ*Ȫÿ×c(Ô&ÿ"€\ó<ÿÛûo/—Ë₫ÏÿÏø‡?‰ïï·GÏGƒ(¶”̣0öêDøƯz¬Oú®BĐü4y‚̀„bø­̃€©¾‹6ëÎơb çÉGí₫B‡÷h­•¿èj<₫?Í9@E—JƠ^+RÚö Gă_¦?úđªßiåD¥æâÊ(µ]¡X·LôŸHĐW,ưU[ŵ¿uÿIu± ojvZ‡Z÷₫q½F”»Ÿ%–Ç1”5®“4Tª¡„TS¬±„"d8DóŸ~ê…"Ư˜ÀÀöwr<2Ü0èápÏl„»ÙQ“¹ïÛb´µV¸­ØRN1FDW"» x̉…b[C™*¶o=d!â4"-X‚ê·¶´©̀^øàĂ¹‰3(„}‹p.­5Đà†˜ăv@OUUuºèT Ƚ́9ä-m£ëX!F4ƨªrΡ̀ëÙ¢ÇXƯ¢¾!đànYe‚» ©RMø½ Gv˜,—P:̣04Â\tC|đƒgßt₫]€5Ä+Z¼wl×z…RVUe•́tñ—Ët‡Ñhƒ6${™ç¸×=å´ïûö%,1Åó|†úy>óte 7¬µ²ê£%¤Îyöƒ÷Ö[g¡¢̀àœƒáI 1¦XRá„£Ö°^érÚô†)°èR¨’É&¥´›Z^¸”XkÇaÔF§’æ4ïi¿í·iŸnáÆo{_ Ó¥¦œ¨²Ư{Œ1”p ·•ƒ>¶T~¯ÖÔÿJq Vs@̉gô¤á̃ ́,Ñ…S°tIJ¸Æë5]·²!+Ăÿ4=YcŸüÓO§Ÿ~¸üđĂó—óÅzrø¼}₫úöë_¿₫ơËç—-nZëÉN“çâM)ÅÂômùÜ?×´*R³ŸAÛí8¸¡ ̀w:Sp¼EÅhµÅ%$FR¥È<*UDü¢‘,6đµQü5J7$QJ5…`Ù©µơH•¬±' ̀‹ “$–k„̃o¦ºX Ä8¡‡̣ç‚{:µB́‹*Ûµ¹Á{®è–LÄRơ˜âÖu_׸̃ö ?"J ô•†öqŒMÀªµr1Ó½#_UÙC§SDV ÊûP‚4¡¡ƠZvÄlsÈÙÍó0ô9Dz>£³ăaà“›Ï„&§œ³®gËn+A˜Ă Ê:lr„Í׃{›të>³÷ïíƯ°©…-Ä-bRÍØGQOéÑZ{ïÙ"ß¹̀1 ă¡Ü‘vÚÖö]à~̀:”ßóvØ!¦rçUxü”´U½§`m?ÈƯÎ₫~ơ}a@­Å.8X꣱Kß°Á»£yÖ~.!¿¼Ôîßïươ•2Æ¢oüäë r{à÷ˆx_¡Q›ÿ?â§¾©¯úñ¹:EßÚî™Ă\¨^<úßơWæiµµÿlWØZ;Ïó81Æu]÷uÿÎk6[É~Vđ@Đ÷ơƒ¯¢â×á΄̉ÂèUâ™Ú+’…øƠô]đquuĂă\vt|¹Vúï¶åă4^ϯOç§yŸ.OçÓ9ƸmÛº¯!D̉(R)¥]íDívSU5cf纒¨‡Íká°ªër}¿¾¿/ïëÇ»y‡+Q­•E Ê@ ¬3øaÆq5蕺èàC7lĂb–èâ`†cJ)ƨ” 1Àeê·ííëúơë₫»R F"b_æ  óy:?íOp|bÍ@e4o´¡Î¤Â‹ä©Zê<ίù•"S€½ưçö™öTjÉ)«¤f3f|™^f7ÿ»ŸÿƯëó«ªjFç)ụ́₫åúçëûơưËç—·ÛÛWŒÚ€K-`†ÀW'æ¨I{íœ~„´=u°Æ—}ƒ%VcïzëO₫ôz~=ŸÎ¯—×Ëù2“µgäË×/[Ø”R·íDÎ:µ«̉Z묉¶Tˆ¬%‰¶µ8ë5ˆf̣Óy8nỗk£ƒ UWÜ}UƠB¥ä¢ªÊ)ĂƯä+„d×?úk­oƠăi ñ:Ü%¯9%.¢Ó0MĂ„hï<\ÁÁí¿†•y\q[§s“E,a°We”aܯë‘è×6/®ÿ+/P,F/‘íMï}œeÇ4Ềv́tr'(¯æaƯ8ú u¸U‹FáAJlg$“^¤đ6?!ưưKƯÂÆNX¯û¶B(́{NÓ#Ùƒ·£ ̉sT+ÊRÈ™’ă÷t”*9ë~xư6‘ëºJ‡‹xÙ¬o2̉½̣đ€ß²EºZîćµS ¤A&çGߺûâ‘-£Ñ?̉Úụ̀fî­â/r¯j¸ƒ¼ƯŸF5{‰ûz黈Bz—=“;…95“ÆŸÆ<=?i¥¯·ëçççƯa,]Û÷^¥p‡ô¤˜yXvFöà́„ ‚îB×øïoy¥î4h©K8>ÿ‚€RÊívûü§ÿ4MÓÛׯwn¦ß{cN§Óét !ÔZ×uí?¶;ölîƠâRªSѾĐZ£[ ơú¬!}o]/åÄ˨#ND÷¥ơ~DrÎÔ}ưÚ+Ú¤¸¿Ç´Ö¯Ï¯§óÉhóå·/8z}p~?Cÿ×;%x£[àĐáÏaÖQ?´¿̣ªĂă¬Ö mÍƠ}Ạ̊?è! ́ư[Üzb¥´!­µOĂ“˜f@LŒö´¯u••ưÛ»kºQÆ)gƯ8èạ+€‡yæÉO§é4ó4Nă8~đ§pQUêä #<¸kÛ`^£´Z¶å—/¿˜`Œ2¶ØT’-¶ëÇ’ÚMcĐ€)îe7ÉXeá‚?á3¨ªwi}­a…%w° ˆ¨1¦¨²Rêæ W•É{JYkµÑç\L~à́‘j""qZdb•¶¨"ö´‡=”[QJÁ€oæ§ÓÓÓé nëë¾¢‰K´Ú>ù§“?Ơ¦;DË€=ï^{Ÿ<ˆæ(Æ46F±Æzï­±ÚjøDéªK..:4«UÜË®²‚‹ë²/°¡\÷¦“x)ḾB[tȈö°¿]ßrÉ!(+ĐeCeÄÅØQUƠ\k†M]ª¥²Y ₫`ueQfÇ9ϧùt9]^–—ÛÇçöù¹}ÂIF^N;ÈE›³¦KFŒèö”@¤ªÊi€UÊy[ß̃×÷÷ưưº_¯ñº¥­ªè´;¹Óe¸̀nvÚ|bOóe¾lûcDÔjK ©´ÑI¥@a/û^÷D€Mz¢æ‡}ÛnTi»nœgÖF#‰¡¹Ă0¼_ß—mËe K¬Ñ …-¨¢0+`Âd-§z8M§çéyrÓ<̓@Æ»®×åă·Ïß~½ưúẹ̈+ÊQàN¥ÔٟƧO?>Ÿÿđú‡çóóy:n,¹|~~ÆoÛímycb[‰F›A "¢Âªè-lH–ùđ1:aĐ=»ù4œÄC̀;¯­Ö†cz0uI)¥˜J.%—[¸½/ïĐ®lyƒđZü!˜v5 Ó8Q¥Ûí&dü)<l=°xăG7̣äd˜Ça„ï–·^[­•îÉñ!T#ˆS„4˜ă5PÛ±(á¨M…ÏÓ€&‡ë&ng¡ÎË(Kåáû¬-̀â@¸B³C‚Û½ơó4ÇcJ«jˆAÂêƯ¨vÆ)}˜R¥\̣¶o¡„5¬[Ø–°Ài +$.¥Å–ỉˆßRĂ÷} éΛ¤o' \ùNOZÜ04æ5V³ TFôλŸÿđ³üù/ÿeƯÖ’R®²z”_»Ñ½låƠçûư]â=jï!₫CĐ·;ÚüóqßƠöÁ]ÿ^j$Eª(Kó@Cåo½¡!ƒ»r•e~8.l!Ưưô8?ư₫'çœú«~ûx;jZơØ ½ûZ:€xË•˜¡sŸ*@ .J½q |¹Dmuï%4>XOfy¨ø›¤I‘ưjÿăB !üéO²Æ„ú0³¿ơ¨µ~·Nè¿ó-¬?=‡|y”̀â{3¾ Đ¯_·+üX4iàæE/)§E/ÔÄ9¸Ø{Om~l~,đÈ¡”"’hgÜ13©TKÍ:Ś6•đ²à§A6:₫ÉXc­]Ó ²  n[¤Ñ­ÛJD&˜ZkLqÛ·%,{‡*ï॔SfÏ–mùmùíëúq¶èß?ÏđùáŒæpŸrZö%æø|y₫Ưï?¸áÏ₫ó¾mµÔÑ8S[ÚÖ´&J™r,q+›̃5®pè7xwxêßö̉^AH˜S¤¶¸ƯöÛ¯×_¯Ûuë÷%.!‡yÿ—ó¿̀~₫åÙo» "(ïưi<=ÍOϧç—Ó ´[Ø̃¯ïŸëç_̃ỵ̈Ëơ—·åí·å·/Û—RÊd§óp‡yôăËü ₫e¸(¥®ËuÙRrFDp[¥RФG;*«4iUÄ¢1Ep·¸íÚŒ÷¨×à;é‡Ñ“›fϪZkk-ÛóañÙâBضm ˶k¸èíN0€»»̉Zé§óÓO?₫Trù‡ư@g¦A(7Å@m̉Ó ưÄÙa„§­RªP ×IJi;2₫à^€b[I픾Ç=Rr&6K@M« …mHTU¾DK$9†Xi¹…¡­ƠörºÔ\uåº{ԩ唵̉TÉZ«ªÂ¾‰Ă‹/ËtD8¦€ÿÖ}í¤½Ñ§jj̉ö`ÑĂ¼âÆø§N­{`Ù{:Ö³µ(5Ño÷•*̉6EơG¥ÔaPïz/`€ÄÜ©ÓÊFOßêJé÷wÿ$“„ûÜ®£‰~o_Ó×*ư×Ôe7ơ•ú^ØS¯erTEGöÇ;LĐ̃. 9¼̣兩g.Ró5)ZÑÛqG+¥”uvđƒkBWuà sw›æ=1¸ŸÑáúAI ÜA•̣₫©ËĂưyö!5FßÑÄ́=ôÅ+ViRÿ’"J)}¼¿óá₫çp^JiYđóö}ÿç_ư{̃_öÛG/*xT`nЬÖ9œ̣{…Á㬠YË£[Ü[â3J«Çɾ‹h³­JUü¸p¯×mƯBVÛªjÑIb‚§KUJ){Ùw:.'!üˆ}'¬ G?ráW™º† @¢SÍÍRx`JÚh“±j°"Åd`æçóói< v8M§ÓxÇq&ç«]å2hÁ–̃ùR ü1m¶I%¥œûcåô\83ÂC ¹>ÛDDTZ dv˜„ˆä—ĂT”7/N¸»ÄÅRC$̣‚²mc;´d­¶|Đ(UUIRlñ®xB]k­u¤ÍH@:pN®áú±}h¥Ñ=OçÉOƒ`O‰-jBIeÆİ[̣b‘’‹²„ 骽̣ƒ[e™Â®*U¶pë\rÙ[ÓÜöÛvi¾R¥½î9ç=î #c₫‡Ö>ou•« ˆ:"E4}oëíºsQ crœ©ÀC Gˆƒ¥^èƯø˜–¬³¼&@4×µ̉ƒ”Q¥IJª¬b‰[ØrÊ!„ëzåH„ZP@™Kv¶¶Y˜"¸ ¿̃~ưØ?–°*“æa~ÏóÙZ‹ôÓ’AÇ’u}ºœ~x:ç_ư%i£ 3’SIŸÛgÙ FJ+­¤4˜-l̃x«,ÊÎ=́˶\·ëV 1\·&àKṽŒËÖŒRơÆŸçó¿ÿŸ₫ưëùåÿ₫Ă/ù³ƠvđĂi<=^ϯϗçó|¶Î†¾~|ưúöơO¿₫éOoúóÇŸY~ké?_~₫ụ̀óóé `¥UÉ%Æøëǯ9æTRQe¯;6ÖçSôÚG³Ï!o=Ë]J®BÍ"“j’h­´SîäN—ṇ̃4?ɲ Đ@¡EPy Ûu¹â¼î×[¸­iÅK9ă×O„µo‘eW2<Âʆ^FÏ V½)§D ¶¶´nYowë¿;YŸk×ñ%²ÖăH®ŸWTn•ú)UJ n¨Tó–‘”÷—_₫2ÍÓçíåÊߥÇO J }¿ś±¾¸{~öê%¼ư.D—ïÂ-,²m#æÈƯO<ä¯hÊPßÔoÔ£cR+ó©ÂóÇåßi  Ơ,ơ&.ơ~,V+Â1àÊ]Óª5¯×àCØ64€„„r”(êÏĂHC}J?ö¦å0LW¼Í°[”jG†6_/1?^Jfm~÷»ßư»÷ï¶mû_ÿ×ÿơ_®øö̃KÈásÿ<λ6°Œ8ùº€/ó˳~9½€™Dˆh¡e_Ø,?ǹ[Í)–¸åí3|Öµâ*2Úœ¦Ọ́NëéövóÊŸüé4pÏóù4Χói>cRLµÖe]ö°cÇÅ¢ï´+º$ĐÂr€€Ø¨â¦6lBƒf7 â€vŒ×s‚Ữ–7 l‡Jh%,Œq|N!&E`I-³¥­Ôå[ øÍü …íäN£÷¼£¬Ư謃ăüVYÜGƘu_ûøí×믿Ü~¹ÅÛ÷÷÷ô©çáùixºŒ¼na§ƯèÆ§éééôtNă8:ë ñÙYÖå¶ƯÖ}…LS)f†Á(sNÖ[Lù3ecÓnĐĂT¦S8Å?oŸ·í¶Å­PqÊÁÂ8Ô°×}Oû-̃p”¬¶¶² ÁU§«f«Y"ÈCK)KX„WºÅmµë`‡)NÏùYm”±Ö*R:kJ·Ă{¶$Øbp‹wÊ17¯T†æ!°Edf~ :ˆµTÄli­sµë` ÙÖÛ~Ckùo'ẃđĂ釟z}~=N§ù¤«[\® bt?¶L9ƠkøÜ>nû­ä2úqf£ |UU%—-mïÛ{LÑ·l‹đCxl]ˆé¨0#ÁÇ…Ñjûóéç¿;ư Ö—q2Ó́gxăÎă|Ï?>ưøúüzÏÆPq¾^¿₫oưß₫ăŸ₫ă¯o¿¾-o_—¯_¶/!‡?₫ø?ÿá₫·ÿêß₫áç?LăTJ¹^¯¿~ùơÏ¿üùưó=ç<¸á2^ÀrÊíi)bçSC—âÉŸÎĂùyz>gg]-,ù-l`êç’Ñ~†©h.ÙXăư8øá4Ÿ .!ÜÖÛơvươúëm»}nŸ·ưœKVJÍnÆU>!î ˜À@ƒ(dͨÉgĂ&È\Dª©$JlȃXv.&j̉Î9Ç×}…;>pQ9»8wÔ¸ÚÓ0骩Ât‘„€]LÜ“°fö,́z bû“"á|>¿üđ²ïûư‡ÿZ2`ƒDF?Î~>§yàÀ,5 VîaÿzưRøÜ>Á«îXùqd7ôÜÑ^›ÛW/wx«7’WÚA÷ø^l„ÇßÉ:å“N§ßÿü{cÍúOÿi½®ưÍ”-gÏOgLŸö}_?Ö¯_‘ÚIàw jƒ¨;ÜßCÿ6O {éª(I’O÷èߥĂ_ÿ¨vÚ€ü”zÖ~½#¸­;Dµ ̣§¹×OöÚƒ‡a¼¹Ù*ñ}8>Tơ®răψ¶}¥}Ưÿ₫ÿơ÷„ı¢`Á‡‹¡6₫p=Üñp4‰¶é§¾%ü¨^4BwP₫øW&|¯̣”S¥àù/₫äñßÈt’Ù¼/¨#iɘ̣ ƒS›¨ƒPÄ£ƒVH<äƯ$×0‹z©q§+ÿíIÍ“9LÏ­́ËYø£µî~½ ßéêA:đ½|]*̀%{²ĐQ è̉Ï£3›ăC]JzÿÑW•R`yƯ¯¿̃~5Ú€€1ûÙ[ϱ>vœư¬I¿\^~|ù́X+"8­J¨å¦a:¿­³¿üå—}Û 0RІ́đÓóO¿ÿá÷ƒ¶ë†&ñàklŒ±–*—ÂÎ)LƠcGơ¯,_SNKZ)8ßMvü0øAÄp¢´Ă†Ÿö´Ä–ó¬wÎ<ÎG`Æ2Nh˜¡yN°đöºÇ—¼XmÇ8B  ǤÓp̉VWS•Ael.î2MÓï^÷¯·ư¶¼½¯ïïĐ•ЫÛ^÷e_>—Ï/×/çáü|z¾LçV2©¢TQ%•â^ö’Ë»~ç /?ưüûŸOơ´lËÇơĂ83N#¬Bœv~̣Ʊ[¨ZƠm»]—k¥̉è2\NĂI”¤È Ă\3n¼RÊơv]—¦P§ñ4¸áùô ηZêV¶{ ûƠ]™énxGĂ §ÿZ´̉ÖZ*|†£Ï₫ٳ⼸\X·ơVo×|Å:âT£̀́fˆ;OĂiÔăd§“?-a¹n×A£a–Ăû¶½¥náö¹}₫₫ơ÷Ƙiœ†y ¢X¢]-Uºí·_ÿôëß¿ÿ})åúqơ䟦§Ëtá(=mưà_ơëÖ9Ï\|–¼æû.r…Áẃ¡TUHZÀU%|®Ÿ1G¥Ô`†Ëxùq₫ñuxươ}ûËûº¬Î:X]æËóùùåü2S­ơz»¾}¼Ưâí·í·?½ưé¾₫ĂŸ¾üéº_1µ{̣O?œ~°Æ₫öñÛ×ÛW‚?×Ï-n“~˜~øùéçß½₫î2_¬±!„÷ëûo×ß®Û5Æ(€Hƒ÷ó4>¡đ¶Êb0ˆ‚y Ëm¿-qùØ>B ÍnN”f?C³1“̉jÛ¶T̉u¹̃¶ÛÇúñ¹~~îŸ́CŸ³V# ¥́•Änˆè€È,%ªé3|₫ùíÏ1Ç÷ë;Zf :́›‡)""/ {"÷Ở’Ñ'M™²r*Ôđ×÷¿2-¾´óPs¤¶E₫•TSJ ñ3•Zæy^–…ˆ;ȯ“¾µÖØLyßw¬§éôó?oë¶~]½öĐ(Cp…à?vúª´‡}Oû×ϯkä@CT¹̀”«„́‘AƒLÖE‹̃Q&Tăˆ7p%ˆ_¶`i÷â/ßRSÔ½ßN¥Zrâ®ạ̀aà'WU%–Ü1x1«Wy‹›¶̉8V*©~ïî̀Cwÿ¡åÿ/:¹ê˜nç±ç©3@ot”Flïë ÄÈrû\±ơß’¹WµöǺ¢¢v)¥w ¶ÿYúÎÏöO“'÷UÙw~Pª‘Ó“XƠWîÁĂ'·§âhÓ˜áú{eTa&;¤G-¾†m\đÍ5GưÜéβEJo¨Y}}ˆ?ÿÿ¥øo|<¶è;Æ”ÂÓ¢ÆđëM¾zîPOÏèñ0dîÆ½)ĐÂà›¨ă¾Ú–ăƒ´üí $ÁƒÙ/ÊñßưjÖŸ•"5ÀQàùænVp” wXk½}̃₫₫¿ü}Œ1ÆHÿ£̀đ¦éx3(ç`ŒƒLÓÉOV[`¸MÅÖÚ£q£A›̉À’‹uvƯ×-nqcÓt¼øoëo¿m¿yë¯oWNsÎi'E¦8gsÍFP Ư‹¢˜ÅXt‰*êÜt{9_2eØ™È[{æ­ưEøxè à‡+¨˜¢ n˜Ç™*aï$M%¡́A–™g9ù’J¨¡¤J% eđÅWªc½÷UWĐœq~đó<_̉åe{ak‘}¹î×-n0ê©ÍmƯ+j'UUHáº^K)S¼ó@KŘûíy‡™¼,œs_ĂWx瘜wÓ:AơÈFơ¤‰Zë”*pF;"‚`̣DƠÈTvÖq;%₫c%—œ³¶Ö±4$æ¬*Éü¿øñ©>6G>Za™3®+ñÅ5 ÛÉO—ñ‚i8!£‹/­ .Em¦ª 9li‹%T)kMzö3ÛTS©eIË—Û—·åíº]·´¥œ–°øƠŸ†Óm¹)RN»œsN¹Öj¬)kY·ơm}Cˆ̃¨Ç%,oëÛhÇy˜ÏĂ¯ï'_kå–yI ÑË8›¥`(‰́"2ÚL~’>Ùd'tËF3"́2^&?ej®çñ\|1ÖLĂtÎçé́Œƒwêûçû/_ùíöÛŸ>ÿô÷_₫₫Ïï₫Ø>J)ƒ^Æ—§áéäO!…ß>~¯ éƒ^ϯ|ưăß½₫Ưy:{ăÁẹ́ÆÏn6ÊŒvL”€ÅÙxJ{|"ni#¢‹rHa  ´ÖƒƧ—ñåÇó¿úưóåyG¥.˜Û~û\>oÛmkˆ́ꔓQ0 pófâ€*™“`Íu–d<8#k̉”é´±y¯Á9©ÜÆùL¨•U©¤ë~åR_Ï…H±s¿Vó Eß!(R!²{u QK§Ó³Êă€¿{₫»?œ₫PÇúTŸ ™Üö?ØGè¿́i¿­7äÜ1›?E†₫-ú´Écü̃m¯²¥JßM—&]UóªVLJé®ßhnN Û¾tºnzû|û¯ú¯ÆBE;I t¸K)ºè_¾ü¢´º-·=î½oG¯ß£Nö-ö;ïªkö›`ÿơwè:êuP3ÔËꮓ}PµÖÇçô‡T&$toóßlH=V#ưé¸k’~ó8È9w¿ü;µ„|–£«íÛ¶ËG{¨'qée¦qÊ9DZ„>Đ~:>ÎÑÈ—£úpúè(ͺ,Zªßª5Ø*¦7qêÁ" µpé’—~¸ÿÇĂCNvûûƯ¿"ă¦v&Gÿ(H1 ßưÀƯĐ@߉Hç¿ÊµØ©:î&kú¸Ü…O½9@«GïL~êAæ4|¿ơ£ˆ]ƒ,mwÄ!₫å˜ ®·ơ—„ä^n'iHüơ/f\ûí¹Yh¡…6₫Ơ@`ªÂr”³¥†I<¿ •¢Ö:Åô₫ơ]=º1 Ü %H·)\Ăgú´Ú̃®7Ơ\†äÚđÖ{í3€B̀½€IDATت[D.Z)ª™QSTsåHq£*_Ÿ¸̃¬µ"À¹Ë9cû«©:ë¶–fˆ ·̀"ï=€&¤H8¡ ¡£‰»‡½áăÚẁ±Ö(Q¡*‚‚ CD^L¼̣ÖØÉMó8¿–טâ²-ïË;\ö÷´oû†zit£!Ë5R E… ̀ÚG?‚p‰+ˆ=í9ä¯ËWo=K5ü8ùiç8Æ8F6ˆ$ ~É"Tø‘f8ç—éåe~_Ê4L̃ùq­µDR;â“á₫YS%"7ºqlÏÉ)ƸíÛ².˶́a)ä…ä#*·u3s·ĐÊŵåsû\÷uv3R*×lµ5̃°¢Üæ>Ă'à÷Tb¦hÉ[å´aËËÉNλLùẹ́ô¹|¾ß̃ß—wxËeRN×ëµæ:1ÅcÔ¤çaN9YkqkliMyƯW–‡ÆÆ„8[x.º-nT̀Ñh“JBº¤²¦ơ3|naP> '­µvơ0Ö[cg7Ÿưùu~}ŸÇq4Ê`s\ăJDPq”\núVjYĂúëÛ¯_®_~ưøơÏ₫º|UU=OVÙÙÍOăÇWÓp5úñizz9½œÆ“¶z{¡¤²ÇƯórz1(ºw\6§°Ç=¥$èɸ¼6ó0Ÿưùi~z=¿¾¯¯§×Ë|‡‘4-qA¼Æm»­aÅÅ ừ¦.´‰F{̀s6q†B UÖ+¡DÓ½ƒ8®.± :°`! v&WuLEÚ[›~å¼¾ÅTÏBª4ª̀wqV¼%Èv£á F°ôa;c7ŒĂ8ùé4œ^Ÿ_/î¢GứŸµÖØGB·ưö±|\×ëu½.Û²¦“¡́³PªIr©iÇ™¦ÖÔ;̃mƒ_b¯ù&>,@(ơ]Ơ6Ü–₫ÚĂ¾wÔ8S9üö±½]ߌ6ç§3iJ”ö´£wF­1wƯ¯Çfư ÛW uq]wg¿{·J"·ê7mïöÅcç ™t ₫₫›r TcíS“2̃½x½™Ts¿³ó¯ûî@|ñï=µ©Gö÷Í₫£2y° ¯Ơ‡z¦¾VºÖz@,qƒl´jâ`¦`µb›/6ÜñŒïĂ>÷Üs=²  ©ç•åáááq‡3́½öZk'Ï/^ŒIB̀bzi‹qPÆWæ5.0¯Åq$A $â˜tå ƒéYÈO‚ Í€›ÉGU@ZIH7•9IH¼Gc‚ñ₫ SWăß=PNm$“œ‚;^çet³Ưh£Û¶Æ!VÏƯdxwQ2¿.³Ä¨AtêXt̀"Ÿ=̣D†O°›’ב‹:—1J€Dæ BhØu+øp£.%¢Î¢@ß’"+‚뼸JzïÑXe£Q èĐŸÈû́ñ ±¡iw&²º¨±.æ蹩”Æ¡ºSwz8?ûc§;D.kYoM%«Œgxˆ}RJ%—è3ăœÓ:–7cƒJ;Ưi«ÛƠ²^å«]µ[Wë"/eÖÚ~́ÏưùĐîÚ;´Œ¦+k¹¾*¯®Ê«u¹^«2/³,˳»nB(5ŒC?ôĂ0 wEHÁ%ç’[oµ̉ưĐjpØ%vr‰ OÁ`nƒă*’¯Bă£¬³hïM©D… Ÿ¶`1¡£L<̣ÓpjUk¬A?\o¬´̣LfuUU‘É̀ƒ×F?ŸNƯ ©üŒ1̀?×ƠZĐl =X€B­ç₫|́Ç₫xÚiJhƠ»b‡¡6‚PLO(qÄQNeưØ7CsîÎÚhJi!‹OvŸTeÅ/̣wMÉdNó•\íêƯzµÎ²̀:{:îïÎONđ9çˆ'œ̣,ϸö?t¦Ă…•-Á4‰Á)ÀYè£îÇ~0³¼’Ơ:_¯ÊU•U¬cÙ,£OíéáôđĂñ‡ûæ₫4œF3bŸ„:«¸kđŒ¶Åözu]ç5Q̀ÀQÚ]l'MÄ‹¢@3 ´uÂwX­Æ–X)÷@H*‚y‘O­“5Ÿ2&E$ :<ÄƠ‰@Hô™@J$H+56À ûGàá*4• «Ï%—…(ª¼ªóº.ꪨª²Ê³<“cŒ̉vm§ºc{‚¬~2â 4©ẴüHÜöü3›K1^̣¤ª*BÉ0èîƠ}1H©üñØbÈ ÇóÂoIâ©§¹ˆ ’nq ̉ËRç0ÿ ̀—ô"̣₫Èï~ Ûë2KX2ïÉÇ’IùÎX"˜ùô%ÿÑè‡C̀‹˜"Æa®6âvˆ̉đà#ÑÀ̉ƯWË¢(@)…̃6qÆÅÄ,†yÇñ³¤_ ƒ021Äw¡Ó|u(‰ŒYÛc÷ị̈$0p*ßL«ó¡Ä±»Ô•ÿ=\ÿµ?)­(P\p;Ư­ô —ÎA Æ̉Ï"O:€ú 6G`̃_O¡ưy+„g¸₫²Nø/‰£b”L'“˜J7`eơ#~Bă ¯»°ùDŒåñÄ?L§¶›0ÙeâhL[G.Ë‹ù±ô<\\öùÖ<+,>yñ+ˬ ¢æøÊâȧx|¦J³†!jè¤Ä¥A‰‹Wô¼º ̃̀#aº₫ñ¸f$>EÙ“<S²vlñă&‰5Î̀ÈZrº É\ôh=XÉÔ–x’øÇB‚Jó¡F6ÑR­‰ˆ×YS0…†Y³‚?uÀ²M,cçY²ĐRîÑßS„ö_̃c1†.]kçđ1¶0‹xÆœ@À†SC̉ G¦‰đàc̉ûG$$"× "=˜ÈIpt^/,†.óçaưR?ÔÎÎâ(5₫è?uç ³‚teüOtẳ”ư™%‚O<ƒñA}¼¡½í±¦́–¶ú˜§9﨟Lú˜ôb&gçi:pÄe"ñJ*¥:×ÙËB¡.³Ld!°Ê°N€úÂÖS ;¯#È*öÖ»ĐđÁM乆ÜK"c¡­Ïr™+£B(¬ºNwè#¤ŒÂ+f¼ÁƠY;Ư™.´à•ÖUVUY•ñŒRZWuçµÁ¨mU‹h.ÆFÜr”+&@x0Æ ±Ë ú̀f¡­Ơ@gºA ­jÑüg[më¼–\bCÔÎÆ`+ªîđvºm:ăătÎYcµÖJ+´%íL‡~Dxlœrđ€!÷~ C/ze‘"÷Ư2ë¹ 8¬±xÁ0Ücí\w²§^÷½îѱ ̣§ÑüÿaàUeU)Ë2/À ‡Í¸As}m4J™µÖzÔm×ºĂ¡;08¨:Ư ":Ơị́]ׂ‰h^1Û¨[EH°xÇù >gmơ*[r#eœrÔ©ăú6¨Ạf}óåË/¿|óåv½•¹ôàG=Ûó‡ư‡ĂÓáÔÔ¨$•eQ–§̉ƒo‡ö₫é₫Đ´ƠŒ±ZÖÛr+˜pÖi£±§DĐ) HN€ŒdRJ$°a±(ăç<èûenÅR̉à†nèœsÍØ8ç=<´Ê(L³ÑÍLB3O½¤e©‚Å3À́è<œ3ôºÇu #¸T0Ê¢±}˜S“1f˜ ßIp>„QçlLupä+bNHƒ>²ªrc«/ÁDèœêa.4iÅLäY<+ö(.J—¸°nă¡z;x$NL~áï2™‹Ư9Ă₫EY€ A#,/ jpàḅ¡ 9@gíx ¦`?¬º“n+?Û‚/6Ü­ Á×è§›í+âvù|Ụ́ü²fîüâ=njÑ5/­‘ÿ3Ï"¨ø̉XsâÉ̀ABz‰€à}~Á=÷ÓÔ–~âĂ,>!2d’,ë"rXH–µ‚û?ó5£ô§Óö!#¥$ÅơĂ+„Ä}F0ñ8oœÁ©™]ñ1‡©"a& bÓ›2W‡’P¦¸wáz‚3©Ë]̃ß(%Otä!¤̣‹a0_d—¤sÓBˆ'À¦ÛñŒÙ5«Àq©ZĐ–ă,¡$¤¤h•rBđơÈ s#¦ ~2Ÿoa*=Y&Ré¸ÿ¯₫qG~L];ªÎ1=$zbC¥Ü¡™FBÙód`–­L&ÊÎ̉•40̃ Z(˜Óßâ#4ç¦KÀœ\üsIqqh7‹ "}Í?kkÿ5ZÓ„.‰L&4đ&"Ro:®bŒ0Îx%ª*¯0(L„]œ1dE‡Q¬çáMr.ÊÑŒ̃ûÑŒH’Æ»ƒĐJQ–Y™‹¼È Α„‡]Í×ÓChùL‚¬œ°Å–×ÄŒdx¨„’\æÆ-ua|̀ U ¨Um'N]y51®›¨}”LV²Zë:¯‘TeçëjíG¨ÉĐ˜56̣¡‡`l2‰Jñư1ë`,ôDwN2ơc2Ö„~#´.¨pmF¦Èƒ¿¥Äjù´̣&€tŒŸâ–ê±Ä\Iö†+)˜5㉒mFBƯåë¡ Üă“4ÄGgˆ…—ÿ¥sáN¹0…)̣[p}'‘kÊçyâ“Ɉ&¾xñ+ɦá× ÄW 1 ‰wgbV-˜÷>±‚‹Ó€ä…tK̀7#E'B Ø€Î&.ù²Oàшơ¡ËJ¸ËITHÓBü2™¥E›t …‰°́¯<Ư¤)7˜©ÖÁûơ‚>°ˆ̉«tC M `ÑE!%Ę>Åæ¤(ơ­Jê-±|ÇÓ´l®‘ùIBäç,m1£âI24~êC1gÏKSy‹Èï#™C’0üÇ…gÿ5<~3cÇY<ꋬñYr ÓGQLŒÉh˜Ë¢.3_-‘ª¨;YXçÚhtMê [¡Äkh&¤¹…»hª°ÿñs°dשÎy‡™'f˜ÚiÜÔ"a­cèŸ.Ñ¿âSŸø$ »|å_’v’-)M.)=1ªIvŸ´Pàü‚³zñ"0ü ®J©ñÉ%=̉óBÆ‹À}zưi¼H“ÎÄ‘“Âü1œÑ÷g₫H³` ât0q„`!(D’ {öo·«NpxdOdpé(¤²ơPÆpbº§sî÷́v\ÙéOăƯ™áü Ö~Ç;w´‹™ÉrxåéÔ4`™đ̀¬*?_aÜÙc †ŸÑÿ³¢=U8,¹p—c !h änÿè›ÉOPá”H’{¥g•¼tqÎxnŒùä¿9sJbµôÂÔö.eÅ¥“Đ‚T‡¹Ë]RUˆÓï÷dÿu<.VHîtP”¦™ÀÇJéÑ¥vC³cÚ$* ~êk ‹ºULÊ/Ù91H BΓæÔ34 ø‰4ÑB0½sn±(/æù®¥¤ˆå¶¡ËĐq²”åºX¯̣Ơ¶̃–Y¹.×\ -l±È[t&Ơ"n¢È‹P£Æ¡'cl5FgFœ¡ÑaRȠӹ䛕’IÎjưÎZ°¡Ï8z†¢9H„¹n E–£G=jÈëÚj [,đXyS˜`¢å¶Ün‹m]Ôœqdû¤XZ MQ†#Äh£F5ª#¦oú±oTsÎî”Uȹ MR™¬d­~.e"0µ°́0ªq†QÖZfhá™3úÀ¶cûÔ>†J ›lSçuÎs€0Œ3Œ±œå…,ĐÔXÓªöĐ3ÄmÀ8Ó«¾›̃ôÏn]ÉU!  ¬Â4`ĐÀ®v‚Ldk™×E½.×ëz]µè±’ŸºÓ¿ø₫Å©;5C3è¡·ư`†^ơƯăa8à¬̀y₫ª~ơzóúªºZë<˱SŒ–pGÜ †C²àñتƯ1 XÁ‹ơ‹M±ÉẼªÖy7¸¹ÎXĂ)x!¸– Œ¡µgÜX“Élnx䃉Y§º‡óĂ}wè§tSƯ¼¨_`.ê­·Î ¥,·åv•¯ª¼Â¾rØ€yPʗчTQfå:_g2Ëe.D0â$ zhºæĐÎĂùĐrg2ăß®·eV6M£Æ®ưĐƒƒ´Adº7ă ̀G|)K40­Ë:σæOmè‡~́{Ơ{%3 w7cM4½Ơa¹È3–!ͯʫº¬è”î®´BÇ*L/±‰oˆ™¼đa´å œGó“HdBBö(Œ@0-ŒÙÅ–#ΤÔï½'‰]̀…Q̀R6ú Ÿ×4ÊŒüÄpùTƠéô9HCKX*‰#cL®¸4.t“ĂD̉v’̀ ñ>ér÷ïM¦aƠB¯¼ÄàÃDÿ² âăN€¾i’Ë,iVBÑưTp™¥ñá$@ÿHˆøL›‰£eê&‹̉xưQ¢æÉRi É­‰²Ơ‰m“6#–øbÊđIÑúçG‰1îóSÄ›H¨'8Ơ£̉ähAđÊÍ]̉¦;•̃”˜S¥á{ ưçÈ>F́1²§Ï”Óq ¥.®ĐÆl&̃L9ÓJ”,_L“›đÑX$-‡SOư¤’°˜Y*̃Ư¹ˆ–˜&û ÊƯL+OÆÇ À́u3ÿ(%oư—üX ß‹Æ.ø3èa7íC!%X̉‡¢†8U_0‚ u’ À,2Æ?Jhô©Ô…éá¨c¥·2ªâ­œ«K¦P0 HªIûáOÁ‚G]º4Ï+>LÙ¦¿œùÿĐ·.ŒÉ°%£;ÓqÅ%•íCƳ2+s×e]ÈEèY‰Á„q&²÷ „rü,†» `‡n3ÔRç]Lú~̣`ÍP´‘ƃ¨¤2Œ9p6‘0c P‚B§‚ ́' MË\Îọ́JVH7 >H§w.ơ %yĐŒÜ9‡(¡ÎºNwƯØ)«¢À í>Ñ“Q–‹×_́~ ¬ÈyNÉ]Œ·ăÉy¢äU¹ªÊ •uVëL÷²oº¦énè5`G[B 2gđ,ÂG’æáœđœçëb-¹̣ă ñDä§ơ“Óι íLXn¹æ̃ùA ’ѳqÆ;¶ñµ¬ ^øÜ3Ϊ¬*³’Cđ@ <ă†F7Ê)F9`₫¡yüơĂ¯Oư©ï}!‹<Ë‹¬ œ .đØP½€Û,˳:«9çàA=Œ ±9÷çăṕtguÎ1ÂÖrÍ †£ ]đoê4̀múfPĂy8£f36àCë§~Ê( T)¨`«â’Iíç•ÏjYßÔ7»z—nI”RÁEÆ2t.ˆ6Úxƒq]®_\½ÈyÎ)œ̣Á ô¨Æ¨ˆíúîÔŸNư 2ZèÁ f0‡ñ@(9·gSñ–6Iq¸$_ÄŸ2đ©)X±O¼"®œw̉|`Q¹ó.ÍÓ‘”bÆÓ^8§Î)ĐNăïùXp‡¦ÿsÆ3™9⬶~" /Ú¹ -†wœư³&ư@ĐD’à3sÖ˜[FN[Hy)xï£̉È/­¢{{n+_™¤oD2ç§ YZ“ GDh>21₫“ßÙ‹7/Bkiÿdä"GĂÁBØ| .j‚öÆ(£= '*­ ` ÄD0ŒŸ3ă 6ÊÑVvD(®F6fèTÇgÀ°8€?Fóaơă]¤J£%9!³Á‚`"D]«2‘e½úôÍÍ›—×/3–Yc§ĂăùqßîÏê<êqTc;´OƯÓ¹?c¶\ˆBryVgkíy<ă,pà6r³ÊVXCĂ¥ ­™â4Äü$ù®ÚƯ¬o®7×Ûơ¶®kÔ h­»¾kÛöÔÚ¾t0Î2ÎJ$“9É1™Gå.™˜ô¸hDŒ_TN9ă”VÈ·Q6ỗBOBHh0"24 BaV ÔI;ç”U(0ÀJ]«Ó sHĈÀIX`j ₫2F>C ©Îœ™P¹̃¥2\¿½ŸQáØëSDH¹ø‰r÷âk\‚ÙOÂÅÅMŒ|=$61D">6gD Đá$:ÂÉxÖ|›9L¤$!¬ŸÈÜ©±iºĂÆwÎnHdÆ›Ó@’ø2Ûep91́ ¹ÄÓ-̉?ăxÏi˜?uÜ*zBÉz2È&‰_j̣R³™DM›v:ƒ¿‰ë‘²̃ă“h·µ ĂG =FóÑ.,AÖ£¥G¼iơ`O?üS–₫‰t¯_ ôi$æ<́†±Ư[ŒÈäơ<:}Ơ?đ*«.^Jç$¤ü²~Ï’ïç9¸đmM$áñÎĂтk¾¬¦—ƒ,e—1#¼<̣Tå=°L ¹ÔG·ă˜6,P„)m€ÿbYƯÜÜÀƯƯ]ß÷ñ¾`C–ư§¬¡ßA pÑdII&å@Z—$“äè{€‰2ĐX½¹ lº@ûYtø˜}PzOS"Ù⹟ Ï…8ÁÄ#Åu~Ç ÄG±ñưñúàëÚi5ªVµ₫!n!Á3GV«|Ugu•U»z·2«vhưñĐöư₫¬Î«U-êR–¨ F„ xă˜EºRb° ± )Ë‘†%}s ‘€ñ&hKh¢>g cßJVơ<bSœr!Gf"#S_37µ+Æ]5ˆØ‚7¦à\à1+¥Öåúº¾BxâG3¶]Û­±æi|ºëî0íœpk-“vD™l™•»ƠnU­œsO§'lh…Ôï½ â‹á ç\?ôÆ«ÍU–e@9…¨X%r±1AX°ÎºÓƯùî8w‚ ¤¡¯Ê†zʨc{ô­/D±®Ö¨Ë´Ö¶C‹-0@÷i8 f(D±)7eV^W××å5¶¦*eYU•W„AØ'Á8£@C` ÷1Æ)Ïh†:òÊ(¡ÖÚb́…Å‹â¡}Ø÷{$„́Oûa®ëëOn>Ù­wœ̣¦içC£Ï<[”R^ûQ§‡§jNêt¾ùrûåg/>»ÙƯPJ›¶é›̃HÂ3®½ntă™ÏI.¹̀‹|Í׈̉ªíÛsơÈ ÇŒÑ;ßíCóĐ©ÎXƒÉ­ âEưU×£Û±Åëb½*W\đPỘÆ_æ%N“~́ŸNO÷çûß<₫æ‡ó§ñtj2–ưx÷ăÛ,c àîpw:>́?ü»ïÿ]èÍY&²Qç‡ăx䔯³ơ¶ÜZgÏăoM%ª«âªàEÆ3B [§Îk&®Ø©c[lo7·×ëëƯzW•U–eκNuh>Œƒ6Y•«5¬C¿Æ8å”Q0ÆŒjĆâ8D1'AJ}Ü ÁE&2gg|U¬ˆ'X‚Cï¾LljZ3dçÜhFm46YëT×Û>È‘tM)cl^âÛØ̃XzÅ=uiôÑ‘0‚µnrÓO)4Qvé[€OH¤ zưr§ÎIÇúKÆÈ’0GöqúKp‹Kb€“#!v’DCRfI£É¼OÂÍÉÉ& kHsJÆoSZHDb·»9[n(ñIŒơ½KúF¹9èŒa™”¬xµ­µ¨¬ÅM9´¦]nb¬1UÜ—/T|¿c÷ü;n¾1@Ÿ§Ø›58©LñI,¤:ûø‹sˆÑBni8 $₫˜UMbÚXăÑ)IûøN÷‚<'ăxđ(_¸ØYf1DËƠ¸8̣’‘úÉ?Ăè’c´¨>Dơư3¹ưœºGAö²¥$‰c¸µé<‰ô©4MWÏ+SÓl$Sç9?Y½Æ¿2Ï蔂6Uè̉äuÁ5˜hê`séh ó 'i1!RÍÂ+Ëœäï<¬ÿ¾u]ß̃̃2Æ̃¾}Û¶íb $8Ah=F’†eI;º́hv!&ïLSê¸ØAÚE<É}çZK’ÖÆk;ă:Ï€Øz,ZÑÅ'Z7ÄåÆ/&xîñ̃Á̉h~[ư»ç[Ù§8SXåÙ(Më¹nç̃{´ºö£ ‰ˆµ#¶‡«g¼:äi ë(¥’ÊB¥( ^ q;N\kĂØÏgD i‹tr”‹Vtx$»Bÿ•¨JYÖy]eʃH€Î̃‡Áª:ĂÀT‡EÑ3:FF²÷̃8£µÖJk£ăQJftÖg<—yY”"VÛÓùôx|<÷gç$29(¸Sº?ß7c£­µ/›1¬Ø›U±"ŒX°ÀÂ8áÀ3Gœu£۾ŋŒ .¹,³2¶”BƯ6’.¢uØÖ¡J¡ÚNuøùuVoWAđ ”jº¦W½uăBB ‚¾B' đđêê•¡FƠơƯ±?>µOnÀĂ¶Ü¾¹yób÷"ù8Œ§ó©él€™J+´ẸàôèIÎrÆY•WeQY!˜DpàZëfhưá‡ówíºÉ7·ëÛëơ5ṽE56P°`=ơ\đ\*gœ`:¥‡q È?ñ̃j<ô„ÿăÔ^Ëu! BIÓ7‡îpêOÆŒÈC%sí4FÆL°®̣^iußÜßïÏûn?è¡Îêu¹^Wë*«JQ¢Èd¶)6EVg̃?¾ÿƠ‡_}ưđơ~Ø#]m›o± †p₫J®‚h>/«¼*E‰ ¤G3b×¹V·£=x́ÈơŸM±YçëU±ª̣*ÏrθÇZ„b. #.JÆ­ơ`†vhOĂ©ƠíŒ}¸°ơ` 4EG/Æ¥ÔZ«µÖF÷ª×F;ê%ø'Â\ö{„ªà¤£… ÁÜ!́Q¬LfjT§Ó)]æ|ÚUÊCüçÅw‘²x\ÆiˆƠ´) gI¾‡Ø&†ơ?Ư2̉P₫"™Ö¬mÇ“øg/.W~¿”´Î± Ÿ 21|Œ"Îhªñ‘Ég#,4ébÓŒ´Oêº-’Jl1ñ`ôöö–P̉œ›ĂñÎ:¨ ^€,gmôÊGÜÍ/ºyÆƯ!̀œ Ả!*½₫é•¿ØUÿph¾˜°̀—"99¾!¥+O‘.HËñ²OŸ3øô±sBơQØ̀—/ăç²Bbêàt¨‡ "ơ‹QŸ̀Âù˜Ǹµ£)hOÁÖ9¡IqƒÎ‰M|?öGHÚ=\ÄgahNIÍLøc’«•đâe÷ÏyÖºe2@c;‚¥Ü-±çX9^77©Hñ¡Èœ€ØmÀ¹È‚½¨ D‘Ÿú]¤*"?ñ#Éị́ú“Å5Ÿ—ªg§ó¼îqy³̉á7í£8Æb@9ự‹/…î>ÀÔ¯C9&,ëÈdž;h<@>‘̀-­íHÉy” _~°&¤ [•! dĐƒ̉ ™¡ßÙÄ,BcoT3Îp¤¥?FcL‚dÀˆ'Î:t½´̀K³ÓYT"*£ÂÄ!>ä™Ñf-Y¥053ÆH¦¦¹hdŒd´Q ÖA\s)¡ër]đÂXƒÇIR Ø™•3^ç5ă » fèlç¬ù(©ô™§v@N6ăŒQ†,”œƒy¼ư„̀=•P}‘«\JYÈ‚Sî!üh°!$P¡€Br–s‘ʥ´Â]Ơ=ZlTܪÖMíg2!ƆZ­*£ÍØŒZéNwh!S”Jê…ï]èûă¾O›&$à`|`ñÓHñÛ’raĐ`i¼1ă©~ACxn\13Ú)gº{¦Èc´¾ˆ¶˜1Ú‰Äñ¸ÓÅnÎNnÚ)ë! ¦'sḿb­5̃¤$Û4 ›Ă˜›¦éÜß̣1o CÊÇRGhv4µHÔ…‡aJNÆ(–ñ=¤1á{,ÆÀÇ)ë,Í9ç ØRâÙ3³rç>r¡"̣…‡ăÛ0x"¿(^¥$« ¡’-Η.R…I'ÀG3Æ+’&µi¼̣ü—cb±ĐII+&ñơp]b²S:_w‡=P}Äøö8Ẩd+Pô¼÷KÛ¥÷‡ 3I‘âsÍS/ˆIñ|'øÖÓ©v†¿é,CRŸp.́hâ+ÎGƒË™˜è—BđÁgi#–&Æ+âétâ F€O.‹ƒ₫ÜSB‰#Ë>’†́s>¥Á|Æ:¨±ß8â‰#LƯàCù›°ÔM(r„̉|(!¾¬x’ù,ébzíé &,Ă”zA‹øíüÓ¥ƯPPOÛƠ\%Hæđ¿g ¶懤ª–ÖmÓí$³ăüÄ„gN–eP)åϾüY½Z}ưÍ×ư±_0 À¥Ëô`‡^ơqx0ÂíĂæ²’KŒN2QB7N;e7<ăY.ó\äÍ¢Á(L6#Ê)jĂÊ<ñ„.xh,J81¨K9¦"˜×áí‹3 auĂÈûâ^…c#tFăR )™d,èJcQCŒ̣ ́J‹ˆ¦‚Úél Ñ®¶W¹̀9å*¡Ăc¯ú¬̀®́•6ºû¦oú'¡:göz´#wÜkÁ¢ºw^qåsO<ÉDfUNYo±É.bihs̃™”RjœÑFc÷±Nw‚‰:«eÆåTÁ‹•\1Æđj %O2¹ïöŒ°ÑŒçáܪV9%©D)§œx‚ÎQÖ[CŒ`¢W}×wzĐœp!ÅZ¬5Ë܃o†F êáéáñøØê–2Zˆ‚zZæe×»z‡IêqqZo±È@)UZ Ă Æ2H‘WäJHÆ>ˆ2ª%­'¾,Ks)$Ô›¾iÇpđuV¯‹5—œÎ8ÓLgƠ¨Q‡*«÷̃‡Ô(5ª,Ëê¢̃Ô›*¯NçÓ±9>u\€)æøEç”Qïư»"„¬ƯZ€(DA"Å«(XF{:?=5Oß>}«®³úåæe™•£;Ơ)­¶Å6ăÙ«Ư««ƠƠª\åyÎ9ÇrM×vhi…°‚ D—đºQJ¹à\rˆc­Ơ^£%ú¨"o­Å¬¯ÓƯà†¹!xÁ…’Ùäôê-e‰«œsPFĂØ-z|a–nÜ”HSJưT̃‡gÛxçÁ2ª”!¹(Ü_ï<í(ÖÙF=P̣½‰²Nˆ\´>@q‹\„PÉ‹1Hwÿô3/·¼¥)$YÚ/ÆÈO´íMø&₫yă[Rwbæ°(SSBü’ˆOgÖ8YrÇcÜù<ọ́c| Ñ(s]’Ậ%Lư…–5“XưN#QÆYg:AE£ÎÍ£2 wÀ à°° ~NÚ£s¡üÛ<.B©¤´ˆ,¶‰Ø #ĐiB<¦I/Ô´™iøăÅŸÚD­s¬ö` ½Øb³Ê‹¶~Äf âËAê)”¸½htêÆ!Ó4|_Äî0§1é`K«y¿`R¤!\:k|b²„ÇÉ7ù& †.ĐîÁ˜¼`ç/n6™£™˜ÀóỤ̀œ–߆çƠNy>,¾đPc£xkIâº'aZIIsî‹a™Å›4Ç;¸, ưteỗO}pÏÏŸ‰˜¹D²bεÔd}LOs®̉’%ÙÆ3CŒ±t¢^Œ§ªn7[)å0͹ùƯówç%ÔG±Äâ\5Îà46ÄÄv„æÂ< wh¼;±¶••‹¿È9Ç ›°ÎÜ­óûP@ó 7YSGÀ,6  «d́B°¬Ä«í&Ÿ‡ˆÄÄq5ŸẠ̈Ó{Ú¯%ÚAêáó̀"¥\ç›]½ë6ƯăúA)53$è[.jµḥă¼ÓV# œn“ûaÿüö1Âr#­­Q°‹çº\#ÜLîOưé±}<'́rÊ)¯E½É7×ơơËơË›ÍÍvµÍdŒ1ÆgñÆg½Í h;¢ƽ÷Zë¾ï›¶9·g v5 0 ­¹”¥Ï|.̣LfHp̣̃j@™#¶¦Â鉹 x@i O<á”K*½÷8ÆYY”‚ 4'ÅöO: @‰'̃ù~èß?¼ÿæĂ7ß>}{¾Ôp»½}¹{É;5§‡§‡ss>wg¤  í‰ZÓ–´Ü•;Îù¡;ÚĂq=Ÿ§sw>4I%6&“\"³ÆĂááPñ꺺~}ơzU®¤®Œ²`9pî9qÄ:K,±ÎFhF³,ËDº®;¶Çń¬·œñR–/®^́®v2—Ă0́Ÿöûó₫¾»Vưϳ\æ̉Q÷áøáí7oßßâ$ƯfÛOWŸ̃Ô7™̀´×ÍØ z膮ÛQ’È|Ÿ£ơ“÷ÿüêóŸe?Ûmvxç(£Úhœ”Đª¨cEQô¦¯W5c¬»Sw:6Ǧi¬²̀³QÎ9ḱ́?tnë[Ü#OÍ©.ê¯n¾*²¢.ëM½É²ŒÑJŸN§¶k›¶A›N”}Ç^¶”Rd¾¡#–¤Y:X.pÖéQnüX̣ơÀ€å4_Ëu&2¬t…ˆ‡Í…SÀx0wíÆ®×½r ¹[˜4æ,ÏE¾Ê<—9VípḾ0èáÔŸÚ±m‡¶ÛƯO¡}ï}§:|ôµÓÎ{‰ O‘ư,t h,îÂóóç₫"bE'ËѸd¥xŒræM f%t\9q÷Ë)çœsî\°0º[gàfÏ\ÛÈÔó$eøÄ@-¾#‡‹Èl̃8R₫䌛d ›kƯÓ“KB ­·@ÀüÊ0ÁŸ¾{üNi…–kđ÷ư ‰Ô _AjÂDC@vUs”ÏX ëg"ñÇ‘„Đ’â÷óæ;ƯÅùª&4Ùf0ùº ’ÊĂE´>̣Ùb€7ßÖÀEtæ>`»ÊR6Ñ"iIÎØ_ŒíôÔ|₫^(]Á{{½Ï±Đ…Brzü¯ÿŸÿM$Œ1ˆï;cÂx²6 ̣Đp0Fi‘(¥ºI5ïÁRG”†%;Z¶-R\FKiT4Gçǿ‘̣‹ẩ–B¼)²;_ët`%kDÓø,¹a0á£ñưa "‹ä~y|s=aÎï—­g¢QBwñÑ₫ö¾̉wQ%I&Éb:Mçs³¸2¾ụ̈ËƠj}<̃½}ç'ƒôé4HWç¸F\\4:­ŸQ…v¡ˆœđâTó^ñ^”e¹ªWœó®ïN§“³ æH-[¤‹n.̀)éđ ṛ–,³gÖ‚¯•–˜–W’ @GÛ‡EA(º[^__gY>tưñxÄKJ–̃”(5{ă.“眅sÎy·8Đ=µ/ÖùZ[ÍËx† :B  ‰}{Œ3J©aº±CÎÉèÆ¸‹ƒ‡œ11ªQQÝÆ™D¦DƲœå’‡.RÈHF²Î"ñă,`Ó_„z -J9…ĂŒ^đâÓͧWƠ•ó©üjr‘¿Ù¾y¹{Yđ=pŒ3…,ĐxQ¦>çvl=ñœó:¯Ë¼̀‹œ K“ơaL°`7(*5Ö€Ée!BnÉ8SV5cÓ Í¹?+­F3 +2–u¦Cæ}§:mt%+LJ/VùjSo—rjOûfêO8́¥àÁ£Ñ'“Aº°Î×”Đº¬«ª:4‡¯ßưË÷¿<¶Ç»æ~U^}ûôíi<k6Ù&ùºXc$ÛàtÆh;ü3ƒ2Ê3Ö`ooI¤d2ÚéF‰K nâîä+SÉ7¨/¬ÂÆXh ŒoĂlP0!¨À »Pfˆ8—ÇçŸç̣ÙÇÈ<¡|z‚sœ}'¹ƯóĐ9êâ@.ÔÉ‘å²3s$c‘ùkÙ0Zˆù<›€¸àBâœ0›"Ç%Ó36Sm 3lH¢¢›D¼Œ!ë¥p"rÁ{"iÖt²´'‹Á=\xå&e¹øuí1Á›̉ùIKE° Ú zđ‹ –Ú9Gu©£.̃8ÇRºT,O?/¤É€‹¶ôÓdF†`ÚM‘´ó˜Î©EâVåî|i}€xÂb·l¯æ(PG¸§§'FyĐÜN̉±"¤¸ÈEe3¬c’oaÚ₫ÑṃăÇ#G2Êy‡.ˆ pà1Mb” . _²Àl!§¹¤zà0ª/ Ñ₫óî’JIeÆ345ªem›P ‰Dsɤ´Ä;Ơ´IA>:§<‡<œ58 AZ:%Oî±X ̀€ˆ‚x﨟)O¸¿rÊ—œ:*¸¨̣ µ¡x„sÎ#¸5ŒCÖgù:ßVÛœçæá çá<˜(pÎ%“(Ü”\Ài8!ÂH‘”RcŒe–R²…w₫lÎÆí4RËz[n«¬"„ MÜ€áŒgY&3 ;XoŸº§‡æaß́ă‘rœoëm¯úNu'}̣̃_•Wq` S^’ÚtÍÁ¡QZe"óÎS ÎºDQ‰, ÍDrà`Ày‡ ÀPÉñZYe­µ¬„,¶àWk­=º-aëٜ絬sJ)̀Fb!~4ăhFJèJ®nW·ë|ªh49ôđáøáĂùƒr*9^CeclU¬́Ê‚3˜ópƯH8¹?ƯÿpøA M8áûn¿ï÷ι\äÈzG̀(¸̃=´¯•2ÊXc¼Á5£=́ơ 8áœó‚¹̀3™1Âà,̉ñgẸ̀­µÓ¸¼`ÎÈÔ~‹Ê¸YOæµ·M̃{º`=ü₫JüÀÁ ¸ưÏ,GçÂb5Á"î§P5ƯD̉3x3L”èô·¦€×K"ËmY•Ơ¡;¨ƒr“mh g’ǃÀơư(S9!цÅ,,’8’#Ă›̀LL¡L2%ÔHÇ™ŸêЉ¿)¬̉Î[bÓ$nægFábˆº̉ ¸D#f‹̀øũAzÆb7ÿƠó9ç>¿³N7:̃oaœGÈi–̀¦_Sô=ú€“Đtăø(¼‰?M V)E'Źӛ5ö2p‹̀"–vR0‡aaVàÚnœ7Óx̉ø’Ù["…ä i£ ‰öbHx3~ÿHy±éÇP{N#5n©w¿ˆ‡#¹.¦ß öNŒcFĂ³ư‡*c_àïöï°ê*5,xx#ö¼Ă&;âyq¶Ï·Ç<»1ăr2„‰q V¬¹¤¹Ä‚Đ́æoăÂç#{2¨"„0Î%Zëh cYH̉†”§Ï£k/F^óI}LÏnÀṣbJ±z挔Âè¹ <%ŒL€™ïtư²ÝÜă#é?GØÂP9>‰4¾¸”dyF5ÚôCl^È3úôJ\Ú,ئkd.»±íh­Đu<`’Ø–Í HHÖÖ¸t†Xè¼¾ÓI}0'ÜóUJÏ—̀“×Óu1#`±]Ê¢éLºâ,&jJĐrÉCFÍ”Üb ?'ºÓ?ÜSç!v¶JVÿK,?­FđÜh,aÆW¢üÂW”.X€qñQÂ1®™HC§÷§¯àN“”bâ×Ë­%}LD̀8V‘/·¨€M _ ba=pl\ü¤Ă%íÿˆGÈ(CµŸ5|<çÉ>.IÀâ%ù, iilNüâ9FX’ ™„µlH \Y…µœŸyºP‹ú¦¼Ùä›LdˆØ…ië-̃ëJVuQ#[Ù†¨úÏĐ'<;|øÍ¼ä²e)Ê\äØ7< UnIC€º‘bß1lUÊReQêF3‚‡\äuVg4 í(mt7thTÏê8á«luSß\¯®7ÅU§”SOü¹??ŸOă8bB̉›₫ûư÷ß<|³ïö€Ôp,sʑ迫vWơƠºZsÆG=öCïÁg"+óRpá¼kúæ7w¿ùŇ_|wú®Ó£l“m*Y)«î»{l¸»ÊVŸo?ỵ̈å—Ûz zÛv́†ît>=ŸöÍ₫4F3̃¬nVÙê‹—_\¯¯9á\̣?ÿ~Œ±2+¯Ê«ZÖ(r]”SŒ³]½ËeơœàB+ 1©«²jWî¶Ơ–3̃Ư¡? z\`G0O¼q¦W};´£•Q8¶wÙîÍöͦÚ8ç̃ïßÿ‡ÿáWO¿r̃m²M%*Bví}Q¿øêÅWøå~̣ú“¬ÊF;ĂƯ₫îĂă‡¡y8?|wøî©²̃¾(^|vơÙo|U_ÚĂ¾ß}ÿơ7ߌn,X¤´Y Øß*P.üœĂ€¶eV–Y™‹\pÁ³Î*¥5 ílê†ñ½¶Ë#Ñm ?h¬Ùê¶7ư¼øx „V¢Â–sØ*«(ʨVµ§átR'ít2cÈ_Çc–L"ø‡­ÇRü:ăÊ ¨Œ‹@œ¿sd3±º…@ ú?/¶§>áœß̃̃̃\ß¼ÿ₫iÿ©pîcrÁâ/¯¸‚‡D³·Ø(ă¯'%‚á-¸ßÓ.¶û¤X:GoICÉùùîG₫døÖ[,Âü®)…Âa‘MÅ焈ÙûX¢ö₫‹Ö̃¼zssuÖ¿û₫=ªbdŸºE§î¼#OíVPˆÊ:Œëđ ưWÂ&2u€É’Èû9‚‘^L„ Êæ|É/²‚4ÏL÷è™–¦K,Ơ±ñ_r7̉̀a)}ÝÎÏQ¤Ù~` æ©”& Ksy $!SÄÜc‚‹²,£"ÎÛp}âVbÇtú&ơ⢑ µÀ2]ñ̃“ëí5çüt<…âE27Ñă"€jŒqäXư™ă¶8€Æđ.Í&ăûçR£â˜Y¦|†Åơ5\®·kÊèñpŒ @ lL$Œq#oá²›k³ÚÍÜ;¬ƠÎ gEZ*‡$)Ưßé‘®e3†R—ox>OHâß#†1&¹ü“̣'···Oû§?ÿó?·Æ^¬¿8¦#Vî x«¬µ£gªâ˦¥I˜Ü™È”§Á:‚Ó©“™èƒ¡†˜ §YEÄØÅ(³–ˆ‡&‡ß ^4̉«”¦oˆC=^ÏẼŸ08'0bÂo¬Â\˜FZ,|-E1°6 ›XêMÜÂm¥äå‹—_ưä+BàÏÿ́ß´m‹oHÍyỌ́åERD¢±oRXO—†x‚0¡/x²HmÛ7&6J±*‚¼ü6]́°ÎÎÏy>˜Äb2g”Ǻg± ™íª]]Ô¹̀aÖØàw9¶Új2u›Eg.L)KT"ñ CXŒtµƠ½êÏêÜ›¾Êª«Ơ×´}[ʲ̀Ê"/ ^₫ê´̉È“ét‡Äúьȫeɬ̀ʲ( !Çóñûư÷ï»÷½ëw+¶ùv•¯Ú¾Ư·û‡æAYUdÅơöúª¾Êi.AÖY –ZÂÈ]swîÎmÛÚĂ©?†ĂYưd™²^­3‘M$È«êêÅöE–e«jÅ)GJ̉0 íĐÚCä&9ç*Y­äj•­*YamJ[=è¡ÚVµh¯Æ™Ñ8ËÑt̃I.K^æ,é÷زW{s—JiÍëĂx@¦P<à”ƒu¹èLâ'-ÙÅ· dºà¾^@ñEJiUUø‡XäÅ_ự¯î>ÜÍ‹̉Eà;5%4/̣<ˇaP£ô¿a?ô€âáY¼₫<÷¿Sơ——'É©'hkZƠ_àɺŸ^€aÇNÀ° ç´Î¤{qŒ½b—ßø„N^ÆéIöQM›n‹‘„12́·ư³?øÙçŸ}nù³ÿçÏÁƒ•E ÖØ°s¹9ÈƠàaBæ +‘ ,2& ₫\NôÚø‡ÀÁ5Ëwù<ç¥Ô¸ ¢ĐP̃Iƒ áĐ? PƠƒêfÊG@¢æKAÏK3%¸ Q–lRI¡?Ư¬!qíLÇc,ÏóÏ>ûŒs~:̃¿{¿¨x¸%Z7¥Ui¤(d¬äÇ]‰‹ˆV ®‡K:¹àœëƒFŸ¸ßç‘̉ 0Ú\”E‰½Bú¾9J<É4¶KÉdñ•4_C{!8$’K –q6ôzSrÂC¼gÔRT÷£F̣i2c”¹@‘hí1\‹h®›́eb¨ß“ởÄ1®>‹²X ‰éß-•˜áˆÇ3z×ÜñúĂc÷hŒ‰ưâz´(5 ÉL‚Xâ½dn °4cM× ¶I'?̉Ô`*¿âơél’×ÎÿEQ\çƠÄ.¿MóL̀ ⣌2ª–ñ¦ECB+øEÂçs±ÏÏ|¾`²­H'îĐ́8dCeGTL 0˜…1 kˆQ¶[í>¹ưDHñë¿úµÓ›[…5)‚S¶¥Ïµ¸₫x’QG=â¼ —ÜS7{Ư“P‘†§ m´ơÖƒ.%xI9å£1X)e™‰ ư ‘‘sè‡ñ€ƯÁnî¬ă„ "Đ́\rÜhØêđÁEèg„Ó«Æ<#L ‰(¤@;Èx_°¤€ờ<ËKZ ˜NI)%\pÁÂ;ç8đ5]—UÜÙ‡¶W½sNJYWµ¤’ñ kƯĐE3¨‡HuÆ)eç7ơMׯc{́u?èa´cgºÁƒnÜsP̉©®zí4³w( 7œ›s?ôël=Úñ©ỵà7jSñDYˆ‚–”Ờ‚múæ₫|˜}Ó4Ê©Ç₫qèç2ª×ưuq½+w7ë)¥RÊ“ËŬưĐw}§­öԯʡD=#‰¬Ê«u¹.ËRYu8~ØÿĐÇfl^®_ú•?ơ§÷Oï{×£û*ñ„x¢¬:´‡̃ôÖÙVµ‚ ¿G3¶c»gûm¹]ùƠÙ[Ơ¾ß¿÷øn4c™•«bµÎÖ%/‰'ƯØ9çJ^̃T77››WׯVƠjÔcÓ6OưS;´'uêl×énPC?ôçáÜ­u¶ÎëëƠơª^eY¶Ûí8ăÇưñt89çÎƯù±}¬ú1nê¿;Íúè ‚œåH¦”J&9ç¹ÏQËñ¬7=ih¯¥—têÙ‡½,PW]Ê2—9^̀nèN§á„ 10âG-ú Ygaê¶Á¼çÑLÜAüd€˜²U+Ç2ººÜ>(Íxvµ¹Úl6ïß¾bOß^lT”PÛ̀€¨·ƯРÀÑ!’ö_nmÏ#éD°çƒÊ 0Û'“``&7.ăö™Gq¡÷›>Ö9—¾˜~ǃüMœœŸ9O)E 5¾Èxä‚3Ä6Œ3ÊP+ë3£4 ¸ưyz»L¼¶ƒK&B gü“Ư'·ë[ç̀ËÍKçJăđ ± D)5Ø8†̀{ ^–H*K×|ˆ<{?+BaéÁ˜Jœ×9Ù¦ÉZ>¶Lh6),ơ¼ÎH!ˆ4ÔÅ-sf÷̀c<d́Ôc†$x<êç1 ¥!₫A—ó¦‡_ @¢cÀâäpS¬˜ƯẸO¤÷¤µwc îªÆ˜Swz¿Bg¢Pwá £sǃó÷Ü`ç“Đ:R/Å‹̃ñM±aŒ5²1Ô<_Jæê!,Î-₫ÀAT"+²₫ĐǬ&‰íI¤¦DÅ !s£æø¼Øư!¦iî+¸Èd†ư\¼óÁR%¼XwÑ™Dt~©f ’¼0&î nß4=|¢ăñS̀ ¢f?¦áZ“2m‚[sÄ$’Lôù•«ß–6\™ `î´·À× ‘R:çP… ·4¥\>"S(æ![°.U¤…f¤›ëA3`è'hÙLê½%.*­ñÈ¥]J̃©̀©tx‚Íf¶k*•NẺiq ù§ƒ;"¢›é@‘ñ¬de•UU^)¥æx§ñˆ̣ÎYo3–ị́Ư®ØJ2™qÎs‘Gb‘UQåyg9z&RBuƘQJ+ă à”£DAáÁ+­Đjf4£Ç/ó’0’Ó<áF Ÿ…Wbpƒ5V[Í%ßf[θ2J ÊXC)Íe¾*Ẁ33B†‰„’ŒfE^(§ú¡oúF[mˆá—N:ë(§À ÏóU½Ơ8Ú±´åèF­4¢à½êqm×fØûAư؇^l̃8ăÔYцj¯aŒi«Ÿ§nèNÍ©.kḰy<j»j'…¬\å¼ÓV;âzƯ?6Íăy<ƒ‡¸±ztàÖåºX@8Á¤źÆssîÆN;M(!œh­G5f䌅U½*ÊbÅV‚ £Í©?µºm†æªº̣Ôk¯¿}üö¯ö9Ë·Ùö“Í'‚‰F5j(£ ơt4#–º'íôU}Å$3Μûs34¯¾Ü}ùfûf]®…^—YYˆÂnSmnw·×›k&ØSût¢§ûî₫íĂÛïöß}₫×Lơ'ÛlûÉú“O®?¹Ú]åy¾Ưn !~xçßa5èak,í4Îkd qʱ¿/~+©DưÎV́ÉĐ鮻ьd¸de<+EYfe.ó2+ØÙ‚UZI.G5:ç°Q·3΀1̃œÆ“u}~ñ}<Đ<= ë/H€„\zçG˜#DQº¦“\zëaó²$‘.¨éb4 †:Ü–tœ?Ÿ‘Ÿ{Ÿ !c¸o~t·ú[=ÇñX¸÷û̉îgní³'!‚g!´ˆ‹0̃÷Íz³©7¨”ä’3î´³Æâ8 d›À¾æœsu¡AMAô8ª+±.áaè‡Ç‡GÜU´Ñ1t™×đƠÀH÷Å¥ÍsRf‹›-&/n_L5çƯÄ'·©jŒÂX²Ø‹"—Ô·g¹Hm_XîLëbwNcB£!t á!L¬‰GÂ×ȆÂ÷;˜D @Ä”/Âúµ$‡ó¾o'Ï"k"r¯6ÖPF̉8pûÇß|ÿ›ç{ƒ½‹ªÈ̀8³ßïÑœ‚­4X—ú‚¤¿å”‡aơ?ưáÿé“b‘Sû?{‡B]×?úÑ(¥wwwïß¿ÿ½f#Lhë¤ĂHáêç„̣ôÛø5*/ [xfƯ1—X°Ï“ç1ïœë”¦~>ôD—ª:üÜ¡#ÆvQôĐ“D,˜̀L”ë™{<́ehơ·uó%}G Êÿă×S¼ÈÁWaêÜÄC©³o’<àåzñâEY–Æóùütx fq-ZX„ëàg/Îßó¨„wj­ñ"WPƯ|z»¾­ó~´íGQA%«M¹YWkô©4Î j@Ç}í´‡·ÍU2‘1Æ% @xLrYeUƠdžfd^£Æ^²E&2A£L[³|WíVƠ =<óö7áOÔY½ªV›|ƒ³Ă3ă¨Æ}»8?ôc_r»ÚJ)Û¾}:=i£{Ưwc§­FXÖ«₫©{:ÇÓp̣̃£FY;MùêÅơ‹¦i¾yÿ;ß{çs– ₫êĂ_ƠùƠêƠ¼üƒëơµçåŒZѪ•µöư₫ư/ßựix"„ r赬_T/n×·Ûj‹¸c&3́qµ½*ÊâÛ·ß₫â»_üÙû?€m±Ưå»?xơEVJ=)²";6Çïî¿{ûôvPĂq8f”Rv¾£‚öM¿ë?~ơÇ?}ơSÆØ₫¼¿oî3ưèƠn¶7Ă0ºCVf/v/ê²n‡ö»ß½}|{w¸{xÿưñû§á Ç6#́Eù⺺.EéÁ+(ûëƠºÊ«×Ơk t[m?{ơYåZé¦möÇ=ö7@ZW–eθ\ä(  @9ă:`… ' †}»¿oîOúĂ_´0Ze«*¯$—íĐj§ÏĂù4œ°¶€¶T©LFUÉ ’IÎBv?Ïâ ́9…b§9< ÖÈ—w”ÑzUE±?́Û¶½¨lûØợc¼ç¿—ÇË—/˲ÔZŸÏçÓét±©ù¥ư|úíïÍSJ…‰ÂáoÚ́bcuÉdhơÀEØG˜\f2 }èXæ~úé§·/oû¾ÿơ¯í'WÍ…|6 '"•à™7És â26D™X¶Ö*­f‡%¨”̃âø óK@Ÿ¹>0qưăÁÄ(? »Ÿ«#˜›–8æ×'¡Ë]„v1 Kơ‘ê‰_£î‹.ǰ¤{ạ̀, –,–˜¸[ ÀÎZc b—£TÂÎÙ¸D`J V[­¬ M mÀnâÈŒâ"ùĸŒ1Ă0¤ÓYñó?üĂ¯¾úJ+ơ§ú§÷÷÷i/‹Å‡D…7̀<ê™B†Ï±ưüÍê†tđÀµHL]˜Ÿ£óÄđ̃'-6²<{yó’rz<÷ûT, IñkdÛciÆùªÆ*áÅûô3ÁÅÛ·oÇadSÎ8—£·Ư²*ªb;’p[í,ˆÍ­Đ ô(t‰#Öâæf«¨xvé"{!­NóÅúˆOR-W$;¥imÄ0/È.=‘¼ĂĂ₫‰q5À䙌e¥(ë¼ÎE.…TŒfÄ.KxqĐ’+é+vÅZ«Bè=—…R›qÀE¦T œKÁ₫­º¨×åº,JÉ¥ónÔc7vnzÛăDÆí¼àE•U¥,#ÍăÔŸ7­tÛ´/œsMߌf̀dör÷²–51Ưiú‚ 4Ë—TO<Ô9w:ŸNË>Ù~r»»•\jĐ ;ƠíOûçλU¾*xÑ©î89đƯj÷z÷₫t~úÍÓoF;zâ¯Ê+FØy8 !6åæª¼º]ßcîO÷î;ï=nê›R”½ê[Ơ¢za•­n67ëzM€<œzƠË\æyƒYi5ªÑiG=U^íÖ;ÂÉ_ÿ×ûó~?́%“„R–Øë÷º¸®óºÈ\æç₫lít÷Ø<₫púááüËü¿úăŸöó«ơUY–ÔÓC{øđøá›ï¿y8<Œz<éS8[f¥äy䯭5ÚµªíU¯¬̣̃£Ïi)Êœç€F™ƒ0W₫lư™vz•­vơÍm9áØ"ˆÅíØ›¾×}ŒcJ^®óu-k)$fDÚhíơ¨F,Đ[°ƒÜ°{n(½êµÓÈ3ÖÄ y±2 Ó6û¼èºØ‘/ÿø]Bnv~»‡ØÑOjï.ñKï#Œ±Q¨xNX測×ëơzí½?Nçóùïå“€–É́öÅíÿÑ—Yño₫ü/ÁAÜ¡bÏÊ?ªG$0‡QÆø˜RzóâææêFưë_ư:eRÅ Ê®>ÙïRåá’ö̉qńñÎÆµ7ú:¤oˆYeJâ£è#0+Fƒ0Å⨇«ñf½¹tbà!jGa1£ŒñÀÚˆ@Û| !lT´hX ̣X¯©QB‘¿Ø°đ9"k‘'ƒÍI´ÑHU “ÑíÂ+ˆ»£¦AĐđIö•fJΧ¡¯Ÿ ¦ `¬Á›'÷́ŒB̉°‘Hè–àHä&0²,ûùÏ~₫£ÿœÿó?ÿóưă>VZ̉(4 Hj5™«Ụ̂áûv­ëcB–FƠsx=\.¥Üp2:ôĂ †Ô–O,ÜH´Eô1´åóNkjX.€„Åâ’Ø†Éăç÷¤T¿y.‘©„úÄ~̃' kZ%™¨á¿ky&QB¦Nhœ$îi­6ư…x¦sá"ú'KyH¯&eA„g^2™{€™vŸ¦ơ~²Ñ «Àô$¤Ï:´û(/K†/<³₫é’sáçR; “Ư8%´7}cN¹1Æ*;ӺנÀö¡ó8aHlüä9‹½º¼%”üäåO¿ǘóÇâñ‡_~Àªz\ñôS›ßv"1‡¦°ä_N€à¢®ê_íÅ9xxPJ²&ăÁ́…ñ˜E<ß6aw2Ô½÷˜Ö¢÷?s,î»RJ4Ñ×Èês̃!Ă3¢ièS‚°¸¤b²ä§q¾‡™;cR3tæ¦iIgÙ`¤Æ¥v®q%-d4"M(9†_Œ0ÂH™•¼1†¢ŒRZ(íµµ6z4£1Fr¹Î×ÛzË8ăŒ;ëF5j0̃pÆ%—Ô€¶údO„)$R2¤”ë|]ÈB0A€d>ó·ƯŒuö'¬a«²‚ÚhO<̃h«­Ç)/XA<)DqU_å<ßï÷O§'k,¥€¼qûó̃Y—ÉlĐĂy8ŸúÓ¾Ưz›lƒ\ï<§›o€À‹úÅJ®€Qöáô¡Um7t8 0¨a4#¶’\¢ă₫Ùœ}ë9㵬µÓy–—PrÆs–+£(ĐJTk¹ÎY>êqT£±†V°¢5m;´<÷ÜåiF3nËmUT…,®yè”RŒ2bŒ`­íÆ®S³.§9§¼̀K` ¬Êy^Éê0”Q¹È)£÷ç{„:Ê+²¢E]ÔÆ»æ®QMÁ‹ëâs~[ß^åWỤ̈ăÓñixúáđƒêT&³On>9u'haĐC£fl¢Ûv¥àœăØ“TEq#̀{/¨@WN¹‡“ÚéNw´¥ÖX'’ %“Y‘•YiœiUÛªv0ƒă½7`:ÓI.…Ø–Î:«ŒRB jPFYcwIXg{Óƒ”í¿`‰2ƯdẲG'¨k‰§Æ2OƯ®£"+©EGx(H‚₫ú„Å—æñ«qhfê“v‡_xØóñCØ7ñÉ0 I[m $°$—(̉²§́(‚IÛ\â2‘½¾zữü£ÍzƯ¼oK[zë£)Åẳ©₫Ÿ´¦‰ÉL W 1´$́,Î;ÆØ₫i?êÑ;ßë)Ú>‘"„¿€T’F«s/°ˆ Y(©ÁüÂ{º›Ü'q°Åöó‘RO™“K³ü:{ƒNöÉ9Fö ¿Ä…/ Ú‰·ƒ—)ỴQ̣iÁ\„7xv MÜkgÈy÷™ÜêÂeIˆøú§₫Ưsë[Ÿ°pcŒƒ́9<€ ̉°»Ù¤O[ •I €W&Kç0cº₫qDZª+IàÎ9Ï|fC*Vù̉{çç™ NHîˇ_äí¼–ơG¦æä*0'=„p¬ÀddÎNé¬̃ >?Q›&}"°'# Iü¼ Â;Ÿö3‚‰À€×(HæBă\Ă‚¤9B́£ÂGc ç n*QH«)Œ—Z’äcH”Ôæ̣YÄéqa «C™››sM¹M ‡®bî̉caMNxJêHeˆm&&®…Ø4­÷¨Z¤‰aez àc¶Đ±„2c̃±Û€¯¬2‰eë-sAéÁ<³Ä"„Ê€¥èơü×zî„‘M`Gw•ª<ƒ]ưHiCÿ€C{ƒ=eµƠÊ©%ŸÜ¾é ¶2×aQ„°=“$¥´ï{LëñF*$5b,[Ø8‚[¸:¤b˜çx|À–€xê™cxéfBî)±°Ûù%Ó!î øWR3®ÅÁLÅÖ°²“PNL¼‘JU~®`hÓZí´1&‚‹¯Ê‚|¡flNĂ ¥¥ê?ç5«­´ƯĐ@™•y‹\F”VGu<µ' .•Sy†RªFuîÎÍØxïs‘×y]gµä̉zÛícÿh½Å[ƒ¹ÁMy³)7«b%¥€€ Yí¼ÓNnÄŒ‘ÁzE‘häRˆB ’‹œ9&œpÆYçƯÜï~xøÁh“˼–5óŒ̃ưĂñáp:”EiưpüĐ©î¬Î/J^nó-kF;g@ƒs®®Êª]µóÄßî¾;|÷Ô=!_¨†¶Í VP èn¤œ:G÷ä6ùFp±-·7ơÍíú–¶?ïxú¡È N¸̉ªí[O¸DÉ#PB§–¨tÙ?Çǵåùó4®˜UHđÑŸ‡æLßU2’ÉL¦¸&ú̀©§́\ØL}/be~Ê b¼[ÓÚµÎqWñj[lƯ䂈5ùp¾ húQIhúÉÂ2裮éñüȸ¯­Ö:¬u¸$¦¹YH̉“IlnÖEËÚ !RŒb»ôXßü%&PR¨M\ !Ö@æL ~™6‰L–̉¡§‹«ªÜ~r½s.² #?ăGÖbùñż‹́&́W½ˆƯSB„w¦a?uµQ0cL I(±ÆZkgÀ—$Á22NÅÔ‘À³¸ŸĂ¥†añyaÈ₫ùâîáîÿúÅÿơơáëJTÆ^r™WùªXqÎÀ¨Géä*[}uơU§»O¶Ÿđ/ë—ιo¾½kîĐ£ ,´‡öûĂ÷¹̀ÿñ§ÿø§·?­²êë_¿^½.dñƠg_QFơí¯₫Ư·ÿ®ÑÍ.ß]—ׯË×ù&\œíù¿€T§~~óó/o¿üËßüå ‡ï½ê÷Ư₫±́+¹º®¯?½₫´–5ñDiE-µÆÖy-YđhLÄ ¸Û}»×NWy…Ă¸ÊªœçŒ1?ñ'qiRF!]=s¯óơÍúf³Ú4}#syh‡öđƯÓw‡îpÎêB¸ÿL¡KIy³!Ả°b³–q̣'S 4Ưäyl1 ßq…̀"7-zzn1`ÄO<¢-0y¶D}QDđïÍ;,A´¥{,%°₫Œ MßÎÇróJNER_|sL„0^ ¶r©E’ï} ^§Ọ̈@!îºÛK)OÇqS7¥æ§‘ôbƒ›Äq£Œ—.F«1|/o­·Ø}"ÂIÉßíA¢¶mV&°°}å ÏæÀÀ)~»¦0v¹Œû9 °µÚh¥f/¡1¶™7Í ß[6“‰¡K|â`ªix ¿…L>¦̀•ỳdÈ R6qh™hîIá] YWµàÂk´IcÅ4H‹7}‘m…Ă ÏƯzK) ;öØ`EvÖ‚ú1EáqD¯Ây DZ;¥I<¿˜öª'„}¶›É̃8yñ΅ÔØÄ'Ư„b4ă¨PïúŸÿđ1₫æ"µ*ƒ¸”̀ ơ4Ó"}œ̃Ù£%₫ôuL8ṇCŒ™b¤v,²–$•Y`ùÉH³:˜ƯN0N̉N¯Ä ơ 81"çNFC„Îx¸UiÈ•´&˜J<¼hΓ8Ư„‡”«¯sÎ¥”Œ²¶kSí<™(ƒq¬‡Än2YK 2©ê|&q¦ü馺̀˜°…OˆhI¹¨{$©YPååZy±ÖÏ%?->9Ù3 ×$×&±Ki:j/cC9x2ŒĂŸ‚cMüi,Æ((I:̉‰öc–XL½~ÓsÅ´c]D‹QÛ|*«~7G–$¶WáÀ̉Ç3ñ¾¤2 cÄ@É<€ƒykâùƒS)̃…¹ªă|,úC̉`|8§,Ø9=˜ƒP f >hỖà¸Jm|¤ư₫梙¸¶‚“™ôàÏÍÙXC<ÁˆI¨ˆ” ;ЦڬËơ0 ƯØá…k"xÈdÆ)ơ¸oöÇñØëS¾É6·«ÛOvŸÜln$—]ßíÏû§î©Qqñàm¾ƯæÛ:¯Wåª̀KBH?ö‡æđÔ= v „”¢Üd›u¹ÎEn­}jŸ†‡<+¡¯ó×…,Đư6cÙhÆc$àE+órWï€BÓ7§ö„'2¨lWÛnè~ñ₫½é·åöª¼RN‡#qäÍöÍ—¯¿¤”~ÿ₫ûûî¾×½ ‚2êÑy‡ưÅÖƠ:ç¹q¦çÜ:_o«íÍö¦,ʦo3ôcoF£~êŸ̃ßv¼YƯ|uóUƠmßö®¯̣J;-@€ƒSúöé[Jé:_S wíw₫4~úâ§̣₫D)ơo₫úߌzụ̈êËWÛW½ë[Ó2Ï$“íĐÚÓq<*§r‘¯ó5¥t‡m¹Ư[.¸2ªéûóư‡æöfơ溾̃T›Ñ¿~øơ¿ÿáß÷¦oƦ–u×WÅƠ`†nè±ét§Œâœ¿\¿̀d&¹LkF5cĐ­@N¸%öưé=6 ÆGÁ›ú泟½¼yYäÅĐO‡‡flÇ6œ‡ó¾Ûk§)¡qé±£@¥1ó§1íÁ„°+î>Áø… Î8Ú‡/`¬‰²'2ªŒ”RŒjœ˜ ¥g₫Qêư’vüàê¨-Nuqi¼²x¾|2/æ‰)çBŔeæaûù€1M»­ûĐÖ}̉d–mË̉ ‹B<™¹øI˜®¹Ê›f9§ AœyÙL F§ëi–Xe#Zk0G₫X,i^¦Rø4̣KVny±K`@aHàÛ ÂÑO%°ÉIÅRļ"pé£ ¸8¦“²ƒC¨%^y²lI6Ó@fAR=÷ñE¼1¾J¨é.HºY‰;tÔ¥@Uؘ&Ữ&̀C‚Éwa)°q̉,Ï#Ă0t}f`dB.cô4°YŒ ç|»ÙzïÇaÇăơ˰3é{“(ÅŒ¼Ÿäà!Æm >瘇&5.¶ô¡ Ø6ä¸2ü\̉ƒ¿Æ ç2¿fœ€èí½z¯ú$¶^~ê%Á9èt‹ëKŒÏÄÍSiÁ+°e T́²˜?©#•>ëK…Ë:{â§ H%,ÄÇà‰NBơÔ" `̣…% ¢!†EVRw’rÁ ‡B‘†È /ó2ÏsÉeÆ34J'S7¸ ̀™@\Âs— @Láâ“ôơsJ€s;Ô|—;ÄÅ€`÷èwI³'7ơ$5ÿyô?¿35Mü₫Ó‚Z\²)ÚĂ|`̣Úœ°%E2٠ঠÀ¡Küó&Ÿ¥³X‡ÂdN8`à!­}Ç©;ë´’’ºñ3³EYeŒÑN£Ÿ÷<¡p«³42Ááwƒ Ë>¿¤‘¦¤i a –cI'8F'ú ÆaHŒ¤Ø¡Åm,’S‚2I¼̉èÖ̉q<\ec«@°3’ÜÔZa¾ª˜ÊM̃ŒzŒ¥°Àïä€~,’I ÔhƒmnpŒÖÈ,gBˆU•¬¾_Œf´Æ‚Ie36íCkÀ(¥Ú¡íÆn°¶úb„QG%•’ËØ¯évh•QHÎó:«±‹™äRÅ9/E fª,¶ÊW‡₫ ½¦@‰'­j±Ä{₫CóƒÓ ]347ÙÍÍê¦ÎëLfY– ăđúêµ”2ă™7₫8 Q´}Û ƯÓù‰RêˆÛmvŸgŸW²rÎƯîOÉV5çüjs5ŒC.s ‹|]®¯6WeYVU¥næ~O9•Nn«­ạ̈Íơ›—ơKă ắ]¿¹~#3É(‡ñîp'r1˜Sn½á7ë| ®ókgƯ©?áƯ9›38‡–¬4ÖpÁo¯o¿*¿¢Œă`ŒÁˆ™:J€Mµ¹½¾ưÜ~èjT9ÉÁÂCû€Æ/ªçá\̣’3¾*VWë+Oü0OÍS7v8Ú F˜w₫4œĐAU¡Xg ÂI§º]¹sÆJ´ƠƒzÛ~xß½Ïen=ç‡fl®Ê«\æIŸ‡óSÿ4˜Á%j{í4Ö©p!»©UC‘́áPµfb.¦‘@¡TL&Ä3®÷Ù¸đJ°ºÖ¤sóPÏ€Q ̃{FY ä/á¾¾ØăWÄXy˜WËäâ6´Øé ‘àˆ.YܦädÎF↕s̃’†5Âʸq0ÆpwHûƯâżè};Ÿ],wO ”71̃xăă9ç!0g#nRnDX ¡7Ÿt u²Ü-ÉÄôfF¯¦=Y¯ÑEÄ` ¡ Tñ:ç"@™Æ )æˆÿ]7LNå"‡?J ZÇ  ƒÙit) דÍóB›ë&ñ ñÓ!¡ÄÔÓ4@YÁœqs ˜ï¸›Døz¨TsẠ́hĂƯx$Hñ`–Æ!¤È ÆD£äW] 4ÍgçÉ́fsjP¨Q¡‰c$eÓ-xgÑŰ¢I´í)à˜ >Œ8æ¼%âtió¥$œKSéó8V9ve¿$‰«s̀Mc )JñẢa^Y?›ÁĂÄv gœÊÛÓ¯h$ºLK@ Ñ;?매"r–̉Lë¢æ. ÷̃{Æ;váú)…Ej£/<̣c­ UUâˆéU¿)6iAZÊ<£”zî1AÿàB<=ë?Ü\ú©\J:ŒëBÈa*á!”8ëPï}˜à9Skw*¦‰ÅítŒ´đyx˜¸ư„ƒq3ù,-Eöy¬¥$Å™’”ø&-t±~n#’æ ©]CÀ̉h‚CGª= NX˜”;âpé‰éy aL‚˜[e…@Ù‡©¼¨uy:̀ÙB¢åpÑ1#1u‰Ö °œ:}Ä;(­n4u–i}œ#ÆåTØ™’t7>€DFQļè OœcF¦í‡̀[>!KÂqTM`Và- ‘±ü“‰°½¤„Èđù©¨`Âq ɲÿ:RâJi]ÔeV.®m¬^:oíú®íZœ5Q€đ[åUVU¤Z‰Ơf³±Æbs¨A ÍĐ<µOØW¿œæ=…¨(³2vô`EG|Tz¬̣ƠU}µ©7™È†§„æ"ÍèœsÄi¯À`̀(£ĂqxjF3 )ˆ&½êƠ¨=¬ù:ç¹'xëWùêv{[–å¨Ç~LÊ\ràÆ™o?|k¼¹ª¯^ß¾₫ƒ7°Î×}Ó¿+̃=4¸:«G=æEÎ/y)…4ÄP ”S*hƠHF³Ăé`uÄ­‹ơm}ûÅ‹/̣,?ơ'í5ñ;©9pB—Û—¹̀Ú‡Sj}ûùêóë9Ïû¡ßöç‡M¹\œ†Óûæ½d²–u^åÀ`•­¶ƠöƠæắ₫pêN8ÏÍytcNó2/W«•â•{e•m»öĂㇷ‡·+,ØU±Â!Zçơn½\…ń0“›LdÖÛï¾SJi­3n!%èđƒÛ‡¶pRˆ¢”¥(D•WƯØƯî̃̃ưêñW+sÆsƒ¬³£¥½îw£±G½s ¬T‘åˆØí́;LÄ¢J6Á·aiÂå‚QXpÄQ7ÇU°X»=c (0Œnc ç$-GçM™PNFg3뉈3v’2̉YGˆYúŒ4M:£CkXd *VàĂj¥ÆưóW¯ăÎuÉ (́!MÈ́’ÀÀxm±ø‹ù±ë ØêÁGaZ—Ñw$•2†đÈ̀L• ƒ……†OR‘©Z‚AåT‚œaĤæ3®§NGqĂ'HƠBÈÉM]–ăFŸ"w!­ª aï°:àÍZÚG5%5Ååœ0 4ôL4f­‚ đ)©Dàn‘/Äqƒ‚\ø‘„ùé'ïÇă:­ đ,p U”)E ¯L­“|ˆ)Jé°ˆB ‚VƯŒ2kQÖNb€íte¥(c¸¬Bd"C₫˜á«wh 3ß‚i§#“.7/)än·#@Æq́»>Uú’©SX×(Ř'îË©xĂMxVîE¼>†µI’±5'̀‰A_ÄÍSƯ'M«Ü¤Jä¿ÿü¿Ă}’°Ă/¥ñK?ÁXH‰È—§÷) ‘’F½löĂR6ÉRiơfT˜\r¦§ỦË„âØ?9‘'rœl8@±Æ÷»é¿ă3$–{ªªªÊªmZ¥T w¸é·A’ςѾ`"dŒ]21gŒ ðªV˹ÈÔñî!%hRsUáYÇơ™Ö&¼}©?Û¥®/±‰~ûw»Œs2F(b„₫Áơ+‚âq-”z\Ô¸ _y A¦¾Â‹›îf₫ñ”W<"úO«Đ<†'öí̀ë{Æ¢¹ØXÓù…µ…,Ï¢èû¾icL RâºN'[tÜlă” qÁæ&SåaAÖ´¿€IDATâG̃œQ;tK1¸̣h£G=b|6ñÜ{ƯGqÔ`†Ñs© }0@‰ÛßÅ”g„I&ƒOd©“ZäDăf¥«å`DØ₫B!:‡;‰œïâÎFGZP½–¥¢ØH\‰$œxï a¢À/`=&dDÈÅ|/ ^=́₫ö·z0ÂP<†  Q`ÓĂ\æÏr™g" } „Œî=qyœC çBËj£ÑÆ;Ráa‡¤.qnHÛCÅi&º$¼sä3_°ˆ#¯¯gúbükAŒ~AúJ—BÛH@]0£.øLÙ-₫ÑTבîG3´45•ŸăUç0ưcŒ!̉Ô4Í,×´3+,>ÁK6q(~„ưµƠÉÿ&EbX’âqóxƒiD:}đQ03ü|¾ûœN>¥A2­SÁ£€̀©$~‹ÀØDË¥p)SS§äø¢CKœ´'Ïv4c!‹ÈÇGö9₫~:L¹̣¢lˈnaù1cSk~G`¬SßÙY8ú-´»Æn<¥¸B¥ŸŒQE¥•±f¶…DÓ›.åäqˆ á₫9eUÆ3<ï|TMºK°7˜ O²\Xk‘ÍF&ư;$Ä77Ỳ¡̃Ä•_”P½E«áÈ&wíyef™¡̀[ZÈ}ë̉YÉàưlo´̀k“µ$ûÏc;†¹Ñaá0%T‚N­…q̃ ¨L31nœh‡ơ—×y7r.öơœy 0f‰ó˜m¬á$ô}ÄKBr.¶×VÇ'á=ÓK =~Åđ%à—T¢–YÈ,XŒyf¸,d¡¼÷Î%­ăc9r¾>~BƯ’´Ă0j®Ê«O_}Ú xÆáư₫=ÈXF(¹*¯¤ưØ[g·Ơ–Z:˜¡S{ßßç2Ç·yâŸNOoo±¸áœă‚j8ô Pç58 @…Ä£̀¾ß+P`a·Ú©Q=¶(S9«3uô*»zsơæåîåưé₫Ø=0ÂÚëwwï¾yøæ¡\k”SËrg< —ërí[Ÿùátøæñ¤’U&3F™Ñ¦S]7tîÎă™q&sIê^7CÓơ b—ír™wc‡ñª•FXg•­6ù†3 A´®@ăÎ9Nyó¥i¸K¤´éóÈÂI÷©Ë=øyÏ…̀|6/Öi_ˆ;/Fyç‰'Ñ£'`„-p2"A"ªgäˆ<Ë¥”Ƙ®ï qơÀùâˆcÀA…6Í eB ¾âÂ3€Ă $¸Ç¢w\ŸĂ”|‚`\$£ÈGVÂg aÜ|gH—ú`W?Ùñ…E`Ú»‚Y¾e„Ym­¶ˆĐ§5í«ờBApÄ2`ª OD˜@YiJf.&'°à8 ‰₫-Ơfáe‰jÔ(ọ́ߤpMw¾eĂÏ̉¯Ø'EeqưŒ₫ă3¡#¶€D4g̉ ă9¦Đ´mE0©#@.¼.ÈW\ίI@ä$ Ÿt²X¤Sv³à}°¹ê>ßk2;q¥…èÈ´‰L‡9NöóñxïÛ¾uÄI!5é¤wó¸ú¥20¢EN•H^!¢®µ.†"¼’±é`H#ŸäƠ™qt1eâ.y­jáÿgt“”íG:ë9¦Iú‹!…1f‡ @ª~H_'SHúMÀ²¥®‰~̉¤Îˆ ØClgÇtú=xă 8€„pá';§ÔÇ ¶GXl ¸Å5}IIÿbpÏ:܃GjBˆà¢.ë}ùcFèÛ·o?˜1ïÇđ+ƒ@êîJf#§5_Y_$åÇøg*¦́¡Ü预J0 @¢oCª:.:ÖMÿ9Ç:*îx,¥i:,[:̀»É4K­³˜ B¬µ™ÈRÅƠ₫Yæ᯸À–CÔ|ÑIÄÛ´‚ƒLAs¸c)w ÁU\ hâ$‰d<¶Ö gQ £¤Đ‘ÎÛ‹²Fˆû'=tÄuBñọ́8cO†˜r̀Ó±b85|x§4åÍRc½uÂ9ăF3:Ÿh“oiÔEàGlL±p»đÿ1ÎŒzơ¨lè¯L6lPT§½)³>Ú¤.xp£Å­.^¨ÀÇ…Àde„9ï”S1ËEÎÛäÁRƒ3¼Ú¼jT“e¥”[^̣̉z{êO­n‘É03ëêú‹›/jZSB5ÍĐ́›}§;ÈY‰̀XĂ)?éÓCóđ—oỵ̈vs»ëvûó~[l­µºŒ³‚9ËÀn³k‡VơJr¹®ÖƯĐqÏMo2 zxwz§œ̀pĐKl²?ï-Ø*«€S^@'›Í†)öîéƯCû &œ|yơ¥¶zU¯ÖƠú|>ŸÇ3îmŸ́>ÙVÛ³<7OÍ  v•­®7×eYöCßôM7vOưÓJ®̃¬ßœÎ'åU™•Ƙ»Ă âË›/?{ùÙà†m¾}hƯa‡¯ß~-ćzÓ?v°ƒF5î*¦üà¥WôêÔŸvÙî¡8·g ăƯBUVåƠi8…]µ»Z]e,ۛǪUÊ(# jl(Đ‚sDáĐLÔ™ZĐÄU7Ưnf<†nR:.0‹Øniú­Pêœ 7ë- a­"º"ză')$}qv‡‚áh&¤TFZc¨[̣™6ChHâ=JiUU›ífƶk½‹@H€=NœOë$ ˜+¾Çy—“<`á‘(ïœ÷^[í¢5ᤙ9½n.ñÅ‚=’ˆ!LFFXÜ₫HÜw½Ç°¹%›À])́MXâ ”²Ẹ́ S.m|¸0yYFb¦¤û¹=óGB©d„©ơ[— ˜(ø>)M)á ‹1wÜ­æ̣,eQ‹g‚EJ‰'ÔÓ˜̀₫à“L+ELp‡÷d€ª¦SÔ†R‹z71`M™Ø1îŸS¯¤"„q„́«ƒÁ’÷É„́ªp¥DpÏ„k¬à"Y˜¹S³‚¸ÑH)¥”œsc YP%Â5\Dÿ6p1¢rl̃gƯ„ˆYgm†F{Í€ÍJ <ëđàƒÑ¢·éR^«xéâó9üˆ¤#’ ¤ÑÿíƒêïëA₫o}FăûÏö1×.ÈœÇIwq" *•÷ŸĂS÷đ˲F©“Y&Ă’k³o°X́£$é5™ÅÎQx„6SN9¡èHơOÿé?“BüêW¿úæëoĐÑ̀O¾·W·¿~ÿëQƒzØ›~´ăhFå>N:D;aIeƳŒe’Ë\ä’KÉ$íI!£ˆ3.[(¥ˆ‚°ÑŒØ¾}ñb4¦|‘{ƒŸŸ‰,ăY‘™̀r™#sQpÁ9G;²kĐêKi¥”RFƯï3a˜«Ơ!¯đs/rd¹̀®öç'ScƯ .OQù?<µ2Ç0åZ¿h—áy|1îßM AA s¡'oœ ¡m4!‰P̀Ă\˜@Í4¸™…D>4… „Uáœ{:>)£¢z̉íjÊ0@ÁZA8.¤Œ2!‚”µd2cŒk°±2¢ø¡Wư ‡^÷ê3 zˆjé8C/&,DæN±Øp®;O‹o¼aÜN»&¦UxÖx—ÿË?ÿ_œs_}ñ•àâ—_ỵ̈Ï~ưgÇáˆü™\ä§₫t΄U¾ªóâÓë₫Û§oăÁ{[̃~¶û,y¯zmu§º×«×?¾ù1güǯ~L(9©Ó·ßZekQg2ÛûO¯>e„ựƯ/­±Ÿî>½;̃}öú³/^az“‰́û?₫·̣é?ɲ́ÿ‹ÿư—O¿ügŸü³Ï_|~<Wåêeư’1öĐ8È)¥Ÿ|úéçŸÖvƯ¿ü—ÿB)5+v0óÀ„‰’ô±äi\ÖxK׺٤< wâ^I'_ËŒg¸2„¢‚‰è'—&\Œ3Ză„Q¸©á¾Öë¾ÓƯï߀å·=BILÚƒ µŒ„Ï”P0¯ç̃Æ/Ö¢X–‡ CX4G¯‡ óB*Lp--‹’3®GF;‘#M÷•QÚéÑÏbœsε ¾ŸeU–uéÁ÷ö»~èêDt›\fäÜœ¦FoÙÿ—=₫ À~ô£ªªN§Óû÷ïµÖ¿ÿ/₫ĂÛ|vŒ³Ưv÷âÅ‹¦mû¾>âÿV#à9*¬~®*\~~̉Zå÷©DKTâ ¹ á™ÈÖƠúÇ?₫ªẸ̀ă₫x>ÏƯy]¯ă‡sÎû±\4k#¶‘z°.N<5ÛI6›…v ¦f4¸Úg̉O7~üäXö (́”»ck\æÏ“ư4G3bÓë¾W}gºÑŒ̃{́ë9Üiơ`º©xÁ”ƒ„}²)+Ñă2–PSÆyđ ¡_ú«ơ«ÓpÛ$ÖOóF™8·B ¸91€$Å;19 d¼©á4ÆØ0²²ÆxC)íˆJVDSÅH<6t´̀h–ñ,YÎóLd¸ûF`dgΤdçp÷ƠV3Înno´Ñươ_›£2¡ăAÚ6dºë Fú$2ÜÂOàÍ«7×Ûë±ï¸ç”c†ÏGAÅÍúƃ÷ø4G3–²üWßü«óx₫~ú?üèƠ8å¹̀ß}x÷Woÿª›?xó’˯?|ưîô®’U™•Œ2m5÷J¢¸^]{çï÷~":K!¯Ê«u¹öà;ÓƠy}U]½¾~}<sY–i£ï÷÷ï÷ïOĂÉ;u<đṕ£•SØ‚7€Eê<ÄRv/%TréœăŒÇm¶…ñΟ™ón‡qc(.Œ4±‰ p˜P b¦ O |k7YعyưŒŸÇpÊͰ%q)Ơ0/ÊK)£́‹/¾üñ~¤•₫×ú¯1‘B(2C̉.¬ŸI_°t/#¡§'Úƒ&H4E™Êø¡´ˆ&BS㔨Á ÓÊ)  #S`>S?Ó&%•‚đ•Ë(rH.Ä‹Ư!r2Ư|qp ¿áSH8u Z8æ%­up0D‚رô¹#c,M´ÅL5óè̃h-&™Êƒ8e•ñ†@g;lÀà2%ˆ‚.&$“™È¤˜Öy<7¥^Ơ¹k{¼#IIOwpdÓ¡Z,X¯F‡Ăè[O'ơ-ííííƠơ•Ñæ›o¿QZAj‘¦¤£Q^j܇TY™P^¾|yssC(ùÅ_ưb臋H`¯§å—% üÿÂÿ=ßÇ{ưúơÍÍÍưưư~¿G ‚èƒ\kp$¥¯_ÜÔÍvưăŸüøt< ĂĐưäñ¤,è§ÍÀÏ @Zé‹¿)¥¤”>ï#{ñHơL©đ 8ặ$è?H.”RF™A å©„‰|åçP€™#‘Cá~dÔ]íGmÜH¦ôà­±ˆsÎCh;í[$¶KèXưØ—Y9’ë́ Üöf!79ÍÙÄ~tj³‚º=D ™úÊ_ÖR¦̃€̉dO0IîRj¤¤Ú»(»ñS_ñ˜Œ€q¦ä%6 œ‹3w0"¾±"L›XâÄë[ôÁˆ»W¤̀-ø—ơ} ”ú°ơ܈’Lfv?Á€ îè¨Ă€‡ŸHDxâG7j¥™™ ÑS/fƒüĂYṾ²…`b]®ÁV{”UĐ́fÁî¥8)PĂ¼ö:zlÇ}”–Ô0ÓµƯ»Çw«3±œăWÉe.óB!o2ÆXh§&̃Ó_s¨YtSÛHó®É¿8î%nrCƈœI*9ç‰y¯zïư₫´Ç„¼̀Ë\æ¹Èe.eEYPJ7ƠfSmª¬Êó\)Å)wÎƠE]W5̉½3®EƠ ºŒ:O¼q¦.jIå¡?pÂwån[o½óœrgƯíúö“Ÿ følû™§~Ú}ÿuṆO®?Ñ oª›M±ùêö«Îv`à¡yÈL–ó¼Îë¯^~eœ©³úp:4]sêO7«›ïß+«°æ.½ä .(§jPÖÛ~́ß߃ƒsw₫₫áûÿî₫»¾ï¿?|8¡¹YƯ|̣â“*¯ö§ư_ßươ¹;SC•SßÜ}3Xo÷íå¹¥(·å¶”¥±Ă¼ ›jóæåm´¥6_çu^×E-…œ_H/Ơèœ;u§SwÔ€^₫çî|êNêĐKi¥F<¾33Ç=è”2`3m&±tÎJrk«!íU7ÙÏJé›Û7„’ư~<#Ơ0đm hQb<=CæhRN.¥1r">4é ;;™Î;§:‡­•{>$à%̀ǜh̀E„xRÈØï¿ÿÁ ù‰R(®³*tIw Ñ©Ỹ$—Œ1ÏÂâ†y ÔÓÅî–b¬Zđ̣f8åÜrm5̣Bcän†ÆBÎF)¥4cY!\æ…(ª¢Ơ)$<®¥³æ w[eTüªF"{$ÇMSÊ«üä©‚í´6!"Gˆ ÿᆤsbêL?–åœcö¦ö5aDå”#Å₫’ƒÎ×F+§®ËkFØÍqŒÍj½)³Să9Àî àÀƒY™6:ÊN"@l%2i°ÈH qx)R(3%G ñ!àn¸[?­1ï̃½ĂÈ'̉ßc¼Wæ ç4‚~k1™ă¡Á́âÿÿø}¿W€́‚ª.7›u×u±xô}đáØÖëuçZëÓéôÛ2BH–e××WRȼ(RfäßïcÇ¿=§¬ës̃÷ÿ_ö₫¤I²äJCw²É͇đ˜#‡J$€Buu5««»)BaS„̉\pƯïư.ø¯¸çÜ4ÙB>v‹°ª ¨BU9GÆà>ÚtGßâèƠ{Ư#ÈLä 5C,ÍÍÍÍî zô ß÷f·Ûư–êóÄ>·äB¯?;₫C’bUqL|shnÈ®tE‘ÈOA+hܽ$ O¬³ê âOÂúGj,Gzœx„›făH0Êѳd̃óÙ±ÏNd5 +H0‘±,ºƯ¨Ç‘Q±t²ez) ¤û>™Ê÷VQB‰%è"#óIPPÛÎÓGÔ»‰ÖÛm»My{”D9V‡öÀV©k¢  ªàa='fPbèư×ˆĂ‰H¶¸WE´€=ăe ¥N₫ˆû:n]Úi¥T”»AraŒ£‚æ2¥øíŒ²Nw”ÓƠzå½§¦<å”K'S—Fc}ƒlÔÿ¨½ö•ÙP§¶J9euÚƠU]7µv´Đ?ƯFYỂ”§({—É /`ÄŒÓC) • c³ ”£wNaNºØCqT±!#ú5›Á9B㤗íe.śV»zƯ¬÷§ûÆDrI=BÍŒ5‚ËƯåéî4osël£T¦y’k.ËËÎto¿Ơ¹îÅơ‹²+÷²½{³{½!‚4ºétWwµ'~"&TPbÉUs%Sy±¾PZI. V̀̉Ùæz3KfîfGèmÜß¿o¼©ëú²¼TZƠ¦¾¨.>¾øx9[î'ûî6å&!É{'ïmê ơT[]·5¡äüêÜ{º>5̃\®/O®OR‘fiv4=zrüDRɾPUUUW½̣₫¢X”ºlu»»ØQBµƠ‚ ®xkÚNwœqi¤÷^ )¤(Å®Ú)¯´H“T&2‘I§»ÚTª xÛµØ [¡5]ƒ#±?#L;Ư6a ú¬ăK¦B#.D¼”)£˜d…,”RJ+ï=ĐÁ£B₫é›*„x₫üÅK÷‚Œº7ÂMJÀ Á«¾g$¹’Ø1€åbü(´ö=¹‰%²†rÈ¤Ñ f¯øˆØDè¿ä2å¡Ë$Î̀ˆØD?̀óÊ3G>Æd3–Jđ»:ÓáWû!Zïå úÜA”¥FcÖÖ[k)¡Đ -VÆÈ ?êÉsKè-U êbîĂù(;±9ç O™$2ɳ<"ÂeN)Å5‹Êê”Q­j›®©»ºQM«ÚNwí°|øđúêú—¿üån·ĂyđúĐZ—»²m[û]—/¦Ói–e»Ưî7_p|̃Z3N¾¡ê´ÆŒ;ô¢I0brĂM2†÷®đÙĐTF¥ê˜ˆŸcÁ8F™'̃[ï©×Vsʉ$„Kl$1Ç’®ïÙºćGdEQ&LªQO©§?˜̣)§üUơj Ya„¡\̉ ]Í¡Äzk¼|CN8 £+yfØgL8kLƒ Qx¨ăđ,V]"ô(Qé̉‹“=Ä“ëÍơÑâ[VI)™L'SÆX×u_AEw¼µ-xđ6H¬"?8BbpÛ‹LI:YWë¶w®¼,_\¼¸AcèIN‘2>‰mÇèEx}œ<'å´̉̀³£üèơf Æ™8‘¬³n”Qn¢ĐgHÄ™†À±́ohF1ƃ8s¿y|fÖcü"2•Ó‰œ²Èe‰¬H‹½bo–Í–Óå̃t,|üêăŒgï_¼_uUÙ–»vg¬)u)™|óàÍŸ½ù³ÍjóŸ>₫Oi₫m÷oôäGm~₫éÏ?Z}ô'Ë?ù·úo“Y²;ÙưĂÉ?|zưi–eưô¯¯«ÿúÉư_ưÉơôêic›]³{ïƠ{ól̃¨æåæåÓƠÓ?=üÓưù₫ÉúdWï.×—ï?~ïù{­Ïßü¯ÿù=̀ÿ§ŸưOÏ>}¶m¶›f“Êôƒ_}`½}çÑ;çWçËẹ́Ư‡ïêNwm'¸øßñ¿ßß}|ôØXs89̀dvöếƠêć₫â₫£{^>­}=É'ø₫åû—Íe¼8øF#MädNÙœåmùôÙ§‚ˆ«×Í5–qĉ„÷]ƠÖ´A„̃vŸk (C¾5Àà¹̉^Ù9®²‰˜0Óù”$DyƯ45,% ²Qè¹2ÎfÅ4ͳ‹ËËF7M×`lV"á㸔8 1 ¡VĂubÆ'ö^DF ~̣4.ölÇZƠZcÀZÛÙîVjHR™‹¼E!‹I2™¤“"-&Ù¤È<˳$K’D¢éqµ†÷môĐíöUa|́‹‚6-`TLÀå+§:¼¾d„‘SÇ€¥,Íx–‰ ›µ¥"M̉D ‰ÑK¬̃ º‘û@ .BW*Æ€^Hk­RJ­”êT×tMY—»zW¶å®Û•mY뺵9‰¤́,†U…I2™æÓ¸{†& X.ơ~\̉ÁKWëzLDöçÀƈâé£J8é;Å,ɘ'fœÁµ·ñÖ{ç™gXq½Œ¸óîÙæY¬U~]Îôl6[.–”̉«—W]×ưîxk´mÛ¶íï₫9Ÿ9º®û&ù~|¡×Ơ§O?=KÏ6›Í÷* ”.÷ö?~<)>ø ,Ëø«4MÓ4圯V+çÜz½₫àƒ•R»Ưîk@¿Ô@†™⻾x¿ë\1rƒ|ܤ@ åÔÏñ´""(₫8ÎàµB0p2´¥·ª₫ó#ȇƒ×$b#¼̃ƒ¿t—”Đ1w¨´j*¨@d|₫áƠƠƠẠ̈ÁÅǼ—2Ọh2¢yốÉ¥uK:„|Ø1Ê·cŒ>VŒñŒ5‰H6ơ‘]ÚêÎuÊ( nA3}/ s‡H́NçÌœ!ˆÏ ÓQ0fë1Á3BbI­ëZƠ•ª°sPûöOPR 9ÁÄ*JĐJü†•®j]g€@mêÖ¶«vc’Ldót>Ïæól”)’â`~pWÜ3ÁDëÚĂéá4Ÿ:ëŒ7oƯ}ë/ßư˲-s‘sÊ“ûÉ|2ÿïé¿HÆ›ơvưîĂwë¶&„d,ûÿùÿx¾=_ä‹T¤ñè/lkO·§ àÏ₫Ùº]Óœ₫äŸüËw₫åơúHrU_½±|Ăzû¯~ô¯ÖåúÎüÎr²œ¥3jéîr‡—×YW¤ÅÂ-´Ơ‹tA=(₫·¿₫ß~|çÇWÛ+ôùöÓ}áųëg×Ûë]·;iṇ̃úåe}ù«Ë_=XƒköB>FäS—¤¨£‚ỡư>ªÓ„™}C+¼¼¡+­³Æq .1´dÔÛ„ôz‚¹˜R••®Hä¼2†å̀wD¬?fèc7®((Ù¨†ˆ$^m̀îG¦lʦY¹^w5 87)¾T}~zT?ŒDç1¶Ó9×Ù?–#ƒ€øÊø·Ÿ%áă8n¦ĂÆ{Ö`ú¾>7ŒRºX,̃|óMÆØ÷-ÉûĂøæÆ œs———”RL%~ׇ}ăØêªZ¯6u];w#µ?N÷÷÷¥”eY*¥v»̉Ú—Zë¦i¾ÛcnÛ–RúÍEĂßÚƒöâKăA)M’sÏ_1èú,+4fKoiSü%ÏèËØ“Zé‹$$iBV̉éÎtØ&Ơ¤”áQJ!µĂç9oµÆb;t ´ÑZé!*p&¸¼”Àr¶$@Vå*¦̉15ˆNÚé1Ÿ̀̀́±\À¤ÑM§:É$,¡ VŸâá­í‚Ë;˜  ïnévD;1Æ"{XHKg³|¶­·g»³‰˜PJÏ·çI›œlṆ$ŸæÓu¹–\GƯH&ßX¾q¾=ŸÉٶٮʕä²S]ƠU¨rÍK“4å)Uto²÷“7‚ßÛu]ƯÖu[—]Ùê—C´*’öícû™Œ6ÁxSwµöƒFDcĐÛè+fxp>giVuƠ^¶7I'o¼ưøà+éåüÂCZg-µ$%êÓW§ú³æ (ÔuƯÔïƠ“0À÷”©ÎMwƒèâ%ÅSínj¨¦W !ÄïŒët‡Zg¨vÀhHI:Oæ–ÙˆÏFïs¼Z1é³XƠC•! ÷(0ϰ}^íÆ5]×yâúÈU‹@&ÄZ ¬±<ƈr r½NgpÊwƯî–¬Ê-A›H™ „xm€sN Å“EƠG Ö8C!†îFÇYç½otƒ ü ¤øgpđn£cM&VfĐDÄܼ¿)däû=nÔià7e~Ç1NZ}sX\Rư1̃”R)%î/ßmâơ‡ñúø¢$`ç\]ÿ®[ßÄpΜœh­•îêºÏÚ¢(¥”OŸ>Å ‘R*²ăˆjµß³¹,Ë®ë¾WqÔçXÁŒIˆ/5cûûû]×ív»¯1àùŒÀà›1¿Ÿq5½oSíÁk¯­±ˆYÇí½Éơí«¢C„qÿù‘»(=̀—S¾̀—”Q¥Tü`Î9r'Đm‚L±óëóIR·ªEû.…ÄñŒ‡t¸5ÛX¢¬vÚy‡å~eªï£XfR§ù”s¼ñ”PDáçi&)2q½÷ÚéNuºÓíƠ\W×9AưY  œb”I*C‹¢‘̣ú-̣­’(©Ü_)d*RÁƒb ïeƯP!Îă´ÓF£~h­êÎt!ơkuHÖH&S–f"#„́å{‘Íé¼Û›î½̣¯ưfxq‚Ê)j̃!ưg„@ºj*,,´¦EÏ^;Ư˜¦¢Ủ%²•)O×å‹'ô$å©'>áÉ"_oî-î½8¡©>S u[¯ªƠ‹‹Wå•b×́œw»f÷âêÅ$™ Ó3Ëf̀³ÎteW~x₫á½ù½<ͯËëO>ød9Y *Ú¶ư>S,qÔm½m·¯Ö¯ZÓÎÓùus}0=xt÷чO?¼ª®/¯^nN9đi:Ư©Ư4Jî-ïI!Ûºe‚ .æÙübwq]_—ªL“tºÿ‹~qY_îå{'› ô₫̣₫Óó§Ûn{½»~zư4á ¥Ç’»0ÏÚª-²bÏ‘ªZU7uÉKlËàÇF“Yắ1̀€Móigº/?Ä̃êŒ2 Îŕ,Ù1= 0À䘅bœAoXq%™́t×t Ơ8O”VeWb+ m´ ¤––ZFØDLd"Ăô’Rê¼ẮC¥ª²-„ƒF<0Êä2Oy‹GÇ=²J°f…B¹ÅN̉ÿäIí/P±j«uµ¾ª®Nv'*Ơ”đ{Ó{ÅÁáüđpq¸7ß+̣Bpa­­›z[n/V×åơ³«gÚiJ¨v:2PcÓÜ@rẹ=a&ê  C«Zå“ßj£ü1$â辸=¤”₫ùŸÿ¹µöåË————ßQ₫^Ô ü(¯ Zë¯+Ø „Eñæ›o6Ms~~¾Ùl¾…+ö­ ÆØd2BXk›¦ù½Ăt́ïïÑ À÷yÄØëÖ¬]¯×'''Y–aâü+ä!íïï{ï‹¢˜Ïçœó÷ß»Ư₫̃…qßèRN&)eUUUU}ÙÉ{ß¶í÷J4ö{2¢µ₫"I‘(Ĩ½#néYEIµ^ù>‡%fm}ÛÙê‘ÖgOæIœ́N0½Í9g–yêKZ>ß<w´ë¢«µđ(¡xå”Q¦Ơí8’!@ ÂMEZLó)&Ô11ùÿñ?æ"ÿÓ7₫´i›VơnăAïqBæ);Ưm›íºZoƠ¶5-xÈx6M¦{ù^‘ ˜6ºRƠ®ƯU]¥­Î²́ñĂÇwwT£¦QJƯ]Ümu‹­LLóéƒư赪-Û²lËÆ4é¶v‹à ½™ˆÉ<™/̣Å$¤2e”Yg•Q³©u½kwÊ)„P£k‹]l¥ KcÖ"Ací´³N0‘°d’Lö‹ư?ÿÓ?pïµöúâÚz}ºé6ÿç?₫ŸœñNu¥*Ó\W׌°JU§å©sN9µ—í "~ơâWÆY6ûÉ[?yöâÙÓ«§rü'Ù6Ëh¦@=Ù›¤“‹êâîâniÊT¤’Êç×Ïgù́¼<ÿtóéAq0ÏçRÊƠ ¾ăëzưäè‰;s×»ëF7ÇÓăVµÏ¯Ÿ_UW„åÔƯéƯUµÊEÎ'üb{1I&Œ2í46FÊ&#F•ïƯÀŒ5–¯ ª”:99±Ö~íÁñ·ƒŒüæÆg†¬Ÿ7ÈÓ—=]ÿ~ă±k̉oXdØÁPƠÇĐ´L 3u]oºÛ¹œ(=>ˆÿ·ư9’APœ Tä`Œ¡ºç:0pº9EÀ1^±Ød'v9ơÎk«Ơ4ªim‹P%”fBySđ µ®TUve­kc H°ÜºÔ5ª¹¬/»ºL R'^¥•ñ&*œ8çr™I@ ¬Z4ºiL³ëv±WÎ̀ÍR™:ï° ~-–;R™rÎ9áÎ;”…´ÎJ!‹´Øă{@Á€‰\p£Œ÷¾Vuë[# ĐN§2=X´ª½Ø^ Nz™-)¡UWa'g«g×å5lÛmƳëêÚ9Wª’Ÿđ«ơƠ¦ƯœmÏ“Éd–Ï2™Yc5èÚ5—Í«í«ÎvÄ“ZƠ³|VwµóîÁ_”k³nfÛmO¶'Æ™Vµéọ̈=ç‚8åØÁ€–‹ü₫̣~̀·m[«Ú(Ă( º.¬†Ê)Ÿ³;w(£‹ëÀd³q¦l˪«vjçÀ!î+ăY*̉”¥X³ÊÓ<IƠUg›³ª«<ø‰œ´ Œk¶Ơ¶nkJ)̉Q€Àª\mÚÍ$™,̣ÅÇ× & Q̀—ÇËù2MR ´UmƠV›r³®×eWgêªV¯c,a ÂÛĐ”•m©¼zøÎCç\“4Nú–·«v'*"èJU†¢3Xy¸•7{ º1p; 6´¯²=$ự& nß¿…=…@5É/ơ·̃û³³3BÈ×ÎĐû}*¢@Ó7ưE_ åû[?ÓS×5¨ßô)|ËóÈI’PJÇ̣3ßÛqk-xïÿ€Ï¿A"¥<::RJ•ei‹`÷Æx ïÚj_!º5Æœ}íG…1‰÷₫KU$ëĂ÷mP~Ë•AƯïô(~˸}x®7×uW+¥>đ5Mèê@˜uöO₫1†Q•7B/ 2`‹1¤±̃¶¶u­ëLǹĹm‰í̃lk_®_VPí¶»Ë‹KÛÙi:ÍE^¤!¤ém»­º ûX1Êr‘Oäd–Ͱeµs®éM³¡­MƯÙnÓnù“é vֵͮàb–̀R– &™äiÎÛµ»m³UJyë¹ă{ÉLå[wß²Î^n/˦,ëR·ºêªëêúïŸ₫ưywú´]·u]§IËœ½Ø^À~¾?I'°ªV’ÉZ×e[gÎËóY2›&SFXmêO>”Bæi~r}B(F0–ZÇÜj·Ú6Û“ơÉyỹÚÖƒÏdvV%,ÉE₫jóJp±í¶»n·í¶”ĐfƠ ú*§üª¾ Í1|hBUVQĐ&—98ØÑ]gºR•­n£@ d9Yf,ËóưïƠzåTxïk]SFQ !+9ÏSb8Ô˜†hB9UNm»íºYcä™»¼́Jb̃YoÇÀôÏ#‰̃ÎÓÿ+è;5jÖÚ®ëŒ1_I뽿¸¸øÚ)âW¿”¥¥$„_̃ûïÜiEôÿïi ă½ïº1]¿w™ß:¬µUU!mékÄM}sƒ16&“́v»?R—‰)?ûÙÏÚ¶EaÓÅbñÁü.Âü¿ï™†ïj ǹ—ºt(¬i­ưR÷‹’q̃;ç”sæ3ÔØ~,S·Ôîk1NÓƯ9ă™̀¤œŕ1¤¦@PÉ’Lá¼kTĂ)tôè`q°Ú¬_>_7ëƒü “٧ןîô0iL¼ª^ưÏÿî>»<û?₫ñÿXé•`âGËÍóù'Ÿœ”'Œ³ƒô`.çÎ;ÁÅñâØó̃Ù{—ơå£ù£öäŸÍ'óO_}9ûËƯåIy‚ÜĐ;ùY:Û›îṂɬ˜B₫îĂ¿û‡“pà–Ụ̀`r0ËfÛf»m¶×ơơNí$k­­ºªƠm&²ƒù°dQ,R‘>½|z¶=›'óT¦¡)’‡»Ë»÷î]l.~ùâ—ëj½í¶đîwïíß›'s¥Ơ¶̃~|ññ«̣UÂ’e±”LbS¿I:9YŸ(«Đ)§@;Óͳ9<Û<“\.‹å,ŸcZƠ®ÊƠUu¥œb„e"›¤“4I)¡m×^W×­i%“ERxđî´Ó( T­œ‰¹¯…$J)Ïçù—Y–åƠƠ6vüøă¿ëyư;nt’ùbƒR:™L!mÛ~qú)Œ J½sÖ†?l?ŒÏB¤ó}×̣[Ê1cÆ1Ài€ÅÊÅb¡µÆÜ6Zđ¯|ÑŸ@­«€/>‹Eù‚hxXw#„|ñ€LóüO~ücèº/^\®×€èŒûëÀ̀Íø•؃ùÆÛFÍ́}±5f2ỗ{»8#ƒUVŒ1îŒ3(ÙêÖ² K´Ó)­®vWº")å²kv•ª¬³)OS:ï&éDY……/ˆ¤¡ƒ³Îƒ—L*«®ê+A…RR (£€mŒ1µª8FØ4™F¹*m46̃&@ö'û­nwí’°Ä83M§Î¹T¦ m›m­êådÉ)wà6å¦1Í,›1Æ”Q„º«×Í:9̣:¼÷‰H¼÷W»+e'<‘ â8FYgºØê /̃¶¶ írG‘ ä§âµE}lrA"+B·”µà“hB,—˶mµÖ˜f₫j9NÔÀù(ơ›¥4Ïs@RÙùBH¦Bˆ/Ơ%J¿ß§ƒ/z!$éË~‘ŒA–QαÂë€ư!ø£¯/üÏt‡„±ÿm›¿í>Çg‚¦:ÛQB_\½­F=ÈUđÎ'41`rƒíVµ¨UJ mtÓèÆ83‘d]#”ÜXCRh£U§P’R95‘A’e+UÁb¼AxcM«[eTBI¥ƒ¸&F¡''¼Öơ,™aTS¹j]­ƒ”§¹dr&f uôº¼¦„rÁ±¹,8p•ª‚\•ûíK^Ág,sl¿đú½p̃9ûíaê´ÖWWW_Đư c±XÜ9>̃¬×¯^½úc¿Û’‹(·ơEị̂_}î¥RÊ.Ië¹́‡à‡ñYăûïúÇăÄ…0>à¯!Àöđû¢mÇïn»ă ”̃đÀă½ÿâÀë9È?ÂaŒù²×á+@î€2æ̣üœ ¡”"ư‹ØùV @¡„€ư,§öo&_èư‡ñ=Q5寋=k•Èo%˜1aomL3vús‘g"¨ïn½µ̃Br–+PHf @©£àQ1ÊNù^º§&„$<ÉyŒRI%ă¬³J&ưôÓªª¾ëÓüÎF×¶_ª€̣ÏÔhÿẵû¯&ûđö¿V©?GƯxÛ{ÿ€ø›Ùιäñ¬l?£w°ư–đ¥Ë?Œß«©q”CŦª ¸HXÂkuÛèÛÇ?9?>ªtơÑæ£u½¯?^<~sù&QäåơË‹îbgw•­(¡²G§îT2™A–BÚùnk·ÚéNwè ¿1ăÁâ¶ú´Y<Ù/ö+U]V—„ ºwÿ^ëÚ¿ù‡¿ÑZ/²…d²S]JÓ\äÚkíuëZe•`B‚ôΗ¦́l‡# É(U[Î!%à»V7†1¦©ë/Ñàœ#Öô»>đou8ç¾wñv‹ëëƠj…Ú€Đ~§ü Ă&­ª”¹₫¢ ûAôĂøñø8yçyî½ßn·EQ,—Ë4M_¼x±Ưn¿ë3ưö¥£ º®¿  Th+û‡èưO&“étÊ+Ër½^ׇ3 ‚̣>¤kÈ(=ăn¾Q@ư ÿª `E Ó¿é=_¾Ÿnĸ‡v\F¡tï=¦rc/XÎ8ê†>hجsΜ„^`œrg]gºÖ´íœw’Ë Ÿ,̉Å4₫ç—ÿùß<₫7;µkMëœKi:“³¥\.Ä"90èH§‰vàP¶]¯7ÍfÓlÓ ›.¹,’¢Å"]́gû{r/¡ !¤óƯJ¯®+¤Ơ"&[L²É₫lÿÎ́Hp̃©Nmv›ÓƠééæt§vÆ”¥…(îMïƯ™ßá‚ïôn]­«¶ª»º5-£̀SO Mỉ4e©÷¾4¥²ỵæÉe¹.ëºæŒƒ‡F5Ê*)ä¢Xܙߙ$oưƠöêéƠÓ›ÚiÁDỊ̂'ó'Ç“cÎymëJW•ª¨£ M´Óµ©kS‡vl4Ih’̉”ÍbS‘ÊD₫¿'ÿï¿|ü/ÓXo$4ÑJ¯ëơUs¥¬ÉÙ4™&,ó|eÙUwuƠ^µªUJI*S‘ &ZÛ6ªI“t)—\ñĂƒĂd‘¼Ú¼zqú"aI! NyçºÎtU[yï%‘’J ÚQÇĂ~´î”S¨Ùj¬Ihˆ#/ëçoÏ̃6Ô´¾Ơ ;Ó)«œsÄæ6ñƠ^·¦EaÙ83c‹n ÆAƧ¯H|)í|iN&¥Ôn·û"ø‡TȲl:fYV×ơơơơ÷Ä‘Đ3À{ @û?³À·̃¹×jÅ¤ß p¿øï’FàµÎ§ßè@ÊÍÇ?°ñ5TPù ¬µy&IryyY–å¤wû™Ă9‡n¿¸ ûƒ1â¯)e–e”̉¯]Ôùw·dƯüç¿ÍXóyá±ûm₫ƠF´°ßÚ¥øí‡D(àmơ}-Ă0è ²Đó,Ö‚j‰ÖÛßjEÄ ¶×Å~½’ËèĐ#̀w·ƯQB“<ÑF;ïˆ'Î;$ƒ:¤2•iÎó\æ’Jê¨w̃:Û¹N9¥½¦ŒrÎ0DÆ+5}m'ÉdL'r’̣ôÍư73‘…¶©r‘O’I‘©HaÚéÎt¥)[Ó6¦QFuª#LØ$g¹ƯÙNYƠèÆ{ßêvƯ¬gb6“³EºàŒ'́Ëừe5Ô-´ŒçÀµºƯTï}ä‚o=3,cÙTNµÓ ªªkª+[%,!0`D«ÛE¾Ø6[ç\&³{“{/6/r…Ld‡ÓCåUêSªé~²o“@²ŸïŸÓseÜŸƯ?¯Î VLå¬óµơ–áŒeÖj}äŒ3ʪ»“»¹̀q¥*½ó•ªu­i·íöhrtY^N“ig:Jig»ÖµMÛH.‘́›̉4ăYÆ3ÏưTN§ÙtÛm•Q›ncœ×êz¡”QADiJmôÖlSRJ­³ XB 4gùÁ́€MÙºY[gKSk YJ°»³6º±MKZ …̀E~0?XN—ØBU)µ«v«ƯªmÚ²)˶Üè2꺽¶Äj¯ó$_$‹D&EZàD"(¥ª¦Z×몫Bg_ñ¢´(£ŒPÂ8\`7.çœ2ªVuÙ•Ûv‹RH9Ï 6C §„&Ï$•H G<’kq„Hà#¸)eÀ°—đĐ"ÀC 9pƯÅÎÜßr€¯<8çi¦iú½̉ˆô7Íăopbœs´ÿ¼ùm₫•GLß|Ë.ĪÇ̣G;¾†àơr$₫øÇ&«ÿÄÖ+¾`ĐâœC’îW ê~ŸÆ·ḿ¾̃˜À^¿Ơ qà‡×ñNƯçà„\æø zÿø÷ØúÓó˜§8 Ÿ”SÚiÔÇ4̃„̀hߦˆ1&¨Hx‚àơLf™̀R‘J.%“\Â%%4¥UWµªEà{¥ªNuÚkp༜̣ 2Jh.r <o”W4¡„r¹­Æ>IÂ’I:™fÓLf”RçƯOrƠ\)£Œ5|KÛ­ÙevfG=5Ú4]Sª²̉•ñ['4ÉÓh¯±9kÛ¶ØDTzÂ’ưl&f1)d‘³|&fÆ›ÊV[µƯªí¶Ú^î.Ër–K*  0ï½’6Kg’ËÖ´Œ°Ä'>Ieºb«£ÉÑ„NZÛ.ÅË76Í&çy 5ñd‘/:ßÙ̉J&‹ăZÔH.r¡EBḱ„M~µúƠƯ›.¦+,<˜>pàR–:ëN«ÓE¶ØÚmkÚ”¦ûù>~ZŸ:ç¸à‡³C£̀'›O,gùâtwê©o\S7u&3FØùæ<Ù”O…t&²\æi’ÊF—çkµ®Tå¼KlR»:ç9›‹¹u–xB=MX2Oæ³d–DYµêV°…M¹Ùµ»ZƠ”̉‰œ¤2¥@±Ç¶[‰O$—Ê(K¬Le*SƯiâˆUÖv–3 ZÛîÉ=ă !„ÏI>“³I6™æÓ,Í8ăÆ˜¶mÁ5–WTyç0”|åŒ'2á’N™dI–ˆ„³ÖVmµi6Wơ•s®̉R@9ÚV6á“©œ¢ÈxÆ)'„X°Ê)eUk[¬Pak9ï‚8'!NÆ€™RêÀ =1À{â­·X₫2ÖXg[ƯâoŒÊ}c¾Øó;ˆa³ö0’XèLÇo¤RJ¾ 5‹;EÓ4¿§Îå·káÍú–³«X_ư–Ïô‡ñM¯ÙGŸN§‹Å‚1vyyY×ơ3æf!°ôE*Ø E¾'UƯïÿR¢œđëáWĐÀF©D°'PJÑƯǽ„.àû̃†2D8H&Ø€é̃̃=e•j•óóÜi:ê(Ê>OæËl¹—́Íå¼à¶¼ílWêr«·µ©M­­6̃„¯&;7B8áŒ0F"©̀y>ÓB„́»×¹®Tåº[¯ƠE}qV~vk¹e¾¼SÜ™ËyÎsN8!Äx£¬j]‹¼[ç#¬E!œç‰Hx vŸï¿¿{¿VuƯƠÚjçœ$2¥iÁœæ+RJ.)£yªƒ®²U©ËZ×µ®+Uu¦C©œ¨GÉă„K&Sf"Kx’đ½7ítg»V·éŒ3¡É1¡îÙ"a‰d’S³üÁô6ú´:=̀ïOî;æÎÚ³Î?Jx̣Nñίw¿>^OĤƯµÏêgo>ÎDvwr÷¢¾hMû“åOöè̃§Í§WíƠEsoL̃xÀÀ¼º~•$ɽ޽lïáüaF²‹öÂxó“ăŸ€ƒ«̣êåîå®̃5mÓ@3Ÿ̀+SnNÛǘ̃Ï&ṇ÷×·¸ûhú¨Ơí?ưS! ÆÙ/ưâßưôßư/ó¿<x T̃{m~»ñG4 ¥Ôóíô»ưœsÆØ9{đ‡ñµŒ¯9`Œa'đˆ úaü¾́™đ£wßÅååå'Ÿ|̣[ÍzNù†9}Ùù?AEHæQÎ L`eŸ\„ä„LÛøŸó&”S¾-·ˆ à”K&3%4‘Drà˜Ô·̃gŒ7ÚkÆzë‰'”pÊ…’KÎ9gœ€ơ¶s]cJW;µë\gE7"i&²Ld)O¨óNiơOçÿt<9VVa>À„b …4Bo‰ ñ!àÁƒÁ ;¼T/á¬sQÆ §„"v‚ñă‡ø]€QXí@Ñ"Y`óZ<…LfL2ª)̉ú;ƯuºktS›º1 âÂ-XO|øDB9ăŒ0N9J=Î:t¤:Ó)§B<0eÿPr™’4)¡dƠ¬8ăg|qVŸqÎ3µ¦}4{”Ñ,çùÇ«5è½tïÓƠ§?>üñd:y±~qQ^ Dd×íæyʧéôñü1iÈơ'Û“w–ïyñ×ÿ5åtV̀,¼wñ̃AzÀăŒsÂ×<]?e”½={Ûy÷ó‹ŸW]ơg÷ÿl]¯s™w®KyúÓ»?-’â“‹O^?}8{øÖÁ[Ï®Ÿ½Ü¼œ%³Öá >œ=$Œ́Áắñ₫ăëözSo8å $×Ưug»WƠ«R—•©”UÖ[  ™Lx’4iÂFj­UF5mSéª5-–q8¬ /–…’ :°QXF`À0A‚m¡o!8…ZƯ–º¬Mm½ƠNkæ¿vÚ:Ë/d1“Œg9Ï'|2Óœç’HÁ¥Ôoˆé|ר¦Öu£›uXoq c¥(ö’Ă–Ơ±¡AÄËa0ŒÓ©·S ( ‹í„w!~ÆùL€R³„'’JFñÄ;ïŒktăÀayÄ‚ơàq– .RH)¤ä[ª£Ù±Öb_e”¶;g7¦éL‡Ñ>ExR¡|Ç“”¥ K$•œpNøßœÿM^äÿ₫/ÿ=ắù‹çWWWسJàZ@-<#\ÅxMđ ̉x~đq_aÿYûaüÎăkî€p d)}×§ö‡?pK€¯«›Áç BÈááá|6û‚HÍoÚï̃›Ï`q ư>ûÇ1²ÿAoA_3TĂ{h;ºs±8À-„Q a/'üặcä§‹ŸRJe!Ú¡àÁ;êÂ~6üó¥ѳ'>HR á€P­¦p'¤ñ˜ &g|’OđL9å X! I%nÀÔS£‹£Ö^+¯p[ @!€ d„ `'&UN¥J)åŒ3Êđo,bG¼G‹GŒ¶ÚÚPµÎ"x=L ç¼÷XQ‰¸& °5‡¶:hˆ9‡%DŒÂ!C„†?ÜS8áƒ6î˜>Dª±[Å­'X™ŒăxFD‹Ï=ó;Ü…ă:Ä΂ßtúü›I’L&çÜn·ûFW„ Î7›ÍƠƠƠđú÷Àä9)D‘‰,¹dá°x|hß1ÇŒÈcí´2 óR±‘²Zcæ̉0̀ˆj67¶+,ß“P¦ä)]È´¼ÓD%Ê–ß̉ñ „DO¢¿‹ùª̃ѱÎ.̉ÅuóÛ›Đ}Ù»&¨HEê½G$¤$! 0¨¸Ơ'T-ú«0@›^?tåÑqÁOGd ̀CYu\g™ˆIÆ2I¥d’#>°ëµÔ*L×¶̃é]iÊ­Ùî́Îú/Z|Ÿ%³{‹{ólÎ(›çói2}kï­Ld ºxU¿b¯½ƠV)Ơ©®3Ư4¾=}û²ºü¤ü¤uí®Ùu¦ûgûÿ́/ưå©?=+ÏùñÆlö²½—åËZׇé¡OüOÿ$…ôưó÷Ÿ¯Ÿ¦‡Ç³ă¿>ûk 4£ÙûoÜ]̃uÚmv›¯><Ȩ¥ø®éˆ'É“çÛç‡ËC ̣0;üđ̣CÉå_Ưÿ«M³ùơæ×ú¢HV´`àU÷êƯƒw…­iƠ₫ÊxóÖâ­?₫±uÖ•.åé§ơ§O«§G“£)Ÿ^ŸnwÛÔ¥B‰‹úâ•zeÁeGw§w§r:Oç…(>-?ưÎ₫Ÿ­Ú₫tùÓe²ü¿Ï₫oNø×(£ĐµẤ>àÜL Œ~"&…( Vä,Ïi’T)@PO©§èâk§;×u¾k}[Ûº¶uiÊÚÖiˆË4„ôçp¡Ax ®ëràœ®¿5X̉N7mÓÙ_‰+÷Æl'ƒOæ¶s¨alxØ_Êô ă„8ÄDaCC!< ©wăM–g„‘ª©våÎ:ÙÀÁ«&Œ1K Rèl€-êu¦¯uXOo§<ÙƯ£»¸ª•W^P!ˆ @CI3Ê PÉÈá5 ¡J‚¬ê€rÖx‹ÁZ:¿syx"1§Q—‚N¸ ‚£R:ªÖYí5Æ6¡cÛÎt¯_mFYÊÓLf¹ÈVˆB€°̃.óe´hĂ1œp̃)§ĐÔ+«´ƠÚk´ÿhùcu%¢¼BäàoÄ„Áú!jƠïCJî‡ñ{:₫H”^Fơåívû•û¿oCJ™¦©µVwÚ9‡EX:Ô>ơBz¹F̉·5̀ŒƯẢ§ÖÇ?b’5Ë2F™3ÎZK(ÁÁëŸ^}Ê{óđM„º̉€L ö-—ñÆYgœùàüƒ{01cm¨ÏU&‚+Ùï—ă>¬ñ Ç1OŒ¾ ~]È~áîácBÖ§•̃êßÏĂL0º¡”PI$¢r ¶ơTLi ­ÊhĐy¦#°¾đúN,ˆí·À²}øˆ&BPê7à#!‰…ôÇà4@ Ä2·q†RjœÁS£˜đú@Ọ€pÍưè÷?»[²u(̣Æ|›6:MR)O«ƒ¸¾éZÓ¶ªEb@¼Â·ü~DS`»Ü„% M$“’ 1ơƒçµƠщÑ^sÊăe§ÉztxLüc/8 ¨Ad J£ åïut$“qÂxçc}AˆNïÄP@L9ê%"ID‚F‰H8ç\đBódN ]N—­n?¾úØY7‘“\äS6­Ûú¢¼øäê¥Ơ„OóĂEºØÖÛÛÛv+™œ$“„'³éŒx¢vêưÍûÿĂŸük½¦–₫_/ÿ¯·oÿÅ£¿(²âWç¿Zˆ…7₫ñüñƯânEªóú¼RƠ^¶·,–®>œ'sAÅÏ–?;*₫qơ/Ö/6v³œ/—Å̉×₫Ÿ₫CÜ÷.̃{gñÎÏîưlc7ỔU»̉ Á‚e¶S?I&¯v¯>ºúè0;ü铟œŸ¤‹÷6ïưù“?Oi!‹ƯơîW'¿Z5+ÇƯ;{ïóăÊVåÅW4¦aœ¥ÑJB h¢t\Æ çIø:B02AÛ‹0~ZæP îí•$’zđÎĂÁ eI ‹ƒ8¼5QÄi,µæL"†ÛämLZg®Ú+(D1C¼s₫÷2ùĂøÇ7ú₫ÉḍäÉ“ĂĂƒëëëO?}öu1ñ £TÇ 4²DQd}ŒwŒ.)~>‰ï:Wáoåœ[g]æ¼ó O°̉”ẹ̀ÆôZíàØyđ$8 ”P•ÇÄ€8aBB GtôïLïPB'r‚>ëà°BØ6‚÷o 6êL‡™ơL̉ɦƯD·|œ? }X t.$‘’I<¥)§œç„̃¼¾‚0Œv%á[×g´×ƒÓŒZª½8 6zˆƒ_<Ó-ï½ïTÇàreôPÏ…Ụ̂¡10Ă=)^¢°EÑ Yp”:"È5@ ̉KZ™yÆ™6:RåÆù0êé­='̃ë°÷pˆ˜TĂ͆q¾\îYg×ë5*ô!‹*:™̉Pøæ`y¨lDX?º™ñ>úB‚̃;â ::†O¼£c0œx¦8F^^G`́D¼'>ªÓbonL³áQ!×9ÔXú€O §7±»†dÉ¥ Br)©äŒ£Óưªd"›¤“Y:+d³3; ‰́0?LeÊ%~ư|Ûlë¶¾„KIåaz¨ưló́ùö9§|²œˆ\4®¹Ö׌dRyơIù ¡$SöǽÍv°(ëơ'ü₫̣>PRtĐ=Ú{4…é§ÛOOª“Ö¶¥+·jÛöÅîEÎó¬Èóc^óÓËÓ—«—{ù·Æ›Y1ÛøMCZƠ5© ^́Ôî̉\.́âo.ÿ¦rƠ»³w;è¼ồ±]·#œtMg©ưhóѧ»OgÉ́²º|V>[Ơ+ä¼>ÿđôĂ´LÇơº¾Ø\pÆ•UWíL¬ºƠy{nÁf4³Ö2Ê.ËËÚ­›5"µ{é^&²T¦Ïœv’₫‰d²ƒî¤:‘‰¤’.‹åÁü RƠéöt«·ëṿTY…¸”VµU[­ƠÚY}£®Hºˆ=ư¤ ¨zđB/3/|D„£ă½¼f È÷kD[4^ q̉ƯËî±9/Wåu{½«wÑjü¥qí ;:Í”#¨ „¶>~‘ÔĐzÈè=<œÀè:w®«MäAYĐ éÑ€ yDp¨E8/¼@ë‡Vn°œà0ë-ºïà‚M‹]h°æ€‡ÀÏÁVŒ{â«®ªI¥E"Â¥L€K´³áú†ÂÈh’T¢©— 9đh1̣wÄ0HpÂÖ­ik^ת®U-¨ˆ†[nq C̣=j1I&X?a¬—€0 °Ô€ŸÖÙ®qÍ€̣́@}—{Ueï<̃î¸Ebˈ>-XÔèàdĂ 0|iÜ;R 9ÍÁu”6ä}ØNŸ¸ÿdL1¡pMH7‚A Ê#Ṽ™4É–÷—J©óíùVmû,($¥*r.‘§X*ÁÂ1k÷1Æ3#!td³ÈƒD 3#ŒGA¡aR”K™9¸ ú·ÖkŒ7Úh°`íl‡¹@åB4‚ß₫›MD¼ă¸C#¢¬>¢rhÁ‹B K,±œrÁEä³dF=Ưêmcº¬9å\đR—µ¨KSnNmm©¡­i·fëR×–íyy®ŒÓ;Ó;‡³ĂƠvå¼[ÈÅ₫dß2û´zºVëuµf„ù'½C̃Iïäóü̃₫½“ơ‰w^iuzßƠÎ9w®Îk¨Ë¦tÆ­Ơúlw–³ügo₫Œ¢•ù»³¿;U§ï¯ßëđ­y2ßVÛ)UƠ=˜>ØOöa{r¯ƒî¿œü—ư|ÿÇésÈgÙ¬îêçëçEVxﯻëÊT\đy1ß•»ÚÖ×í50(xQwµw~íÖ¦5ÖÛƒü;0¬ÈªpEc›EºHd̉˜¹Ûv»UÛm»•\zâỪ“ùTLs™0TĐq0åÓÎwÓdZ™j.çó½qo~Ï[¿:X]uW'åÉ<™·¦åœ;ïê¶^íVj¶j“Öhư"¦Î{O=e”q`3Nùkp#”âW" ÿEä^«Ûm½•;ùệƠª\5m3æñ1-‚å&„ER{àÆP3A½Ë×køx‹yn<’Öµ¨Ï^yă½k!xW½!Å•…5úÖÑŒÓ~dIyđ!8aóD¸̉nÙ¥PœEY\kÛÖ¶Á®ÂÀñ̀€Ûñ~¼âT€¥¼ZĐDR™DR‰¸îy¸8Î;pá ă'PF%‘ͦlªeO²²=ÉÊ\%܉1ÆwŸ0ÆÓë3,¦«”Q­i•Q­nQÇ i¨öûy!3 &0Q…ö 9HÄÚXÁŒ›o0ª´̃AùïB$àœ;H‚ëïMŒQC2¨w¸ÑƒˆÂ¯tĐ¹è«S½Zä¦Ç›ÉcĂ|&ŒS^Èư„P|cŒQ¶˜/œsçççZiBHH2F¾³€Œyí˳ƒŒÛÍíx ^ @'r;½{1®ö9ÄÑÛ|¨¾‡}gx́·Å1#ÀǬϤèüaŒ?Ø âÇ‚0ñÑiW®Ë ¸<{qÖíº‚Q &zo¸x”¥wÓƒc×£¢c4&`á7¸\cĂ@À8ƲÄG`èø ÔBƒUˆÓÚ…(D`¿˜Ë¶ŒĐp\Hœs­4ÖC2É:ôö¾̃ ñ,Aîåó2e,KyHA¾ %Á4€Å¶MëÓ4­J̃hp­³µ©+SÅjFt²s‘k«‡l÷ø‰¿q÷C™Ơ—Ù«X ­çcáaUz\ wsĐỗç"¯Tu+31F^mLŒ́‚'*ÖXkƽ0hÁ ïX9ÊÎ é›̣‚µÄ"6Æ‹ÈZTÅü ơTÁ9|rVŸ]êË×/ˆ!«fu¡/~ ¿¼7¹÷VñÖöƠê•ñ^ỡ¦ÚT¾z|đØsÖœ=*WMÉô^vo_́ .®ÓƠƠ§Ơéeuù—ÿR2YUU·nßÙç_?ù×ÖÛ—/_¦4}ºyjŒygï‡éClûñöă×¾Í߉¸.¯ß9z'áIç;kí,›Ư]Ü=Ü;\·ëGù£»ÅƯçÛçiD.̉,ÍHÖùîí;o¯·ëY:û齟>X<øÛçË ;oÏ'b²H;¾;N¶Ưöº¾₫ơ寭³ KfÉl#6)M©£+ËÇ÷ưư£̣ˆ´äÚ]SJïđ;g9áÊ)Gç\.$=¦&NƠi"O}mëm»Ư©]kÚx6:”€œÎö™È̃ƠÙAB œu–w̃I'£6è¶RJëóú|wawv!ÓÉ´¯¹@ #‡'Â9áÜsæל[N4qÔju¶tä2¥i`»ö ”èºæ®5ÆÎ.̉œ"@¿Ó6ÀHx§wصăó"øQQ4¶çĂp%m|gÜ_Đ 8ï:×EN-‚^đ I¯Ï(Cáă°®™ÀŒ{¬Z„“„ÓyWC¾ MPø­tA)S9ä ¶L$÷œ{*Äú7Fíµ­@)¯ZÛvºë|×ø¦³²”S­mCÎȪß@+º5eÁP·ăÆÂÀñˆ»öđ©ÁöL”ˆY$—¹Èñ̉E„¡zÓcº‚ ­Ơ´ V[£Œ`c̀%R‚=GèŒâgXÑÉÁđO0‘ˆ$;ÊVÛ“ƠI§»`ä;B¨`x£Ö µÑ‘ttí˜ &exQø_ÿkFÙ/¯9†ø̃ØÇˆ;ï·?u_çûjp”F - g¸nôø%):¿ă›å iÎ₫Æë1¿Ư¿ØV P¦á·}É +¹} 2¸Đ³ơCGÂ"%¦T¥y–gYV×µVËv1g?®GŸ2Bt7?'@6ưp´˜³`3ù±úÂcbư1*mD·8âáuùˆñèƯÖÎ+’Gû¯ƒ[ƒïËx0dưǰ%èÅă†Ï}xd‚â .p¿äŒ£DwđMÇÇz;ñÅ „¬’³ÖÛ˜$@‡íĂÖBYJî å¤&$Éi.¸àœ?˜=8Î÷³}ÁDkÛÚuº“T&,Y¤‹4MÓ4ƠFo›mÙ•;µ£@K["êsXøBVI„SÆÊê­ưp€(ôê1QGưJ)a¤ë:̀4ø°H1Y»{ĂaSaFX–d‚ £VºOE†¥5̣1z 4À¢®¤92x3‹MëM1¢Ñ¦á{}`„Á“ˆ cfđt»wÑp !ÖW0 ôÆ·ôÔ¯ØÛèeF´˜½nÀøJi¾ă=º°q[»ƒXÜ_Û~‡†ñ¦A;Ñ̃â –¶rcealq€-œlÑ.{z4ÑxµJÇíƠ^ÇđÄ: nFëEC1á«á³®vˆ™Æ›₫:Œ«Üzf)åŒ1¬¥IȨV ¾Ađ`Ø?Ü¿wï^ƯÖ|ôÁ¦Üh¯ĂVèú'ư+H¼1ÖÄă‰s5î¿ăsǘG0±—îqÊ;×Åø8aaZC‘¡ÇÎáêø̀ @¼ï¡D™ä£è´p̃5®‰ùÁ0Qụ̂HX§#NƯ›ñ’{b·¼²÷1%¾IjŸ$ˆ~y„-¸å—G—klGÈo‹Ɔ üH°½ÍèÊD»5m.óè)ú¸ÊƒO"7n|/ïƯ_G¼p1äˆp°È; _N°4Ăƒ1ư+|8t¤0o­apøD"¸àÚêơv­´² ̃Ă(<¦Ư­ÄÍ«ˆ™QB¦1â½ËÁHơ<\ N™]Ïpù—M6à́uŒX#DCO†fe´PçÏ{J(®=<…è¯ăg†â N—D¦"½ª¯fröỊ̂E¶¸n¯§b¡F7Ûv»é6«n圛‰Yị̂)6¾iH³vkÀ„7dâÉJ­„¦2J+m4îú)KSH8O½w:ê‰oM»Ó;Jie*t£±,‰[ЧB–ÎØÁ™&c̀x§GSX³†˜Ø.úă]J ]&Ë”§ˆ3‰¿6‹ũ¡§ơÖÑàeb}óÊ–XKú¨B£=?º_́a÷&ưÆZîÏ:ØGĐ2{đȃ÷Î;êPx,6hµ0¤xâ”ø‹ùÔS ‡:   í~c4tÑÅ=•Á‚ÿ³Z£‚d0ă£ÿ?ÛS„̣̣ÚLOB¯ïÊ2ö̉â„Á©Nàg"wï%àa\Ï v.vErBŒ¡C:̀÷̣²}b”^Äe…(ĸ̃â)ÁH3£T¥Ÿñ,F†Ñáa„i«Ç™ÜèÆ 9„ #₫gËø·üÉ̃èczÔúÀ¤à­txÀöÁßå=Z½c³ø:¦Æ£/s$ŸtfŒµl‘-ûă°`iÆÆ"–#ƯĐA0b]0 ó!$}«&cÑ4b >11T]{4[€÷¼Iă DpPZa@ăƯäơÿ$Çir{w?? ¼‡>}a´°ÉpG€¤R;};¸ê]ÿàë€qg,Ư3ÄBưÖEÆưhđÛ‹ØÁH“•Q1Oge¼ÁơÆ1ºÔ AF¥Ă~ E÷:*ÁÅʳz—wlñ¼r|7‘Z@—7L”æ0]¡¬BxRÀ÷ǵàÉxŒÿÉ `q’£‹ßĐ#62¼oî̃å¬³ïÆ…₫qÚ&2}ăYD¬ZH.°Î”2`ñ 1ăÀ“½Åd^­Jô-")ĐKœ¯ÊÊ:Ë)ç ǘađzAîA£ƒzC$´á Î:ë:Ó =P{-E\¤¡ SSGă0̣K ô₫&"ÉyñE˜̣çŒç2OyÛpH*Ñ¢iM»S»Öµ4aÔ¤î KH"¥œæÓ‰››c¬53ÎđOª®jU  _dEv ”S™̀¦ÉôîäîỨî™9;ççœ̣(;êTçœKU©̀X³Èò̃ÈXfÍE>Ïæ1^pÊ ˜F7†cyüdö%ù‹¬x <̉¶íÖ€™çóD'•¯D&r‘/äâÅæÅ?b„2h¢ÂÉ®ÙyîK]^í®$È?¿ûçoƯ{‹ VvåesYê’Rº‹;ó;”̉º­WƠÊ_¤EëÚ“Ư‰¶:Os‘ˆ ›°đ&ovíÎi'˜ÛYT’-My¹½¼Ü]¦I*&Â;49úÙŸ½¹|ó×׿V^9纮SZ]××§å)Nøeºœ&Ó"-̉$u•¬DOϽ%W â¶Ñœˆ‰ "'9~ˆ2Oxb¤ÉT†G…0¡Ú֡ă¶4Àr`´ öæ4nƠqs ù́ȶ à8ùzk–ƒ<Í»¶kÊ¡đÑư Ơ'àC‚† ‰đ°ÄX¿ñơ– †# XI1Ñ̃oÁĐ÷R »Đ[ß#QªÆ;p!Íå?;…P¬·ü®˜2đ7̣‰ w-Ä“©5”FÎFÈưc£ƒ̃'=í*R>‚¿:¶‡˜—₫̃A¤¨ú×ê'·<₫›øF¬í ™„S.‰ŒAAƯ!f|`P”Æ3s#fBUǹˆÀ¹!u胑Nè¸z0Ôcû‹6@o~ô ~|¤„R7¸à±r.&¥Ùƒ\N“]¸ưeÁ@ ôZÓ+¿ơH eÀ”…tŒd’sưCé_}c‡1@ &₫B—Ûw·4:ˆ«ÆdQ†áÄXVơ–ß È€®Ô $FråC`FM±‚*–ª"¡#œ‹½ÙµÚ÷eöx©{ú7e„!ï96A´—JAÅ}î́U·²`g|C©àóxË oLc!D !é0ö nB‘q] .Pô€ä›0±CŒß¢à€·I²)у́7ª0k]„Uº…}{Úh¿†`&æE|O²q½|€wÎ:ç¶ËÁ’\¬ÊƯR>Ø?02v}æcœ ˆ1”ú3A¦W̃ÄÀ jèxåmTÜÇä1~ơq"wñ\æˆfA±ˆ8cvÈè÷Ñ‘k{÷g­­F±đĐÄç_ÙÍ °™¾e/'ÜYG\œNa&÷ixÉäTLrç,Ÿ©Œ’4Ă#íI,èơQ½ë5éŒ1c1Ápj½ÖuXq}·eÔç¥d¾®Á)Ç®œsÎ9ăŒs$I!‹”§XỰà•Ss:ŸÊ)e4́̃sÂS–.ÓåB,˜g;½{Ơ¾Ú¶Û]»³Î2ÊfÉ,å)í;pk­wƯN{]›º1 &r2åÓưÉ>!¤1ÍNïŒ3Ø à¨8Êxöp̣đé??º‚«“æDwz*¦÷̣{zđ§1Éi~V½¨^pÉÿjÿ¯º®ët—‹Ü3æù<£ÙEs1#³ĂéaÊÓM»9·çwØBœóưl«¶Ï«ç31›íÍ̃¾›ç¹Ă/y±-0Z{~ưüUơª`Ž齃ô`¢&wfw~z÷§Ê©$IØ”QMwfWÈâáô!ç\ I(¹¬/9åót¾¥ÛS}º©6—ơå^¶·Ÿ́f‡œđ+uµ­·;µ+U©̃Kọ̈"?wçmƯ¾süο8øó̃øÅé/^”/´Ño½ơh₫èÍå›{é̃¼œÿơ«¿^5+¥Ô"]ä"Ÿ¦ÓB‚ˆLd™̀(§TPK¬‘84¶¹¬/+S¡@Ó›‹7̀xâO7§«jµ—íµªe” /®qạ̀4ßÏ÷³,ÛU»çgÏŸ_=¿ª¯®Ûk̀› hÛö)«B}́? ƒxT@¾á̀ơ­9Æ` µy±à.ơ%ç\)ơy1.<ÎXÈ ăQ ¢8äP¾‡×Ơxñ†¨à&u €ÚÍ1 ß[C½®ïp’â±Û?¹íOCrĨ#B †êtacvAGăj<ÜLQB±Yô.0¹/₫è“Pc¢~xÔ GL`w—ÏhđBû.“½,AȇB¸¸Îwtáz¸¬nwx ]  ‚óÍHĐ>³ëƠB½„®éMl6?lXOrĂưủIq€ÇX³cĂ¡bçØĂŒfWúê´:Ơ*p!bi=æ Ç%,,áƠˆ»¹%V=ˆb#F€ăʸwk0θàd!÷4º•Ñ¡“?Îÿ¸5ĐÇơËÓÚ°…¹À#Ç=Ÿc?z‰clF‰kvÜ0..á8͆2 aÙđw̃;p{é^®p!äF óû$eÍ x¿dB9º¯t@½¢₫Z ă ykùúLËưåt:µÎ¾:}Ơví¸î9¤çQ§œ ÂR¯·æ¾΋ 5b¨¨}/ŒØ)â¿]¯3ÎæÆË„w÷ÆAbûwÊ"y—Ñ ¥ÓĂ ô7–b€ˆDHŒ́ûCB¹}‚$HàB¤\pBˆÖP:“íB´à€ …ãx6×–Yê[%—cî¢zLƠ ™{Ä7câÖ5«r´q~cßß±´&ÇÉô™0}ACNÆüư€IDAT¹qz῭Ưékc¬$Œ²ÈñI´bˆß½Q_#1ƒ 'EüÄ“QÄ5® OnNƯ¡úAn¤CBùeTζĂç*NjÓ»¿åöù$èå#ái\ï₫Œ½ Iè ˜@®[|%¬p2àA£̃Èpß{bÀÀ äÉO’$¹¼¼¼º¾ŸZ\O7喝8®Èà~9‡́£11=ú"Ë”ÑZ}Ưï#ñ¹ÈçÉ|‘.Éb)—3>3ÎäᓌgÖÙëöz«¶J+eyºÀ¿·wï0;\mVŸ¼îÖ{é̃“Ù“E¾ )ƯÙƯy₫_~ùâ—ërưîÑ»9ÏŸ_=¯lµL—w&wö‹ưI2¡ŒnơVUwµ5–†a'ÜXĂ GN…ñFiơ¸xœđ„'XgK]î́ÎăŒ§2j®Ëëu³F(ÑÜ;(fÉŒ8R«zë¶:cL©J f:ÓµºEơ°[¾ÅÈ•-™Q7âî5ƯC£YlûE0„#*Ç ơ˜ª•Æ1¬hL`x[“D=ŒÑaG8ß°$¡$ cxăÇQ‰uŒB Ă Éi?âND—+a›€!£KîĐW‰c>.́Â0`±ôƠ·l5Ü»„‘¬gLÍD¤€s®Ö5§<îV7˜£ùF4BÇ+mFDDÈ₫•Áw",vBÄÜ6xÆQ#®o)ƒN¡ë[÷{øÀy ×¼Gc¡C‚Pgè)R1q1ѲÑ@àŸÿÅ?ß?Ø¿8¿øÅßư"î¡q2 P…¸¡CßÅÅ…èbØGx¤Xâe;xª:a÷ÙàI¿åyF Z±·¦Áè¤bàÇú§äæ¦<¹Œ!Uщ¹°q ‹’t„7шßtÈÈ€À(0¦ eaÑÑ,Bép€ÈTDyÀÀªˆTôÎy—%Od‚?H&eÄh@w`À 8B̉·N`LtXözŒƠƒưuƠg€º I4ÈƯ å˜è›Ñêà€ePF˜$̉1‡“U€đ´ £#£6¢ó_tÓ¦Ó₫TPMX°ø ̀ é;®÷‘ED¥„¤¢ù€> —**Fc'8XèÑ-lPíDơƒQ·ÔHrǸ¬`0ÏÅ ÏX 1TÖÄœJ¬mÅ üq1€ 5"èơnfC3®!ºơzTv̀ëØÔú₫vܪ ŒÁ»}ñÍ1^íÀv d@̉áîÇ]3æ±@¿[‡ọ̈ăƠ˜Ø@ç3¡PĐ‹rB&“IæÖÚr[[iÔ¡Q£y H€LúÎkqÆÆëŒ `AÖ‰8àaÑÙöưwäôê”RÚ¶mç»U¢5ŒÇé¼íô Ö€q}£ÜqèîüÀüWđơÇH<»45ÊåS\ö—ê²Ó`âhrÄ /]©”JÓ4•é®Ưaw­Œfe[Zcu’ÉÄ'̉Jà°Ëi2eÀZƠ6®á”ỎI:I3Ơº¾¬/ˮIJInsßzéå"Y`Qn£6„¥Ôuwm•=N¥‘à@•$‰pâ0=¼Ÿ̃— IC̉¬»µ”’x*± pç"¯U½n׸X9å¾á†'4Á¾ö✫ºj×í°íÀÍ&3Gœ̣zj¥­YM€Xn9pRÓœs¾—î!_|gv;µ«tƠ観¦o€•á3œïˆ)yƒ¿ÛÜ@* ¸Ä₫…q£ è—U‚ßœ6ß'¼Æ92Ü(K̉»1 ‘ôE‡í5ú¾”Fuđ_ɶ»czƒ‚3ÈçnbW^ă µ¿Ñ¯cŒ¨Æ¦áøÉ€«kr3²tHKNl(ŒÓRιÎuh” ¾%׸Ïz /ïâ4¸Á@#7₫Åhjü†`ç)‹ùZJi&³D&¨êTÜ\ÓèRN(¡X=ûă}óÆïw4ÆÙ̃P¬z (ÜäÂƠµÙ™ín›ú¡Să Œ·…ŒT=nà½o8»0 Áđr 8đx†:4†ÄxCEopÉÆ(2b¿đ|„\f€´ơè¾° SĂåí‚!ëio¸–]OÂŒ1UzrC‰o^/«O¤Æ=^ÎĐ÷Lđćŋ×́G+xÄêFtÊH1m•®¹å4‰‰Lœs36ă³t†ß̉T(á¼[$‹œæ¡”fB—Ä¡,‚é^p¨i5\ú×¢™t<¬̃ï‰/’^g :” Zøt$©¡åS&D$hÜ1u"ˆ|¤Â‰«‰©büøđ₫>[@ÈLÉ ,cLưôíTÆÓ.ù¸ªă>_ăăD́€!Èé‡ïá₫Ăé£g̀»3mPç£([ˆD{×{Ç."éăÍî-RH)%!¤êª e:8²ăX|l¹â,¼±ư¼Öø6~t”x‰—ư*7¬Ö˜9 ƒX„äÛ‡p úh!J‡ơ]Hn;úÎ8ëôĐî¾µÖxcMÈ|ă," –qăd¸py¨Úö…~p‹ºqØ=0NÈèC@ŸĂh 1µ+ûC!Á.ØÈ¶RURB×»5̉)¡ˆæŒ±}ÜÑY‰Û@”$¿[¯Ä=̣7¸ơCê(æ2aäïǰyÅWä0ôƯ¦17†“e% ) ¼,̀…t†”2eiƠUk³®M}Ù\¶º1™ÉY! )¥£Îg•«˜ ­–PJ5èF5`1Eó|ÎßÔßzkm«ă)BŒ2Ư+î°ƒ™œí̀îÓæÓÓêt/ƯăÀ×Vëº!MỂ‚ôʬàÊ\Ô'«fÅKv‰'~–ÍÉÂXă­Wơ½º¨.¯Ÿ×ªÎ“<-Rk­n5’q5Ñ­nkU{đI—\–—[³nîÄ‘míẸ̈åû×ïïÔî`zp<9Ö^ƒm´¤r»Û^×ׄ0Đu"ˆØËö&ÉdU¯ö²½T¤©K7í¦Ó³N¤4Ôm­½NEÊ8£„δª Kfrv XÆ–byº;mu+´(벂2Đ$¥éE}±m·Å®ĐV;ë¸ç÷̉{©O·j î.î2ǸåỔ®í”R—₫̣¼;ß›́Í̉ơÔZ[©JY¥œÚ›́m ®AJh&²Óö4á '<ÎÙLcyÙG \¢àœƒ‡ZƠ—öR)å´ $“€È ©ä‹lÁ5÷ÜsÍ¥– ĐV0Ê(cFY|đÄ…>8@Đ[½±´{YO\׆†lKH¦úáEè3:Í’È„jŒÖF“X°o± L̀}:7$†ú¼èIĐÊ ôF{)t^Qü q‰Œ±I6™S¥Tµ«b˜¸§‡µJÍ ˜{Úƒ́¨7Cf %Vt¸o$%Œa¨ˆ#.nCQă?¤Qû "́=ÙcŒ)W>ª;Dü5bîK¾w{o•@ÇÛë¸ös=èƯ9º³Ÿí;ëO/O"<cưËbƒ¾\À,ơzÿƒ(SÉ‘ á ü¡‚ÁÆMTÚ°̃’–tUG 9ƯF²aFơàa÷'b‚'ytØP{eƠ˜ơÍàĂ…á¨ă¦Đ8̀å‡Â~ïß#́ö­µ‡* bÚ±8J $úMlØÚÆß+@pà8`€¹æp"nD%‡œñz¤€Í½.ög¦iD<›‹¸xo¹ß1ëí½Ÿ»¹§@ñŸ¿øùz!7°\´¼'„¤4Íh6È~Åù— èШ'—D¤Íí¨´7[1|D¿iX˜b¿!Ó›Ăá́±ØTˆÂƒ×Z7¶{®¢4’” P´̃>FOt˜cí-p>·Bù[A<íI1Ä¿åîàa0c|;ôzR·± J(AF`”x²#=|¨îôÅ|/'?¶DăRr̀N‘N±rLy¿‚ gzoÿ`ÿ€Qöá‡ëJĂ–sk8̃ù¨­ëoloĂŸŒDEo¤:`Øl¢üÙ`IàÅÜé³Ç‘Æ %4êMp¢Î¢ñH3½‰·}vLJ¨ ë9xhLC c,ªÂ€Á§N„̉wï½{ï₫ưƯn›­3mtH ?(ôSÛ{Ưë1µk¼ªÔçµÇpăIL ôÜa'v½ÖgĐƠÁ°ßpzÖ|5-äpû¢€éï਻Ùp=„4"eƒư"4eiÆ3É$¥T;Ư¨cÑLfûÙ₫2]&4q̃5¶©M­œ"´mk¸IótO§É´HO7Ÿ¾Ø¾Ø©ƯÚ¬Wf5GË|9M¦‚‹JU;³+M¹‘›ư|™,3™ ÖØZƠmƯBŒ3Ø|Ôy—Èd–̀§Ç÷ç÷gÙ́ÅöE­ê—êå{Ơ{`Ư®ºƠÑ́h²¿jVe[̃qẃ?HX̣|ơü¤WVáêă„ß›̃ÛË÷,ÜƯ¿Ëḯî|s~¹½\•«º­•QÖöùàJx́ß [OÿʰŸ ‰ùSÑă³§ÜỚ»wïBW××CKû7Kÿ7l5ô‘¨đ:]¡ÅGøîâÁgùcÑ3:¥RÊuµ>½:eÀ26Æ¢Ạ8È$°̃°÷ϱ}½LÂØXIV±aóøt°äÍhui ̃럡†€€½!ÙoV/¿A#c]ù°¡Œjø×̉⓸÷aCF<¼·̃~̣£7¦ùûÿN)5vÇ~$†»c^ØH‰¸dN£9ç4°£¸äWÙwh‰Ù42‚l ‡YÆ€‰OŒ5Úè:ßHÏ ·&†¿i>}Ö‹đª1˜>J—É0´WơÀĂ‘¢ăœ×¹.êƯ mßq&+N¼¾ÆÖ·síÉåØÙ&btñ`Ê¥½w4̀±ßk„Nơ§7 ,úz`ôô"m2Ü܈»z©•ñÔ‹h.!ÚëˆsàvíÿwÿƯẠ̀‰ªá}*Â9çi¹‚ƒ̃;å Iß ₫@öêú¸BÆ«eđDcëb5D0§Ơûîq½2| ÎÑZJ¨6ºë:¸)tEüæ1̉·A˜M¼—·Ó“7 FñmÑm ¥;ª¥úÁϾ­Fơ¼¼€g̉áêyç½øøád2Ư•Û§'OÇîûxåÇâí¹ÂŒ²’¡PÛ»́–nD3(ÏE£Ï"ÊĂƯY–å“\)Ơ¹NÁz̀áfùÑÍê—n¬Œ}ú1\—Đá@eÂP@mtÉz…¾h͇Ô5nTz$Ù³]OJ·µ…”!â<"¼`Á•«c ×PXñœcÇ‚ơܯư¶t×íVt¥ˆ ßF’ă k8Vh¨9!Po zÜN˜¥Îxk*Æl(¸Pp&;o<¦"é)7ClÆU+”´V‘7ó+xX‰~Hb;á˜/]fx’̣4iÆ2A&̣+]ac¯Ùå,Ç£Á‰Ÿgy‘“ÙÄ·m¶›jÓªö¤;yZ?­m퉹à ~/»G ÉHæ×V;âPoLï-ïÍ'ó"-à îê²-;ÓBód΀0•­ÖƯº6u!£ÙQæOWO»Ën×î8ăÆ{“{Ë|iÁ¾\½ÿH|´_́ßƯ»ûNñÎf³IIúÄ>ጯ›ơû—ï¿Ú½JEú̃ơ{ç÷²=êéYyöëË__Ö—́<›[cóă\äTÓ‚‚ çƯ§Ơ§ÿtơO§å)!d.æwÜl—t'¬?¸h.p}}²₫$—ùB.¸ç¿¾úơÇ«7íf*§÷Ê{gébeW?o~.‰ Å–†äINJA;»Ăæ©ÀNJS^o¯7g›“ƯÉyunœ™'ó¹˜ÏĬđÅ̀̀æṿ4›dê£ÙQ­ëÊTÛrK •Z2Ç&ùäÎ̃¶j YÏﺻërưjûêÅêÅi}úôêi&²D$(₫=c̀Ùö́Ơî•÷Ôª.UYéÊy‡rOàA2™‰ (oZÓÖªnT£Aç4Ÿ‘™ 4́ºƯZ­Ïʳ—»—íĐ÷MEºẂ¥<åWëêÓƯ§Æ™ÊU¥.Q}ÅÄ<ơµª¡o+₫zûF`đ:ŸÜøÑGîlÿâ-ô°àâî{Æ®n›ª¹Q‡™÷p\ ÷¿ă&Ü9:˜h Yùߌ®Ûà‚ŒJÇ̃û áEm íVo¯ê+kía5H̉z')r£/¤8F=›0éB4g°ÉtàhAäd„ûb¥4Hø÷Àă¨èQñÂæ2ºp „y6N`E@‘¿I{p#YÂqÖ §6 “GÉHêZ§Ă)×đ ÈPùCkŸiíH÷ú®“}·Ü›!sDh°Ơ±ÿ:ăb>¤–èPE‰îu@4pÊç„§h_Œ$›pÙ°#ÀBe¬`3·È}t íZ§ñÓ¼Éô‹Sûö“qF†Xz -‰Ùđ[¨–¡ ß§á±]pF½Ga ȉuQúupGûÖÚ7̣˘@¤$TÏú¨8`\©Ä@"Âó¢A QÚ«WËÄ£ÅVÖÖÙT¤c""ßèÍ8Đp‡Q:ÆơÚ«`¡ïî¼ă„+Pi–zâ•RêâḄà#(|Œîq ́†%?7{XŒ(¼ăè÷$Gœ·~lïđ9NAÄ7[ba‰½ÑƯƒŒ ï¨R1[ô^ϯÇy#°Á ÷ =Q%xǨØÈ(;Ü;œÏæ’ˆM¾^Ăqà*Œxè1E£s¸QƒĐ(íF¢=z„n`²mÖ,8TfÁ{đ¼ä>÷Ƙëú½çH̉ÂăAäÈ Á₫_7Ô…ô+Fê Ử+LJó¥ƒ{í'”D3=P `ȾÜÀÛơcÜùoh‰̉Oix]mz´IFèù°t#·–ö †^†(@#†oDJÆIx²>¹V×J«Ú׆üsDꇠ‹ –ß̣Æë"¬M7 ¿y§nîÇÅÁÛ·¸¿Ëđ9ƒÀ ?… ÷†Ph&4È"¡Z²]¸ycăÏAÍ'F/Œ ==¿-HaĐanàç',!@Đ Á·I* ' KŒ7­k¥•®´×¡DQ…Úür"e„ÁE§»V·[µmÛÖ€™ïÏç‹y»k·—Û”¦ Œ*MÙº¥3$ÈÎwÜqă·¾U­̉J[Ư?Đ£‹ƒ3„x’Ødb'8í5F,ÙƠ»—æåóơóÆ5/¯_¾Ú¾º¬/[Ó€6zÆgèñ̃±,d’'ºÑ§Íé«̣UÁ;ÙûÉ}¹”çéùÆm:×]V—‚‰e±<Ú;rÂÍ×óu½F+¿Öë9'"A"o«Úu³>¯Îwö³ư7foÜ)îxâ½ơyëmƠUÛn뉟ÉÍiKÛỌ́ô´<]·ë”¥«zµS»EºTd<;H²ƒE²HeJ ½Ü]>]?}¶}¦œZæËåd)¨xѽhM[ùÊz묣@9đ\挳ڵº¥„åG1™‰‚"vj·³;¥U ­¥é1M§Üpï¼î´öÚr[́åRËËƠ¥'~gv‹Éâ(;’¹<Û•º\È…d2çù£É£Eº`À,Ø­̃®ÚƠ®Û)«Z¸…t Qi(J+đ¡ 'X ·}ô¾R!V–n€Ưđ|FESˆøïæcœ[,YŒ?m(§ßLf »|OyOd’f©÷¾m[$±ÄØ%yQPJ”RuSrKœ·t÷?goEw",=:0oñF^/½ñú¸05]Ï)uÎI. ÁEg;à5 X´ñâ9>%Œ9çËư%c¬,ËƯÅ.â´đ·‘›ÍPå$@nư6ºïcv#·:ªth­¡§‡â}%„ÄÂÇß BÅ×ĂM‰“>¼¡QCú̃Ă´¦C‚vÈ÷À:Ăø> • ‡s~œç<ç ·{6:Öq)BO*ơчG§°Gňyl2Ƥ̀A¹úŒ7ö¸Y®x}†”Z•Ơ¯)PáEÊRtïÆÙ(L‰Â|!©Đ£6a!µO+̃2¬ù€Æ‰…°ˆDÙ‚èô‡²µë[x¾–φ«a=El(,aß%‘[̉çơqí¯X¬~ŒéĂpĐn[R‚̣Ɇ> w#`×ßÂ†à•ƒ™‹û²æWPgƒbʇô*×ă®½‚‹„…ç O°‚åz£N.Â+‘…Oz¢7ˆZD4*^„„&¸— ú>rÆ=xNxkÚR•]×Ơ¦ṽ¡Œi*RÉdB¢U™¸\ ­·¾ë:¡#̀Ï›inó̀dyw®{xçá;w®/¯ƠNa¨æ¨ Äê)¨]­*uU]o=±aÇr¢‚ «¬UPù‡ Đàœ+Xa˜áœ@«ÛgÛg'åIiÊNwˆë3Æ”ºÔFï¥{39{Àiá©_µ«§Û§_\ˆÂzû“ÙÕ½{?¿¦ÏÎÛóJWM×´²Í³ü ùFîógöYmjÎxe«ß²H¦ ơ´\•×êÚw<=^ˉ˜$<Ùúmç»̉––X@ ¹D$µªḮ™`¢1 ̉|w•­*]qÂQN'ib“„$’KmôYsö¬|¶5[lûÅ(«¡~V>³Ö‰gcQܺp¶íLyúpùđn~7¤i«æj¥Wơ‚ĂS7{® D´=¥ƒÇXyÇ ̀A JưÀ-:\?ây û`ÏrkGÈØv£nÁ·“eă²€÷EQ́(­®®¯´Ơă„î’ûGûI"7›Íöùö7$Ñ>o 8đ>ôùÇØ± ד0ëm&2BH.săLĐSêƯ0tÀ¸Æ928Ñ{̃đ=O)Í̉́ŸÿèÏÓ,{ơêƠßï₫^)Ùc̃̉°`F$˜:C:v¼Æ!Úëz<¼qdy£Â}Ùî5<Ï­2₫wTƯ;C$ñÀ'7Êa=‚p̀ „ä†NB @ơ,áa"xúP̃{º¥Í®±­Í}LÓ1̀ÑXƒ _Æ,̀ ÅèF²Æ¶ơs‚œàíª±$˜QI%¢`’Ê„o/ỉ%‚·î¼…^ZLîQ†‘Pđm£²́€›Edï´Óη>ÀÆÎPƒ‹?æ›úÁ9¶U(ùXçl÷Œ4ë rO7ø=,ï>Àå€k Œb¤¡ /̣ˆ–2PI)Ö.ÂÏÛÀ¸sÂïj> Î5:ú O°E.>Ix’°äu_2³qƒ’1â ÖÙЧñØËÁu¼1́A{4S 'h«ë®;¼Ö 7jă ¡Ä0ă˜\0Âr–SAKSªV9çqʪ²+ÍÚk¤•’È„'èFpƹà{Ù̃2[’”¬̉U£Æ4Î9N¸”2i‘à¡Ơí®ÙíÚƯ®Û)£‡ÅáăÉă'Ë'Oö,³åËơ˼úÇ—Û—ùY2c†}¼úX+-ARO÷óưLdé&é$ué“ù“û³û¥*ÿöåß₫Ăù?lºM©Êy2O_¥’É7ßêlÚM«Û³êL©´JX’đ$gùn·;¿>/MYrgvœ̣ắø8?ä‘y1OÓÔ*ë¨K²äAñ@0qU]ưíó¿Ư4›œå³tV»zÓm€ÀA~pw~× ûª|u²>DÜŸ̃Ÿ¤“ƒâÀyw§¸ó/–ÿââß¼W¾÷¢|ñÛtn–̀PVŸ¤äNzçHÍÙ¼«»m»íL7Oæ\pCŒ%vN—ù’1Æ9/’"çùÁô RƠ'—Ÿ<»|v]_gjSdÇóc °i7eUV»jÛm¨ÙñlF§ûî€Sùäî“;ÙáÅẸ̈å‡ơ‡;³Kx̣°xøÖä­F7 Oö'û³b&…ä’ÿỴg̀åị̂éùÓÏ>¼ª®jUk«aK¾|£xc̀çù\HĐël§»JUÛn«¼ÂBqeª²+±£ ›Çá<'@ ̀úSBˆ‚{Å̃"[äIƯ\W×»‹u³̃u;ADÁ9ŸgiÆ7Ôlô¦6µñF2ùhñèlwư¿èŸEG|́…G£ư5=åN_Æ ¡=âd<†LŒ…(Fj 7ˆC7Ÿ“×ú‚Q̣Yu?˜z«́„Nögûq‡ ›WÜ¢†ưh/‹í̃=xíơ ›ư2¸+­³";1$§`è̃ƒM—$•’„'‚ |>¤0z$w0fc1R ”Q @ •âCGê=xÁN£<¢¦£È¦¿ÅQ3ån J̃DƠù"‡mhg4"°;̀ g"áwè®øyĂGĂïöÁ7`0#óëó·XƒôÓ(œ ƯĂ3jz÷2ˆ©¸¾g‘èÖÙùb~÷îƯº©3­Ö«á.8ë¼cœưèíwæ‹ùóÏ_½z…àóïv`œcÁ̃ÂŒ•mù›ÿ¼=;b×nLA¸ èc&ëƒü%¥tRL₫¿ÿŸŸeÙ{ïđÿăDÂÊk5Ü,‹øÏxnjîŸG(¬IBB+̣qr½wæ0ú$±ßíXщŒ₫ªÏC<ñ̃đ‘(ŸB†Ï$8ü ®J€ 1Œ呪; UbK¹>1‚̃8瀀#ù4cjï8‡=̃bQ8î1êÀr3&KbIÄË2Â$“˜¿DLö×îÓö¸ö8ưÿS÷gM’%Ç™ ªª¶œÍ·ˆÈ¥ (${¦e¤E8Ó=ư8re~Ç<ÍßûÖ"ƯW.çÊD`m™±¹ûÙl½jÇ,4$Û+%*2Â#̉ư,fŸª~‹ä¼bÄË|ùl>×g£ƠBßƠwhZhk¨¡j«Çóp~zy:÷gÅCóđƠá«ûê)Øàœ›ĂüäzÛ l>Ü}èÚî·?₫Ö­&í‚Â) mƯ6ªÑBèÑ[ÿĐ>́ÙG7Q£%”*ØĐưu¸vÜĐû~²Ă„’óÚ¦mꦒE²“æi˜‡Ñ£™8Ëk,q¤‡$D‚P Go‚ÜÀn¤O×§ót̀àƒçƠ8­º"%sK)+Qíë}„(…Œ1:ïŒ1ưÜsÛˆ«ë¼1AÁO(é=yÍIwV±wßxhnX KÄ r‚¼ræ 7»‰ó_y¢K@Á…/û d•Ư2@(wöµ\ÉΉKgS„”iuăü“=O’-u~›yé]f₫k‘‘¹µ¼'̉bùÂ"ó7±YJËyI “¶¤PÙ–,£›táE|·H#ó|#E'$j(B¤e#ĂE¨PXjf™e~ëû-m?–ñËF»FcˆygÉùŒeO­t« K{j±-M¨åŸ'¼e³IåÿnÜ< ¸’é‹ÖmîÓ•—k¦'mØ%— –}?G}sÿư~wgŒy}}Æ)âº[! âûưo÷÷ß}ûíÿơư¿'3±§*Î.aIËÉ2¨a…Ö Z(=]₫܇º|Èçù9#VXYÜ]åUEI/_®//Ăë÷Ÿ¿L?ǽ[\̣°²Gi:y´´ç/óň™ÁúÊ}§•Ï(-N+.ÏÏ`ªÙ ÷Ë_øF ™ăµ¤¦•ËîCÙ”m!fÜ ̣̣ªlQ¯÷'l¬{r}…/l~ ±,gÂo§ ë'¼®eù?®Ÿđ¼¡'EvPJ `R ~î§aæûꨄ2Á q0Á̀v~ˆj|„t̉§wƯ»]µCàa¯÷÷ơưQp ăÇÁêîäDU’dïúOă§Çéqtc¥+-´nô7Ơ7G}DưÜ¿N¯£IPÀ0ÚÑX4j©¥6çèb°³ÂkQŸÓûö}-ëQºLv‚FC¦¢Ê“J¾ë̃¹èZƠv]ç¤{ŸĂ‰»æîÔ8­6ú(IÎ~~™^>Ÿ?ÍŸözO@½íyïª&í?Ê# jU[ëZzéĐQ$©dƯÖô®Û„úŒ7.:)›‚ón„ñq|ü~ü^J9™©uC’J¡êd׉îXÙ ½ïÇ0Fˆă4æeDª©̃Ó¾•m+[ÙJ·wĂ4\Íơexù<~~g7swV8Ál ‡Îz+”¨EƯQ×ƠƯ^ï'7]́åuxå耲·•Èâ­‰&²Q&‘yªNV½è¯öÊä D‰JTô°×û!0‰ùöéd·S»Vµ¼p™`øú_mm–n±·ï²:-¥÷—<́Ëe:/̣™\„E#ÎƯˆ(…ÔR€· ̣*÷†$ÈråàL K@(×uáÏ”ă₫du ~Ẻ„²*X3­JFøÂ,²`9Đ*Ï(Jev đëÏ%ÉÍG’u]OSJOHÁđy"Z¨œiƯfR@UÚSÙàƠ „”kƒ\lxGK­#FO‹&“j¡@ €̃Đ˜FƯª‘ƒƠ@¼DÿüÅ̉å™1ÏZ,Ô&^Ø7X¨Yÿ ¬RAñG·¼Wki\<ʳ–”̀U»H‰áYë é<ŸŸ®O!g]đaCä&"¤y0WqÏ£… ưúvøn„„0ß’P ­-ă­D¡́–”¡UÆ#ăŸÑ8ĂÅFÖ|–G~ơ¡ysdåóü ¥€úæ\°ơ›úLQ‰ê‡o?Yk^>½́ô‹Đ¾¡Đ%” é¿å”ä²a¥U e _2.2,†ÅíqåÇ—'S wjL†Ô¸]ÏMѧÏ`.÷°W&}IöTô0Ö¢|±¹̀Î|)¬cÜ’1ÂÖæÈˆLpd!ÔêrU4*2»qÅúbÍ‚½uÂÊBœÂ`W~UÜ–pÁyç ˜°H́óÀktn€UÚQñj²z{-]œôÑ{k©đƒ³å¹̃€¸[Ÿ„ÄÖ‘º€û7zÉën\yÀ—Z©I•̃â‹¿2 ûÿœœ̉—üđ›¦KZX£ÿ“aư²R4s˜¼öÄ-²/ÿ¢sI%ïRAqÿŒÓ$xbn₫.ß¹%GïỉUt¶X†&˜"wîM4¼‹3v7Á„¤I+­ZƯ¶ºƠ•BÖÛÉN£g7ó½f‚™ü4ûyö3,~̃•¬jªUPq—ẹ́æ0Oaâ_ÎeS‰Œ7,ÅÖJ7²©eƯ膼󳛭³Yé[ɪ©ZƠmƠJ) („p1—«¿a 1è¨w°;ĐA‘²`j¤–&¼FưĐL†§‹¹đEÈÆ‘̃ykí'BªTU©JJ l´¼`&7Ùhó *SY²¼–º­ÛVµµ¬[ÙjÔV%‹—hqcc¶zƒÍv 5ÀÄP£ÖZK”́öjßȆÇn#Œ2J†³ ¢ŸẮ‚Ëù¦«´iÙb² yêD‚Ïé1kRéÖ́!wèßæ…ñ ,¬ï}FW«Ô­ ¹&₫F™ƯK«]úzn]2́%J^^ÖÆS\GèÏI8¼ö­Wé?)Gèó¯bXÄV Œ NG‰±¢)í5<‹raÀŸ(T U¶ó3[ŸeJRVÜæ= üquY䛽;å褉M\"t€€²å,‚„²`—³|©”Ḷ́+\nƒ†Âm2Ă~5ç y,Àf¯̀rX¾rrÊỌ̈̃ŒLúúGÍÀSû¼È¥₫Ck§ïFĂ¹5‚çF¡@¡•₫›¿ư­ÔóÓóăËc9s(' å ÂtèÜûN"̉fl1E©°6ß*—AKb˜́dœá¥&=?¬îá«2¬ËEÖ²N¼‘¢K±¡¶SQëïMƯ_+­‚6₫u\³,O()Ÿ,½ (´Ë·2ke-â¤üüµrZÓª|导߬ «æfé(”h>ư,„¼†®¾RBᘖæë‘g(Ÿ‡Œë´Qè’h±Á÷tk•“ÉKk¡”Û‹}AÉĂ)yó«r`éIgÓbë,±|Ú|¢ˆwû{Ü΃́VƤ̀Í@c©ج&'¤${ă±®uf₫·ÊzzmÏs̉Ơ»ÍÙ,QàÏK¬ŸÿÚA‰¾l₫iNyue±uéÅY^B¥ñªÆÆÍX,]̀qQë–“±åå{9Ñ́å₫ GyÜÉ]µö.Ïîùóüùe~y^7$z  ¥nU[©JQ«ºVu£-4w Yñ2‡¹·ưƠ\¯óupărBR¤*QƠªît·Ó;ÆÓh½ÜÔÛ~pĂà†̃ö“›L0¼-ÅE"/HÔ²̃×û®îj]³@s¦Ëx¹W6¨%T­ë¶nÍA’Ĉ—ạ́¯ÿđÛ×ß>MO!†F5î>î?~<|üpüp蕪/¤—ÑEçĐùàe”q8©ÓNîȃ÷àÙ 7<ÏÏwá¯Pöó&"ăM?÷×é:¹‰u¥;¹ûºùú/º¿8éSˆáƠ¼₫8ưxvgÎíêÚn¦ùizú₫åûß<ÿæq~‚½ÚWT]¦Ë§áÓçá³$ýùƠ_~ó₫›“:U¾ Sø₫åû¿=ÿí¯¯¿îM?»ùg»Ÿưêô«Ss1zçƠñ®¾û°ÿp¨6اáéÇë?^~äâêq|üíëo~Œßí̃ươÏ₫úß}ơï̃Wï+[ / ˜'ÿôh?”WÊ*3™ïûï_Ü‹E{êN?÷óOơ©vµ˜D0aœÇWóÚÛ~ cWuº»YË ‚¨DS7jjª…nt}ß¿\_ú§Ë|éMOƠéØͱ–µŒ=ÖXïÄ®•­Ê‚}1/Ïóóăøø:½vL™ơÊăGŒüơŒ >ùü¸i´#W.:6s\—Ê"¾ƒg}Üß•$+YµªƯÉ]E•ˆÓ.ƒ!B$j]‘ vpĂèÆÉN.8Bª¨:VÇwƠ»;y·ûjAbóGL>'Ü\¸!úç>0ĂÖâÖ"bÛ̉‹ÆwוJªÆVQ°̉hi5¤^çØojƒ̣ÏMƒc³P/ƛͽȥZ,7}\Í‹̉¹̃úqß(áÂ0¿4ó̀9(ù­mœ‹P–r…P₫á̉BRú$+ri”·*\rmùâDnÑđµJKª4®l¢'TùÎ\£ôĂ6º~̀ÑI‹é9,¾ˆå(¸ZˆÅ£3d́ͬ{µô [[êPŒ â-søO¾‡₫S‚„V:O¿¹€…Aws%—Ù\N¬›–́¬b¶°v<31o 0-3Ce?¾MV`a|´é` .đ?₫ÅLDg"^‰ lÿsK_ÜI“d2/\hSk÷ ̉a¾¯ø«ëÇŪY%»öÆBJ‹Œ’̣½mª%NN…%&°ôl Ë…~“;»µ˜]ÎS“> qÍ3ZÓø2 g19^!)®—X¸^BH%}ÅRÆå»1fëx³|9™RŸó±×F—A<£U¦èp¶ÜÛyÓÛ†A^|ÿ‰÷ORà’äÅÁ1™Ư´¸‰•(vư\,LQ8 цˆ‰E6p–ÿf²́zŸ„ͪ´Î@ư2»Xl›×é‡Û@üđÖfôKs¡â±âëđÆ6j /,.ªt4 0Û^« –%¦ÔđábʉU¼°8Öªæ˜[&'(T­h[Ụ̀•6¹iö3èÔ_vbĐÏ × ’R´ïr±Ç\5!˜?€ˆ¼‡1>¶ÁZg'7Mvr̃ñÅgÏ”¢Ơí®̃1GØă‚™ưv́ç~0Cozî[ón–µ×¼ñơñ¾¾GDă§„ºkïvƠ.„p¯½éµ̉î´ÔûzjOï÷ïïº;E*¸`ê„&Ñă=4µ¨5£[Ư²é±9J!Ç0fèÇ-öÙ,ÿ<Ÿ+Y}süæzÿ?ựꀭµ.º@Á ;øáyx~|}|>?¾|₫¡ÿaô#µª=Ơ§C}8VÇcs|hƠq'v2ÊÑŒăăăøØ»^đä•Tß¾9îRI¼µ6ØÔAm¬y§gă ¶ªƯ«}+[D<Ơ'"  [w×¢6ÁđpÉDS©Ø2o‚"'₫̣®™uA|Cñ₫bƒµ`:.PØv ¬³½éÏÓù<¹J1΄‰F4­hÙÔT+©e|̀—ËäFöeR¤*ª*ª’—Ô€=FG7₫8₫8ùÉoœá%=ă\aA«Ä([₫/Ûh^ĐJÄ\ʺ̣âY¶suQá3z¦̉h1r‘PÎÊÙlY”nx¹}S6ßâPNävu©RÛ C ü°ÁÛéJ^–S»×wWj¦×î ¬Û}ṇª¬ZN äj ©¨(SVKöZ•Àl±-‚bPfª¦ª †M©°©NàC‹ơ\á”H₫·_ºèñ®<êµÇÅ)?½ÿl“%+ Å:„Âez}IÉúü×ÁEq̉̀ªGîèç .[W­OX®ơÂ. ,̣vK½ëZ?Ó&™ ±kF’d!Ơ°è ’ÎÍ‹.8-Ä »¦[ÏQL©à 1s#p%imÉ6ùc₫g̣'°„!33 ÏỘw–̀§°Ơ%gèŸOp¹„Å%5,/Cđ&-ʈ٬†>²N(YÑç3mf”™bQ&殬ú¥9]¶–§›®3̉¨DaŒÅ ¶¦7‹CN¦B–’ ÀñóÚ·L}⺈)ßk¾ăŸè‘§CÙÔ9»%….1—d¯¥Î>¡ùOFù%´Íqè™Æ“E´$ÿ•tÏÇÅ`8¤Uăfd™CI²p*CJ±T"÷¿i›…€`up‹äQ]Ùw¹Wê™`kp9tˆ‡Æ4DÄm­‹»æP’€ +'œˆB뤄>xBjT£¥üÔûÍO¥”£sîž8ë= OĂ<\æËeº8p{½ÿºûúÔœî»û¶j_æ—§éi6óe¼ f`Ë"]ä… ZêF6ÇæxPƠ8κi^ë×V¶4Øá<Ÿ{Ó³ Ûƒ×B«¨.ÓLvbH'»»úî«ú«Ú}Pvín°Ă·/ßa0£y¦gx1/µ¬[ÑĂNïd”ÑÆ/5mlÙh§0Ía¶Á&ø¾´¢Œ̀œLKts„À\!DM5 L¤bBˆ`¼¹L—gưü,Ÿylơ2½d£!ăÍƠ]Ù:™£Í4éNuœƠˆ,ơvÁM~2ÁŒ8J'¹ `ñ=£œZÔB ¢Ç<ÁÎJÉ Îx'ÅÅ~TDÁË ¿#å‰KóơÂå3ÄàqÁÓ0oÓ9‡₫ƤÊŒNZ×7ÈÍÎŒ~3G(‡¥¾iÆLLă¦Ep¼P7yM‹K¬J6Y…cỤ̂ ØË–Mf·ç¹PéeÉ‹FdßцûQ :₫Ă Z̉0ÓG.-_ C€D:¢%G…¿•9–©̃X>báÙC©đ@@! pc¼©˜*–Fù'“±̉΋cµTTJÅ^̀7ÂMwuf[ä‹Ûb.$n°eÙ©L{nX‚ªÊáĂ›sZ²äKƯÈ* )$4Ù%ÅsbØN$~b>‘åy‚[Æ_Ÿé Ë.{µă­¢æmñP&2m&ËNŸÇ)-½9Îăz@c†Ơë›,¾±ê 7¬Ôö¸ˆ\ă­…cQ´•]äu`c ˆKL…×ÁJŸâ+»T ‹Èº|,“Çü×Ü­_ tZÆv”ßæKów©đX]ḿăR 櫼03ÍLihS²ä³H4ăûLÏ œÍ³èÓ°pưçàçluq—C₫VÉ2/™èë Dù†Ư”}‡rb9á*ƠM—₫²îçû'Ï%óû½½Û‹ĐRÏ”>ñ”e@XB¶ùó2!ÜECL»](¼G1îö»¦m^/¯—ó…› _œ&ñÀ®ŸĐV¶ơæ+{ å§̉¸¸Q­Í9 ™̉“÷ÅM/°lW0›…–ºU'ºF5Üơ¯uÍ×á́ç«¿Î~vÎ1 _I¥•fC!̃Y7Ùi˜‡ë|½Î×ó\QÈ$AndÓÔÍ^ïwz×É®¦Z¢Œ1²5äÅ_.ñ‰Ÿ}#™đÑç7ÅÁ,ú̃­±—é†éjøÉNÉ›{9:^oăŸØ n: ›DªÂ³eeÈP!ä¥bµ¼qL*üˆEđÉgáǯ•@Aú}ˣؠÎ^˜¥ å\YLZê¦iT­.—‹3—H¬̀ Éû]&‡$́qĂ2Z2é†8”EL:®tưÀºđA`{æhlpWVCä¹+C—ÔSç”ëyÀë¢ËåDà/®üXR®<\,f¸¤R®~'°../Ô’¶¹`–Àf̀€4Đ1Lºă†ê–ÁU(•â!_ÿ¹x(”½́b&–‘pXä7‰Çµz¬ul&Ø…®€4ĂχH‘Âŧ,-Övá¶æÜtßøßÈÇçÇ’¼¢ùœÅ[½̣Plôo“&p}ó+i>”›|±2í«Đbf}p9¼ePe:ͶŒ̃¤~”„œÜ—øpm-gÖ]¾×Cë›Ê¢L¿ qăíÈđ%cú́Å›X%Ñ3eb…›KË?ËF3Y‚?ùÓbúÔƒˆJñq÷™ơ”Ç ÙÂ%Áú…Æ“̣sË’ ?Tä€ä6o™§x3ÊLưܬÚ8èsá”#ʦ₫ÂöÉ÷srKÈaăÁå6Xæ˜–ÓÆLøÑ•₫·ÿîß₫üç?ÿÏÿå?ÿÍßüs®äË₫Ô!-é­› 7—}æ~qoËưû|g•Íf‘ƯríJÉMñb*QI![jỌÔé®–u%+&Y9çPI…E‰ûë|=_Ïs¹kI*X½D–—q¬w»»‡ƯĂ}wjN­n¥>úÑOæé<{ÓOvâöTöjÏÍшÑ{6ç_¿ü:NÑ[«ú®»ûøîăÇÓLJö¡Ó n¸ëÙœ?¹O­jßíßư»¿üwƯĂGùƠâ{o|%*­´P ¹˜ËÓô4‡¹’ƠẠø~÷̃Ö–ˆÚº­ªJ)å‚›ç™Uª‚FœƯü2¿px™"Ơª¶Ơ­Dçh¼qÁƠ²nu›!¾¹Œ7ƒV«ïà¦0 v`JD§æ´o÷J(®"\pH8‰i°Ă9œ¯p 2t²Ó•̃¹Ư5wï›÷ƠD̀0Ä$)¡ƠñW»_Ơu™F¨”ªdUëúúæßNÿöz¾₫đù‡Ç×ÇËxéMïÀU²ªtơP=§Îw@`ȼ̉+cM$´h¯₫æp̉§_´¿øøđñ«ăW]Ơ†ë0ºÑÔ†Pâ,ççđüƯôƯĐÁĐb{ï#Åçøüy₫0êĂ]}×ÈÆ8óĂơ‡×ùơÛË·•ªvzwªO’ä}sÏÂŒ¯_б9êC«Z´Ä«ºˆ1ZgG;ZcÁ3zó=Îd³̀R«TÅ¡ûjÏ=‹£q¦7ưe¾œçóÙœ‡yXíwKH l³+ơ¡>|µûj´co{₫q®\́åj¯Ọ©±Mg»]µc‘L¥ªÜ!baösª±§+§°v…ï™Á˨´́•Íơ}µŸÜ”…@1{½I f“{Æ JØ´qy«÷ƯíaYfÿFS¢¢?đ±RóßÚ’̉mm°Nă³ßƯub¶̉æÚ€– ¨ĂŸĐV6P€( ÑÊg^₫Z5Ơ_₫›¿|÷đî?ư§ÿôôøÄÉu6¾9À¾v‰`- –næF±¹ô7SsDÀêtKIPF4f+ó›Nn ç̉¶ ©áµ–LHG¸I-“ÿ€›û¶©^đM÷qmZçOn?F‘›-’nÛá›Öû›œl>ơ%!%ßë‹ …&&ÿ’Œ)Ù%`(të¸)Ä+ÏZC2fÈ&)q?›7[¯¿·zÂ₫>‹˜Yw„€*Q£Ó /¤ÁYÿ‘¡̀º©—–aüÜeƠȘ9·„ËÏoôLŸ_q‹‹É₫†Ă¨1ûme迾Ú K.ód%·E`€¸$DxđÁ/.cq¡†/ê¢l³¦rdS‚̣9a%â'ûç)‹7ß”¹²/‚ë¡Èe:$Iw\éị̂…Ø+[Q)¦‡8q,Áúâ´&[ƒ"¸ „û™$?–m!îë́;Ưh àößÜç̣]]îaë ïK W>&=ß·y²Ÿuđë·]à`Ùûùä̉¢MïM/I₫|ÿsÆú́ Êw¥ öÉ=Ă8˜arÓ́æ¼Gl:fừX¸¿J¨F5]Ơíëư¾Úwºc¿f2„Îăù±ä»Àx3Ù‰íüÙ7))2"€¡I7²©(Ñ[lm´“Ÿ®æj½Î×çáyös>L|jÙÜƠw­jê°“»½Øä¡ÂjO{ëí‹}é]ÿ®~wjO$H)¥PI!/Ăå<œ¹dƯÜawÀĂ;¹»§ûöưq>9éîî-Ø‹¹ü8ưøéúi £ ÆKDÀ‘›i®tƠ6-g^úÆ‘¼pFq†wS  *Q±“RE•Ö†°Vu#6h‚&*V©£uöj¯ƒö~/…dó™JVè‚Ư8À`¼™æÅ7‰à¡{øÅƯ/„gw₫₫åûŸü|ư<ÛùI>1|o«öĐíᮽ;¶ÇJW&˜§áé‡ó¯óë`†ưƯ₫áƯƒ îuz}u¯“œLe"F̣4Îă·Ÿ¿ư!₫ĐÛ₫ÓøéÛ₫ÛOÓ§ÉMµ¨?>¾ï̃¿ï̃ŸêSKmpa²ÓóŸ>jtsjOº̉^z3;Ù +b¯÷Rɇƒ¡‚̉¨ç8›É<_Ÿ¿¿|ÿíơÛF5ûjßR v¸›ÂdŒy¶Ï—ạ́MûÍ́æJW]è†ÇÁƒ?‹³¢SƯ±>ô¡’!1á%…ª•m• =*T-µ»¸́À”}îkørÓJk¥ YɽÚ×U}pÖ³Ó́æ¤D_Vi ÏÙj]ñÈ÷»TÍv6ÖXgƒ#¢Cr4ϳ—>袛́d£ ˆ¨ëºă₫(¥d0|0ưw›ç̣ÆÇ×1FƯä§Á ƒJÛ₫„À–†bz₫ÎÊ¥9­E˜&¼ªˆ(ÊNù *·TÊnkn&₫ë6K n·ǘ…zÁ§£kçÖôºüÆÔ±¾ÁôÀÆ;xÂĂ uFMk‡7‘Gˆ¸ëv?ÿÙÏ₫ïÿûÿÎØ){¶̣ïäçÈƯÀ¤R&±±T*„Ô«Ø4“…2Mhå9Ăº $è 7§…J”:Âlø¢Ÿ€( ư"¼N„¢¸Vk Ëî¼|+éªW.uÏ+¬í3H°….OkĂËø%Iæơ–.ƒ¸NnÜ/7†"Exu;-<â×wQ̀BĂáĐºëµÿáÇïY«Ỷ“V#W”,°‚#¤XôÙ̉ç!:t嘫äÿ”ufêûVÈ‹)o¾ÇqE$°är—.œP› úÑz”ó¸¡H'f~Èzg?¬¥LY³Æqy†ư\̣Ỵ̈¿ƒ€JJ†P+<₫²ÅgvlXè"̀ÉaÖ#£üL¹ùȹz¹s_2ï¿0=Œ1bJµîOÈW>VÙ›vÈzÀ:0)£V?Üúí@ELf;%/¿̀B^ ~&ènú¸ëæqÊÍ!!®CØf+¬H=wî3'ªäê¤H¿¯ư›¾₫̣ËËmil+-órúXJ¹aF8ÛùÛï¾}=¿>>=₫f¹x¾e=F`F{ÁĂâàË; ̣>—‹Zü‡óWªJWÙéŸ=ˉYP!ï}€ QB„‹¹ô®çs®Z|¥€@+-¥„|/p§^\üH’•¨*Qỉµ¬kYsSÀ€“™®ÓƠA²ä7>¹Â!GKXg*å«ÛT¼5~àh­«½v˜ừH«7=·W iWíZƯ6²9ÖÇí‡wơ»‡úá¨5Ơ‹†-X)ä=ƯßƠw$(P`"¾‹n´£ ÑéN€pÆÉ «PUPµ±ƯÅ]íÖ7wí@ñj^]p}èŸÍóà he{¨Çúø~÷~§wtđµˆ˜¬½Á:øàó]ì$ÎW®¨â (^@²€›BRHôÁOfB‹U¬XKªIGŒë<“Ë_¦—ót6̃‘–zWí¤’lZß6mMơAjYóúà‚ëM yé­³Ă8<¿ë¿û4|ú(¾ëqæç—çé<1}˃wÁ]¦ Wqwy1//æepƒ’êĐ>î>>t‡ê ¤̣ä-Ø)Lgs¾«ë]u®ØËµ£®Ñª•’ªÆZEå…§&?=¿<ƒå.¼Ä—F6ơC[·•¨D ñå­Q_ƯuœG?´º=ˆĂv-´Úkk¬w>o+$ïk£‡0Ln2̃dđA@µPÂEG@ÀCtÎg8ûœ¯Rf SŸU“æ£Ê¿¼µI)9`#Æ:ÔÜB2ÖLn2Öđïçm°».ªBƠ`CDRJ¡§%T%”BIeœ >µŸX-Ă~µ•¨ø>å ̀7ÙirWª7mEÆO\ºöĐ `XÚ…ˆH‘˜U !÷kÖyiÑX …É?½Øđ-ÿ€vYIj…7Ô£›gæ¶ÅÊñØ.à7/ƒÁ2"úàû¾GDcLXâêWæ&*¶*;¿('Èü¼ç¼Đ=Xù×U ˜?‡­–`Y{W>j\Øä‹/\iÇoa)e’_K,ä¼o5Ù¡0›̣à˦[Y0Ü<9–åPÀ›ÚVȺüoÆÏt£u&V4ÔoJe…=Ëm“s=oU´i, —¼¿‡́±mÛ_ưů§ă§OŸƠ,­³o'Àp–ˆ ̃mËæc,e±ÅĐ)_~å),yÏ¥E3)[ƯfvuêÓÇ¢BBä6đZC$œ\&Ef¼U=—uê uçvfW"Ôbô“Foô!q‰]Éy[Ô˜&’:÷<,!ûjW_8Æơ¯e߂빛ySđK:̣ï!”Pưüq·̀ụ̂+ü„̉Œ(çJ®:‡bfr#eNcÄÅœ'“£̉F&$Ü |Ê TáV¶Œ(57Ê›Â`®„éi¿,8KpbàЇ/…’¨W²ƒÊvÔÿºaÁƠñe+Ÿ‹ˆó<ÿíß₫-ơ}CXÿ=\És'‰Ç÷©¥Đ‹Á yB½ñ×[æ*;½cé'|R­kÂZkŒáưÛy'H¸è¦'mˆ)èD ¨DƠª¶‘M«[–p¯ÔxĂ iLÜd_NÎÊ­¨ ‚ơv2ÓÙ/ör¶ç«»Î~æ•/-µVº–u¥*-5Ïx•à%„༛í<Øá2_˜_q™/çé<¹‰ Çu²cƒÅûÍĂIŸø³qú(I~|™_çgD¬cƯBËư­!¤@B§\%*–‡Ze5ÖZ^v,اó“ơfôÓ9_áu’UÔ… R«ÚSsºkîơ¡Q E2Á­jwz—8oR¯HŒ₫Í œỳ«Û̀{ï’®iWRȦj*Yqb±qƀѤ5ếu8Úq4#%Àd§Á lĐäƒ>\Íơ¹&A¬Ü¸ïîwj×Ê– vƯ8MSˆA¢¼Ów¯úµ£.„đj^ŸÆ§ót̀d&ọ́ü2LĂËùÅ ®ÓçˆsTB̉XG§”:ÉÓ•¬Ơq_íYøÈ­k¬Ph¡¬¢™̀hÎæŒv²»¯î0ƒd”0úX·ơ^ïÍh>]>™Ù°rºƠÇöă-µ_ßƯ´̃ƒµÔ¼dœÇóy:Ov"¤ÜI%•V;¹« ²̃ÍÙE'Q6²id#• 1L~º˜Ë`)ñ:Ùuº«T%Qj̉1F gGLóÄ$s&Edº¦ñ†ï)¦›sÏ5Ơ™ßèÁƒ‡Ơ­pÊ0¯ ¼Cç‚Ë0Ă¹kQW¢RJ!a¤hƒuàH ­hr|²\¾ưä&¾öøféT×ȆÛ€`¼ÉnŒ‘«‚"_“Åjø#̣8 o,b2̃MŒ(BDB !Ê ³Sß›¸ØôeC’‰ñ‡4S₫¸Gücư­j¢đWê—†®×ë¯ưk©åùræÄ›lÆÀ†Ư©!}³ă†0•}›ƯroeEbC~Z-XnĂ&çè÷Hù•đ¶‹'+_*™Ÿ'Ø%™jƯ÷‹y¬¤đ”µÉ­+&R©ËO¿CˆüZ€åQ̀F‹L˜ ăÍ” #d®-ú̉›‘¦–X:à°{ ɑڦưúĂ×§Ó)đCµw•ljÛ|„ä¼= rJëË¥”S(4Ụ́#€©ÉÂŒD{ûßÿêOïªxŸe…´†z,7àÏC0¸DáMVÎP ¢üZfëM…˜U°ø”½ó²G›!`ioŸ€»_cª²Ê3;`–ùV¹åŸÛÿ~ ÄK†èŸĂz–ˆ´Ö`ŒùĂÁâÍÄĂeFXbäƒ()=´†J~îÜ—2èL¥ÅÈ(yGæx®4ú|‚×DƠB>[&ÿñr¹á…Ç ?ç–v_”_kúí̃?Ƀ×zV+̃~‹¯X4¥@¶ư‚­‘QÁàÏ@2¦¢ ÏnñÙÅh¹ÿ1;L-¼üŒơ¡đ—(Q₫¦ß³́jPÎă–5/â7…Ü[EÛú„7NÀ·”ưR¡6ºœơë[K~¦ä®d‚a?Ư¿ùs<~ß$gñêÉs0,DÀi@ÀQM“™8á˜ÛEmƠ²y¥&ÍÄÁd“s5‰7"t'»F4•¨¸¤DD>¶6Ză‹.¥S ¥„↽’ă·B Ö[c̀hFvÙ_ŸççÙÍ7s^DÜëư¡:œêÓ]{w×̃ÚCWwl‡ï‚íx®Ü¸½N××ñơezéMÏ̉íRÖ¼«vl"t×ܽoß?4Gu܉&]pƒ(Ĉ(Đ ?ád¢IdP@`ç6MLj̃ûÑ t|đ€̃/U<¨UƯUƯ/~ñáøá«û¯»cS5„ôryù₫ñûï¿»Œ—ÙÎØÊ¤=¨EM@)" 7z•Tµ®µ̉J)¥Ó¬c§T{˜kŒ‘ ̣ûæ₫¾½ÿŇ_Ö± c@€À{¹˜Ëàní/36RBqˆ2c¾ÉMλÜVä&±ơ–“•Y<Ăôwë́lgæhñRÉn]]Ơµ²U ‘e•®”R<½áïê¨g3?^?]?=“™ø¶íT·«w•®@¦̃ô“Ÿ¬·£Vz×́vÍ® .ŒóøùúùÛó·ÏÓóóø|™/î>üƠ‡¿̉N_¯Ö[­‰Æ£ü „RRư‡ÿ¾zÿƠ÷ß~ÿÿüÿ₫I²–ơNïöơ¾Ó‰ÄhzŸ3øà©–Ú**¥zË{Ó́çÁ³™%Éc}<¨Kø`kQøDyWƯ±#₫1Œƒ¸>áø9¾̣3בẠ« ""v¶å3Ç3‹&æaHs»qIÀÛ% (R•¬Ñ´ºƯ©+ȵÔE„È¡x¬¾̀—Á “xîÆ¥‹KˆÁFë¢[Çz¡\æ–OöbŒ́p`Ü’  ¤1F,o ùÆ÷̃¯ƒîb†Ï+-7;ù+¼ÂĂÖ0–n-Û1́ŸU÷ç]ó¿Tư7·‰̣g˯—¸ÿ†ưSØôí_“oƠ2eZ'üKçû–ÊQʬ «º²$€ÅçtS½°¬e1Ÿ]ß]¼Áa ›¥P ߃,̀~‰âWÛ¢ŸúâÀ¶k~“ WÄ'¦µÙ¶7·ăi3<)G]Óưå_ưå©=.ƒ•Á !†JVˆœ%§PI’;µÛ‰§.đT‰J¨¡fäm‚qàl´d uC IêDG‚ö°g?}qdiD^X¬HEÙÖ]ш(Ơ¤ ăkƯ¡"đ@`÷ë7.æG7N~:Ïg¦i¡5i)¤DÉø&RJÈ( (ÚÈ7i¾•s5:Bb côœÚÁ« /Ñ9P’³Ï7ɶ.úQz ‹»(ÿ©¨’$½đüÊJ̃nxöå¾̀K"‹hy™Y£å!ÏÏ×>οè₫₫>₫ˆºeĂ­Ú>¸·’b†„¿KËÖ+鿝%e#ÙñmƯ‡n©ÚùùKƒ8g§l~ù¶H’\Xö»d.sƒ̀ ‚̉Äs;+`8‘ä~¹ơ¯˜åIXXFKsđ¦?XëÄ Ç,Xâ¦û^p™{·yÜ4́0ÿƯÜêÆ˜ùơzá÷+¥”R*¡‚ g¸ÿ¦̀£B™7Nÿ… }`ÖL3ùP@2 ăưH¶ªÍÏ[IxE³ .Ë™WÖQá˜k´™ơ<›ùûë÷}ß—Aè‰Kƒñ½zßvmˆá»ß}÷»Ï¿[]Øă‚ûĂÊÚ¿+¿ 1ÿ•̀³0è¶›[Ü“+ ‡%X3/X-~“¡/}ác’D[«eX¾å²ÁÎ"mÁ¥&MWEVócO…+-Äîç^K1¶†EÎ’•=+É'®÷F¦r®«6$îNZÅ–áoº‡ó½º ”=~̃iøUo2èÏwuùœURó§-₫S]!ë¥Röø—17§a¡ạ́y,§U!„ˆQÁ✃Ó覫»JV,+„eSôÆ‹I¡ªDU‹º¢J‚¤HÁ¯’˜ÙÏ©Q½˜ù°~@ ‰„ü«l°ăxIr/÷L"bMÄ(@œÚÓ}w¿¿¿ßƯ׺F‰ ₫F;>Î:¾ü^/¯×₫ê½W¤*U‘ (#F¶÷©E-IrT;™ză…³Ÿ+S±;bl«¶­[B ͦ@(„p¯Î»af7Ï~îMÿ<=? O{1̃pë¨VµF]Q•*ÿ@ˆ,‘# ²VơNïÍ¡mZ’dÀLaÂÄKztxë5Ó4g¼÷ˆÈWH•*bâpơW°̃óÀUD€à¼;ÏçÑ@ H)8ók‚éÙ?_ú Eíüj_{ÛÏf¶Æ:pÑÄK¼<ù§0…³<' ´¨bˆ̀5j©}W½3ÑØ`1Ö‘­‡Ù´ªmDĂ<øwî¾jŒØ–̃2"QQƠP ;µ«b¥‚r̃ v¸Úk6å$R¶htØ©]';EÊEÇ+i1bädâE%+ ?Ä!„Đª–‡@00 (Èܪhâ&ăªä‰,{́J’HÈdc̀xhÙMâ¢8dæ½ơv¶óèG₫å!ÏƠ]y«% ¬8$0@` ôäG9â)yü¾˜$–¬À„–(!åv›æçàØÛÔƒOZ…ˆ1FvXüÄ ¿-5J!y,ID!† Û×`¸g—´^…=hfç aƠỬ̉8Ç¢…ëKL,H)Sº{,ü­÷ư Cß> u„5¬D₫ú–ơ]rÜßz å­*ùû̉P¢&”„ %)ˆ›¦'¿Ú ^1G,ó<Oï:¿åˆgö?¾Q‡.̀^!›Ô₫đ–, MÂíŸ ‡‚V´„¤OBJÔ…€[TưÔ3,ø$½«±µ ¼ñÓ4Íăœñ0#×rY@&€½ÉĂRI[Îp(„ØíwH(7d´´"́°ˆ2÷´¤Öd¦Í̃îÛ¾̀ôéó§aʨT₫„¹£ûºưÚÿƒưáïÿÎXSë̀̀₫×_Ä¿½Ó6„’ÜXM½èÙ¯iùs~NU¶O¿­×7áBÇÏKdníó’—=‚”„9¯dÅèK̃óơwÓV~¥˜ÊAAë„̉³r‰‘†¼̣h–Ͳ£_âø $ÿÅ •”J:ï®óu- ¦ÿ¥/„Ÿ¼̀Kæ#/PtªÛW{)ØuÏ—’JKƯVm£›F5l$Ê`Ă8ŒÑF3›q/óåezyœÍă“y2ÑüÔ1$¤Nw¿:₫êxø¾̃ư³ÓÏ*YEˆ“›&?ÍùÓùÓ¯ưưùûѵ¬?t~u÷«ÿñăÿø₫đ~_ï£ưؾ~>çï¯ßÿĂå^Í«"ơ®{÷ơ₫ë÷ơ{´1t¿<₫rOû=îw°A|>ưĐÿđ¼đ¾̃ïơăáîê»;¼Ó¨ÍqæSpîÏO₫Ihu{jNư}{߉îp<€É"$Ä‚ &ֻ߷÷uUsëÚ;¸áu~}™_ú©g­đIŸ>¶ß7ï÷ơˆØmö:_ÓA–-ÏX$ÊJT„4‡ytăăôÈƯ}î’¸à)%yJ¼|ç˜f—äẾ4Â%•:gnÀÂe§}úô|~¾amôßă‹)Uù0æ9ĂfV@©Bà#™ »Ưîg¿ú™Öÿ¿₫?âbyaDæç$«Ä̀±."Á3J“J’ ëí4OÖỤ̂2Æ ¿üå/ÿú¯ÿÚ:ûŸÿó₫Ưï~—/ÍÍÙúW†₫W¢,Đ|ùŸM¦R¤̃<’D‰́\÷7,ºẨac¯ts@™·ˆ.Vna⥥ƒ‰Iä^Læ”í“Ǘ_ï ¸Å÷PäC¦{ñ¹Âµë°¾-]/j3óg£.èûköxX¥ ›‘\ >úăéx8Œ5ß~û-_Tº̉»Ư®®ëOŸ>c₫e»;7S ü••áCÄ9P\̣C {µ÷à{ÛÇÅO-ß;½cwËJU|ÄQ +SóÄUÖ™â¬@qñÉô¾…¹bàËKJ©´:N_ưµÖú7ÿơ7Ó89ï¸BHÉ\nI•ÀÔ…´0í’ùG;`|ô\•J)+UqÜ)Çß ÑEcÍ8́L2qôcJü6×-뀘¨ÑÍ]{÷áøáưîư}w_‰ Lfbkv®I˜ Ѩf§v¬*në¶Ö5³¡ŒM¶èưÜŸ§óy>On̉Jïôî¤O 5"D_&ØU»»îîưáư‡Ó‡w»w»vÇ®2Æ™ÉL³›1ó<3âaøÂX'ÙÍq'»QM§ºV¶L¯2ÁôsµWă w^‰¨SƯ^ï[Ñj¡ÑÔºV¨Đ;úqpCoúÉMÖ¿Lì³Ö[î‡QLF±l˜÷̉ˆFFé‚»¸Ë‹}¹˜K„XQµæœĂ<ÇÙxăÑ+¡4iM€Œ7çéü̉¿ôsÏF±!́DwR§;}ÇiĐ$ˆs^7\æËÙ$Eé`†ÑŒ}wz×Ê6»åŒfä‹“„#jÔuv’$*œÔ4ËÙKÿ2½Lf‚λÚäa'v-µ­h…üàIó*`PR5ªiTÓª–µ̃yvXæ¦ßI§ ÎF;‡™5T11ă19¼Iu;±«±fÏg,3â*QíÔî¾¹?Ơ§c}¬uÍ¿a´ăƠ^Ïö<¸ÁĂơÛ8qQ–5Ä5N5²CwÊ9W›زEl&ÀâPº:æ¥&ÆÈo™… ́ÅÄÚ¹Ơn2†!aPg¸)0Û™ùư³›Ăâ –W3Va)©r¾û@–±mHñÛ³Ÿ¹Âä1‘”„.b„(¢0̃\í5E‚Ø9 2­™c¹̉.ÇuGn9Eßüâ›JW///Ÿùm̃ßßw]7ÍÓçOŸs+*“7₫»üqRêfBÛè´ŒOxÏbï5nfqW̉Œ³¨ ÏV¾P9a(¢ŸnXä3dæ̉eamoCöØÉ{îr )ßû¥º³Âă*>^5'¸ ö°2VúI9:(X0©*‹]i‘Ă’¹ÀÚ˜Xh‘›¦9ƯNw§×—×§ç§Ëơ°ÆmAy’`}ù<&¢ÇbyÊfMi$/„S´È̉₫—Bîö»ÿù₫_”ṬïŸÿ>;*&s¥ï”7"Ë’W‹dăJcK¶₫áñøÿ‚÷₫ÇÇ7đ/ưÈ%f©V¡Åƒ%k!˜±“¢ơ¨èèç9zQäKü¦¼^«´\Ø­c™GRqel!rb9¿n₫xS/1 !,®bñö/úJpÏỌ̈|²Özû›cXïXx°µtX‰û%‰6@ÿ s´¢ÁŸÉ¦\‹Â–¬bˆ¥–9Y¦ùùÏ̃vƯù|¶Ö₫³­à7-|(\‡W Í̉́ÏßZ•@K{ƒweæ× <ˆWÉÜYÊrL`̉­‹ÎÍiXD”À’ fœ1bư>Ưˉ (`‘ ’”Rz©œ’$áN¸ß\óüül¬ !_h(AJ’t¶e³y6™Ă<ûÙcœa¿…Báœư8ÏósxNam.‘˜³ÿ$ÙªöX³':QêwVºjt³«w÷í}6ª¿L—çáùex̀ÀncVjB ́®›¬Tb́B˜ḷSgfê^ï)&ưsvû9r¦’& P`€àœ̀t 1aJç½óιG%² ¦’¡*q(La‚ÖÙÁ œ»ÄpkU×±öÁ;L^o}èù"Ï‘# ăF?vdoJV¡ƠT7²aª7ï‚S˜Œ3¯áƠ;oƒĂ8†Ñ§¥ÖB ¬ n¶óe¾đÉấ‚Ú±MđÁ̀æ.¿YaĂ#¹e?Η\₫Y₫[rnɪC •¨:Ơ5ªa›È°xÑozÛoF7æ¦Z&)TŒo¸RâïÚhÙ²ÓzË£j%•"%¥\©Dqxđóưß\ΈÀù»lÓ*¾øÙ,eóä'¦ƒ›hØ×û`n²µŸ¯ÑÆ̃q)¶'êtÇö굪+Ui­…‚JdĂ{–íj©ªiœú¡îŸ¯Ïă3›íp*V-j­u€0†‘ {a÷qn14©E]‹"íĂ>e™qIJ![ÙÖª®U­µB°¯¼ (P ‘<‘' ‰:Y‹Z£>̉‘q³5"Äur)Å0 >8r6Ø9̀́gJ‚&?1”éy9éF¢¬±n¨©°RB÷~„‘[ƈ0XoĐ£S»Ô{ïlˆ‘¢Bk]éD-s̃1ï‚="0È¢ˆZh́læàB¢Đ„À-"¥”"È0ă}L9èàm´S˜†JWRJ~3 ªdƠUƯ®ÚƯ5w§úÔ‰NƒæÎy<³”ù:]{×k¯ƒQjÙa'HDŒgw¾Ú«ó€ÑêC×uºÖAª‚ª̉¨[l[ll*ªl´†Œ?‡y3 ¸e^a%A" sÖ'? ~à×™‚爄9΃Îâܨ¦¥–Ơᵨy§¨EƯÉ®ÉTÉóEÉ·˜Dy†3Ëj…¼†+¡XáÇe*Ÿ^ujÇÅ%9/̣+©Ó¦Ăëïj”WäØä>bBù1é BúYZ ˆÙ›Ÿ_°R*¹Úˆ12^ ÖéYoYâ?Úqô#+RX8”f¶:V¡ẾV\,C 2(ü!pº<J)µÓVZaÅhG°`‚y Íóp`íû¬ñÉLλy¹…„ˆJ©ª®ÄỤNV‚ÅüÛ6»DŒX‚0f´–­±øÆ1®ÜXÿûÑ?Ï£„Âåƒ0)ă?üüăá°ÿơß»ßưđ;çÜZ6ñ¸uZ' ?M4œ`[óVOœÉñ?E…‡¬y(œøù:áIZ–¯ €Ä³Oçp¥¨d r‘°a-'̀0RJ ïsư—(Œơg]4ƒyf¾¶Ñ—†ÜÊ­([ºy±tr!û…,ó öă²ÁÆP¬]oóÛ¿$ù}ÿ}‰ ÿ\VY¹ÿç~̉Æ3ç ÿ–™ó¥0<,¼´²G*,RëäÙ²P²VpIV+ .:™£ŸF<¹¿L|ÊNü:©Äñ¯@ñy®_¡(ñóŒY(R£Ë'¤Ë=ÿb\.÷̣J½¹èsQ»́Oë—´—r:vSüákå<ϯ¯¯ó<ç—j­½\.ă8y₫Ó^Z¸äi¯£¡Å¢ge%n:oÚ¸Äê•‚6~±:̃×÷§êÔ©N“fËN·í]ÿ:¾^ÜåƠ¼ö®ßL¨K{²åcyÆßĂưÄÛDüị̂Ưïć_û½ÚŸªÓQ;ÙµÔ*PàƒŸüÔû₫b/½ë§0qu‘ÎƯb ˽:æ‹ß¸÷h̉§êt̉§ûê₫¡y¸«ïNƯ©«»ª®¢ˆŒÙ4ºQBuUGDÆËxù₫ơûoŸ¿}í__‡×àß³€pq—§₫é<Ÿ™;¡…~×¾{h*¬x£̉Js Öx3ñSÿi0Cˆ¡–ơ¡:œªÓ]sdž€ …jvơîXƠ¡“K`ÁApÁ‘³̉h8”(µ”J %HIb† sÁyyÁ€̃úÙ̀×éú©ÿôƯå»Á  àu~åW‰§"VTíƠ₫NßI%kYk¡÷j'îf5s&¿ fxt\đoP¡ªEƯȦQ’ J!+Y7qg3f`§Ñ!„|áh‰2ç×ÖX IƠê®»Û7û}³WRM0=Ûg–‚¸àÅj¡ï;Vw$Ê»÷É–T¨tƠƠƯ®Úª0âlæ ZG}Åkïû~î×ÿn3{:…¤—•«d!ïư s#›¶iO§SƯÔ`&3^Æá:D*%T„h…eD^S=1†Øˆæ®º{¨îëûZỖûçáùóđùóø™<Í~" -Úº„ÑÓ4½N¯—ùâ£otóƠ₫«oî¾ùÙégïïîÚ»VµZh¨¨RYè°Ơ^́ÙÇéNßÍaæ7‹é•R‚ïÀ!¡²RÛẸ̀¨‡×–”hæÎÁç1¤°Ør“bAŒ‘Ël²I Æk£Í3Œu¿“çḌsĂ|¸fæy#Ăq©¤¨»V`D®(øßeÛ€̃ơçù|¶çór6g^zÓ󔀛\{wªkDĂ#üOÆ›9ΣOªÁ ctÎq]Qn"7 W¹0æ/åÇóË3̀ÓlƒåµúñùÑ8s¹\Œ57Ưâth̃LtË̃M>Œ6́Vü–¶È¢føïº xû1`Ä€¡ÙƠ²VüàkíMNVV¬$Ÿ’2ŸCè‡eQi*ZhÊ:aưd) Ü¬oˆ̣™Gg_llw“ª–+„ {!†TŒí×̣cÙ…Åé~ĂºQdô›/~áÉË_>ç-0(_XỮÖ'Ä´8oÍăbq¡ÿ³=xú‡ÄaÜ₫`i@ R_ú%¸øl̃‚{(ÊMXùmm¡ œÁÆDKçáa^'–%£́èçëfz®Ÿd€cbàMpƒïsû?3̣¹ØË·7ç0÷]đí÷¿*nÜP!³B\Tó%úÿ)ÑLÉê)Q₫æó-Á?²S"˜]B6³SJƠuˆ}ßÿcÇJ%`Ió^zùo‡ëÇ÷Ó6É.ÿÚ|¼ ©S]Wu¼ÿI!¹¹jG7»y Ó`‡̃÷“Ÿ8I” 7ر,ËqÜqËG­êCs8T‡Ss:5§*r¤P Œ*L0́đ3¹ÉD3ûÙFËŒơ"dá÷l=̀B$ZÙ¶²ƯÉƯ^ï÷r¬ûjßê–u¢QD¶ÆçK·•‹N’ !0¹Ù{?LĂe¼œÇóy2²a«Mf33„)­ÚªƯ7ûcśT§PQ `ƒ±†“FP*YWµÖZW-bl´Åÿ@ô\˜̀t™/ÏÓóçáó—>_?÷¶¿é®ñà‘=yµ©©ne»—ûNt­h9(`tăy>?NOæélά%`nF­ê}µßƠ;îL#"‹È3 Ó019{ú”}ÁÇ0ƨ„jTSSƯª¶SŒ’GÆ®RjUïë}UWRH̃údª„â3ÛÈFâ3Φ@ĹäÄ€Z×nªa{Jˆ PA¼±f˜‡ët=ÏçÉNW{Üpu×Ñ>úF5́ËÉ‹p\|ưP *Ô•VZ±‡¦ŒRF©P)R•®H‘#7ù©Ÿû~è‡i0Æ`@ º¥ö :́Å^“‚)Lsœ§0qÂ0„áê®W{½úëƠ\¯æjœ‘BîªƯ±>>tïvïÍñP:Ưñ…ÇŒ8®74jv;uÎ%’˜€—À Gö¢ÂdÁ²z¡RU«ÛF6YÊ –¼¤Uƒó‡3Üî‹Ií…́}DHŒÑ́Xü²ÙƯß@bƠçî;o(™ă—3ăùíđÅœô…Ëî™ê‡¥©Eg4/ƒ.æÂGr°ĂèGă’îØ€µ5Ë6jQk¡)î’°r`ôăƠ^¯æz±—«½̣̀ạ‡Wü‹[J- G¬ªJὟÍ\‚?¸±cÎLܲ¡“?f26.Ekơ± ·Z­0Ö›½¡ßüÈ/¥"6MóWơWRÊÏŸ?÷Ưw<́…í¸²©ß¢ø‰̃?®$ê·ßJ¡u1È@Ÿ–0œ,_ɤî̀y[ÏxæèâÂÑ]ºº+{yă¹—ß&àfÿYcyÓ¤/¶oX²’ÖF*¬=Ö>•ƒL4*[®Å_aËÅx[đ4>Ï.–ë•GÊÿù €E3B%oJ2<*RÆÊ[tÑB‘4¼xe¦áƒ¥Đ@€IDAT¬—Eªáöj( S)ÿ· úÎÔ팤ùđ±z)«»Vü]ï×Ë¢́úǸÑ`Å÷3ƒư©ÜÛÀ¤»Íb€ơ¢,ho›7 ŒôRăèg~Ûb̣/@ÙæÏWÛfP(]B‘Ekä_d+É÷åWÊ% ]6T{€̣¢Ÿơv¹Ü K~{¹‚"¥¤JVÜKŒ3‰+ª˜,Î?μe²–¡¶ &‰,£ĂÔ·Œ#rƠA@añB.ÑăÂä»L€`ÏÁZÖLqaĂoî̀µª­dÅơ1$6¿0ïÏa¶`C_yMd3ƒ™âÏØ]‘’(µĐ\t²ă^IE‚"E$üÀoL0¬d$´Ô©Ù „à¬cđbđè#EÄ`¥’“ªùÆ4̃đIá*¢–5ûÉ0yI¡â#Éü("bj kl$¥¬u½o÷]•XXÉîÄ9ç3ÅkU×U­¥FÄa³‰ÆE0$6» e8¸“YG7Îv¶>ơ5ybcx)d&}AAB¡̉¨ÙŸiBsy_ç狹Laâå+™®î:ƯU¢â836fæáe|y{Ó»àI Í™ ¬ 5ÎP%«VµÇêxªOTYí`ƒ !H!»ºÓ•Z̀a¶ÎZgƒZèÜƯUw{¹×¨ùbà>.ÏXWÀ†ư´˜»à̉é༹L-'?]§ë‹yy_Îæ<ømvÙ°¢]¢¯ 99+¥ÚÇG£’•̉JiÅt|`ù}¸€1 ˆBGƯb[S È#$Α³` f‘ơ¡¿¸ËÅ\7°G¾Ë€c}Lg©3¡Ÿ ”_-´Îc&;Mv2.µĂ9üË£·`ù_´Á4»9Æ(…„‰§ÇÉî‹ `ă•œ³°ø'²2!ÑoHqÿ‹gư,;N•@0ù'¾¹ẹ̀| R/ẹ́eøL6ç+|]`qí’̣/4ÁØhg?' 7dâỴ*Åt³‘k:Ѳâ•3ó<åx¾«½Í™½}ÓëwæmHH~dẽ2³ǾvwØvp6Äñ‚CR¶¡@7R„ÛG\tzËÖ—^ÀVƒwĂ;ÏûuI4±mÿ̉¥‚”r¿ß#â4Mă8ÆŸnà&´]à· ÆVSQÀde…©è╲Öˆƒ´Œư6‚¼•ßÈ,ß|…No­fü±˜dt…›’àF•Ë?qíÉf´ ŒăÊÊ.ùk_¿Ø÷7€̉r}ỴÓ2lË ‹<Œ*IJk5²đ”€å₫tùØ̀\ṣ9/\„̀IM[ZaÂÆh6·"2¾Ï̀­<Ê·q¾æÖÀËñÍƯK[¸ŒiELqKi{¦eθ0vÖ đĂÙÀưå:ÈƠaº,bñ„åÉe‘¯›e†Ä*¹=¶ü>J‹\Ü"₫eáXkÓ3|̀~S€nmt3ÖÏæ7Œ·ơ—ü´ơØ?ĂƠ•ÿ?rïaÓÈSÅíª„Y˱tøwe©e.Y L¸]zjY·ºeÄ_Ë:KÆ“$RtÏè'˜ ˜ '#ŒGOH:jäƒA$¯@`©.)ë́íĂ'7yû—…Ñ|½±úJ+]‰ªVu+Û}½çø­V¶•¨˜°á½Ÿừ ¾̀égÀê yª&|#S=ẮêƯNïZÑÓA¸ñl¼́0øaôăfđ¹p̃yô¬ &EH袻kđ!çd·i%É9̀Ă4̀vîMµWLÄÈơ¡D™e“›XĂê£ç‚¤ͱ>²Ø”/ä’.Ï®Duˆé4Cf;_Í•)C£W«eƯ視µÖZ C´ÖÎv̀0˜á:_ÏÓùb.ƒ z§wµ®=xcM=‡₫rÛƠyǨ‘E®2H–‰wMW7µ¨Û³Lódf’$.cA¡Pyôλ€ÁsÎ؇{Àj´Ô,ÿ`»O…*ÄĐÏưnÜU¢’£³à +¬Œ’ñ7§%°öÀFëÁo¬±l#Ë~5ˆ(…lt³oöÇîxh¬-AÑFc̀læK¸¼¸—裈Bƒ®¨bR¥ªCu8‰X°ƒz×_Ưµ·ứ爑U¼ Ø`œá’/ Q1DŒQDàÚ †h̀ĐÏưhGNkfH-…‡®÷ư«y=Ïgă /)j¸0ÓR³/°&Íă¬ù’­̃`ÓüăƠ€EÉ܉™ÄZhỪÓ3ÑoX#Á›e$\ơ1’à*"MH¦®?Ó#fá#›e—!Øâf)d‹-K•ÍOnƯlƒƯÈ?Ëç·’U«[öîd×êv§w\x„Œ7£{Û_̀å2_7ô¶çỎê·”çc²&./uËfG[^üfŸZvÛÔßYnËu aYÑ·,ÛOÚ/6¢¥y·¢üRY‡›Q@–o”©E`—·Mẹ̀»†‡sîơơqÇO=’t{û\̉ R₫$¦ßŒ  Ÿ‹„úІR„V¦P– ß́û…œ/‹!Ñ €uè± É4X¸\ØóO­°„¹‘YlÀú{ÿ[üÙYÙÏ–'±0]%ñK…AÜ ~ ÂñIÙ”!n°ïŸéQ̣ïÙKÏ\ 1ưuÜk¥XÂú•™³œ•Üă-+c=UÛ›°d́¬÷É"®-g:¹¯¿¡ỐßCÔ °ư%o>æË%ÆíP©`́äùß$%ÆÅŸ îç%Ù†+Å·åàON â›Ñ̉‰—‹‡lÑ“Ÿóç¾~~ê‘Ùù™Äµ^<[²`î ciµQ®àÈÔn­EjïÁ’m9˜ÅPXÎq”µy³dz«"%A2œâ_ËmfI@éĐùè¤n'³²ßÓè—öA>́Ú"ef3O³ç³„—,½x’J(­t­êV·»zw¨;½kU[Sͽԕª¸xФùAï= I¹a™°,@QFVÙhún`xÁ;îÿ)©*QƠ²æˆ€ZÔ‰}Ñ:cÔ¨¹”̉Z·uÛ5ÖZà̃gđÙQ ƠÈæPîÚ»SsbC}‰2†ÈVå½ë?0¤RRØ<°« Ơª̃Ơ»JUÀ! Æ̀vfÊ¢Ö5'=Eg3÷S¶ç‹»L~â#Ÿ̃u=33áû}¯÷ïªwâa/öÉFFR‘Ï-Ó”¹dBÀD´ơavs?÷OĂÓu¾ö¦ç"‡³JÆgºÈ#Æw£_§W¶=ƯˆÙ(³–5D°̃v́Mï¢$jYïÔ®¦Z£V¨´ĐJ¨CsèÚn¿Ûïºn4!c®ươr¹ôcïO½|Jf”¼ g£DÉïb4© ́Ñ7ªáPˆÚ½oß?ÔG}lE zÓî?ư₫ûë÷ŸÆO½écŒµ¨÷jÏơŸn]2Ô'$$̀ëôú2¿\íơ2_F;̣óáđᛇo~vÿ³»æ®Æ:L¡¿ôĂ4ô¦±/¯öƠ«QkĐäAºª;vÇăîx́œQͳ”̃ô½ïG?Î~öÁÇ%J…JJ.œˆ@àÁÏ0O!q™Øá~4ăd§́¢»±Qg~3!-Ă og3÷s %È ËF5I2!4ó%sZí%̣hºldpÑÂ7W-k®(¸& L>§F;¦>½›Y”œq:¡”L}đxḤ2½œçsˆAFL&ÈNvûNd{l_ϯ₫Ơ˳Œ6¾̀/£+ª*ª^üKc›¯à+îë ¢•¬T­„d ‚…œ 棟ăŒÅ€1ø€YCrTÇÆ7½éqÀÉLsùñú#¯¥yưQB=´]ƠQ¤‚±&§mH’§öԩÆcŒÆ›Oư'ë­ ÁÁÏÜz(…XCâ¹Zû DdÑÎ8OvâlJ&öp₫1×€0¸àAJYaÄ€ˆÓgñ1Øh½ó“›8~˶¯UÍ uëṃơÆøÄ2Ê}ầ_*ㆸÍ‹¯Æg;‡Œ1×éú(¹)“–k- ÙÔM]×ï÷ï9p`²ÓèGNçໃ»*I §¬đæ«•ntóµü¯@¦>oØéÈyw³¯­T₫ âdø9Ÿ¡˜ăBfN˜ûÄ%íiAÆqQ#nøùÅä]n*ˆBˆƯn缆ÁXK°OnøÀÿ²ƠBnY®ˆ.«=—^₫ídà­ZSS¦m ]2iÁ¹È ‚Ÿœ•7ß‚B̃@?»jfv1RÆñ7%_æßđ5nèå¹’çË´đŒ#D =JJ Æ )멜Àª Xk€b¤Ÿù…`3.)œO û/ŒäU¸ë°¸™éÀ2R)áZ>ÄùØ­Mî̉?qiol;å‰k«¾„Âopêæ6ØVƠ7O¾ûo„ù[é´µ]~N9T*o{(t'PPƠóÙÏ/1ưK˜_ñjº°†WÔÚ!(¼\!² ₫¯·üü\V.<³tÄŸ‹€˜§´›ÆI&êÁjûusE•Ưưr̀—æ³…Æ—w>n‰‘$Ẹ́¦À»©Íï2·²6.Ål‘bÊ/wŘ‘S¶ûđè&½¬Ï,ˆDºơÎăø!æ”ê~X „ÈtÄZƠ’¤—̃I·V2°¡àgàÁx3ÁÄ\£ÉM<1g2â9؈Ç{½×Rw²kUÛª¶«₫’! Î†ÈÆä\`$ÍIL `ń1=:Ư=ȇV·lĐ^«:„ ¤b˦T±ä€óqÙX ¥–MƯ°~”%¼ịî—¡M@¦…P nÄÊ )Dtq ÓsưùÅ8r|„™@â¢K,RJA"+"0bA8!ƒDÀJU$H«m‹9BƠÓA×X§m;H6&ŸÄ3Ä— ضN3™F7J)¼'!r₫nŒ‘Ïœ1†9K&@! D1Dëíd&ÎPSB9éjª*"²¬GJ©=î!€"US;®\–S˜&;±r—OĦ‚$yµ×WóÚí©?Ư·÷÷ơưNïˆÈ83úñb/OăÓy>v`>Nu‡ê°Ó»è£”’Íd¥{µŸ`â0…ɳ̃^¦‹sn˜‡Nvh$Hfæ´¢ ;±³ÑFˆR ¯€¸å̀÷ƒ9D &7Íùy|~™ơäfw=_[jUT]Ó)©Ú®üÔ»^9ÇÈđt¦yCíjîê¯ÏÓóa8œÚÓ®̃i¥yưÔ•*˜É̀nöàó \ê=1a,Æ(„Øé ô¶?Ï竽³÷Ñ7¦a§©–ÚJTY|˜ăClEÛÊö(;Úq8†~ cđ‹©Ÿ³«"ˆ6P)›¬¯8©È¨as.) ’M<£ăĂË̃Ó°°̉âĐƒ!ẓ.8/½"¥AçEµ‚*Èd`{ŸüÇË]y1B6R+7óÀ&He 1P>X²\´h¡¥”iB‚—\DŒ!EMµ¢̉Ơ.́Œ3,|繄 &¥Æu4Ç2O,ù¸Ơª™‘•j•°’‹n)709w#ܸ†döQ6¹/Û̀+‚`ÛèŒ̣‘Yé¾ ¦L}Àđ0ĂŸ+­¾zøj¦xÉ́ürJŸx~Ùt#›V¶ïwï»÷ïÚwn:Ơ!¥q*Řđ+Ö{Ó3¡HIƠTM]×uU'Ú·đ]$$.orb+ƒ-®£ „0¹‰¯ `‘"·fWù¸"Oà%‚`f³©I£@%•Rªª*¡f?‹Yx̣_l¹?ê¢cZóèFÎÏâÙ‘Ưv¯öêvƠîPÍ¡ÑV$¡Ä@Á¡ó˜’S9uđĂÅ^˜ÅÙaù̃w̃ØwI‚́°‹¹ bÊÓd§Ñ³KúËÑŒ|£&‚WTI©b ÁG¯QRk&·Äu,“0Áxăg7[k£a¦6J)n ㆋ»¼̀/œÉ'rLv§HÁ’$+ɶJU’¤ŒRzÉuËhÇÙ̀ ½èụ̀Ó¨ ZJ(0¶+YƠ:q`¸»–ÄÙdŸJhƒƯËưŃ:Ñ=½é£‹×ëUz „]¨›Z ¹Ó»¹›7 vđѳ¤h0(̉‚K©e.ˆä=.û4¤; bXrÙ“Ik;xYđ๠‚*BÔ¤%Iÿ  nö³ơ–¯I–đHlœàó?È¥ÁÇ#­aŒ̀0  < <_å…7í́‹¿6g đ·ˆH‚DD¥:ÿ‹L²̃`r>ç9p¯‡åÅi}.û)ư>f»°ăªÀ°tĂ :K`ˆ9®U€àOæüKẩ+ÄM¯”›i‰˜+Uºƒi&.©Qó)†› [Ho‡w“Û'l+„̃oYÜà™/~ưÄÛæ-äÔKÎcIŸ°¢ ô„¤5‰́vz@+·œB1[àóˆÛJ Í®ë/q‡2ÂÁÑ)ïÜ¿‹2d[dÎOª̃pÑ¡À¢¹$X¿[Ïä«‚€ ¦zó³´}›©8êă è/ë§̣Ưæ··–DPàÚm鳲ߖµéæg¨^%g{‘Ål®†åÊ*›÷kíXđdry¿₫vP^ñYûú‹×_"ûT.ayx‹ơ¿xqoG{ëË₫ 0çÏe@_̃Ÿ7Ḅ̃»e[¾àÛ›ÿ =€Úcñ‹èǵÚ^¼ºÊ«.₫6EyaÉ E¯ä\ÂR€1§™ ¯̀đáOëóƒïF TcƯå±27–$%%@âƯ’æéyB½LD—rpĂ<‡Ù€±Ñ:pï¼å]‡ sŒ3Æ™ÙΣ³! ,{vöư($ïí¢uö:\Çiäs½)¤!UüY"9û™Gጉ€§çÜ̃WûNu;µăÎ+/àÄ®1Œ́ñïÁó¶*„ÈV'y5ˆ1œsœÖ ­l?¶±ûÅÏw?_½¯eM‚º §! |¬XœÚÏ}?÷çéÜÏ}€À†ÏU]Û£¬d¥«*6àgW¥¨¢uĨj¼ Pj ˜"º|ôVX¾f"Æ@”TQÄ€!Rä!@º‘#0B•((…ª¢*Ùœ²#ë§•VRIRdpè¼÷ä“› ¿~ÖÆE¼Å ’±¢JS²…á’­HùOêó!‚ fpĂƠ\/Óå:]/Ă¥ûq‡y˜í́œ3Öp‰(’BUau’§–Ú"AÑ‚ḅJZI;̀vf¶CŒ‘+Rï½sÎ:+IÎnfêQ%*®i»ª“BNn !đofxF`èQ•¨˜o¶‰FAB@çƯóǿ¼«E}×̃ơCNñtîƯÖTGˆÎ:çÜd'MÚ3â¨Pq2q…•FM’̉v€À 7ΫâÑ+•cŒ|p&3Yg)RrÉŒQ Ưˆˆ“Î×s4ñX›ªéd'”ĐÍ”?\~°ÁF1Fy&Å‹}™âTÙ¤è}§ßi­ùÈS$}æ]r]¡J­;ĐÑsÁoƒaÖ•₫™₫ÙÇưGăL?÷—éÂx´ă₫‡ótîT·WûV·œ8v¶ç«½>›ç'÷Ồͱ:~Ơ}ơUóƠ}uÿ®~WˆѬ~^/æÂÄ6æßsA—$XrF…(<ñí¾xdS¦XÉË_9E·‹a´>ÄÄæ™l¤P‘ -°$+UñÆJüb30úç[µÔZjă ›®ơ^p7œ™´‰‡Íoè%y½–¼Ç•ŒVNi‹!ï}\ä³{ˆëÀ Đ‘0¢BU‰j}U¸Ö ÚÏvÇ_?Æ5nID·~2ÛYϺ¢̀ăÁÚă¦ö(±hÙ\¹=Eq#.>߈̃€^.2¬Ïi°°¥¯D¯"• ¸ñŸÑ`ľư¤”£”ǪÄú%N_ ™<@¸a²@¡@Y;Ư¬đA'}âV}ÙLƯ¸8ms¸XÉ}ưü 0sÖó+^^èæ.WIÙ‡€m¡³ÁÁÛ²À÷̀˜&°åDÄn×±Ùè0 ùä·o§üOlàû2Ñɬ’ơLßF¹K§¥FÀäxë!Æh­ÜpÏ/ÓËóđ|™/×ù:¸Á{Ïẵâ’½ùCTLʯ¨¢HƘ3œ'7 #„ Q;Sü3³Ÿ§yç1Ø€uÔ<“ÇŒ7Œ˜91 “Ư;ưîA?Ơ‘ÿc_Ü Çf8Oçët́Àó%„Đ;Ï’ÜÙÍ Uîơ₫®¾Ó̃©"­œ1 @!AVTơñTÙ(©"Å>ô}ØËưA‡gÖ_¦R¦¥EŒs˜9èWÅuD`GN è½7̃D9‚ ăƒ>t²ăaï,!ï½#ǵ®ÙJJÉ~£ •Ö[Ÿo:æ…[o#ÄAlóß¹£î஫»÷̣ưóîùƠ¼^̀Åxăƒg´—†~J5º©U-HD]p2ÊNw¹‹œ).s˜cŒÙØQB­jQ ÈY®ük]CŒ‘—ùí³yæ.~ªÄ‚dsÛ̃ơßßa| ¯ïđƯ½º?êc#›=îßíßo&;]Íơ2_øÏ`‡4lŒ–/ăÜNekˆ³»¢„ˆ‚K ®‚…§ŸÅm›#2%ÉE>Ưz|½̣d” ÂØ­+ˆÀ ¾U-Ẃă9…‰;‰\Mf÷! –W9 ƠÛt÷ྦÖJ;‡¤œém?¸]DG7̣ ¼¶&PΦ«)„ê¦jâ’>Æbe_È_äñc¥ª*VÎ;̃ôymI¿„Bç\ |yIYÉ!y>€ %o‹´ X¿¶œ7s11ˆb²?µçóÙ̀&úÈ µÄ$ë# „¿Ï `P̉„̣˶ă*ưCA'~;Èàç¶»mă"nL“øô•Íß@f¥~mØQX°{Q‰•üU?Ûb`áq¥;…Ä:( XŒŒRC3eñf(Ç•†/7‹óâ"çBnRó¥µ~²  b,ä°:̉BX­iWle›Róoߨ-d£ü*9-y{]­Œ4(jÍü•µ¸¡—•°₫ ³-£ç/₫HÆĐeÑĂBjv 1 Cè—ư¥ñö‡ø­¶3|§mÚ!€é8Äå<Åơ–v9ĐÊ÷X ÷×)úM °éß/¿0/@đfÆWÎ́ÖOnîÿ¸j¡t"Âơ¤ç7{Óø‚V&ûm•ñm?ß9QùSkó©Đ̣2o' „’jú́}‘];s­‚KdaâÿÈDJ=!J~L aw²Í^¶R–&Û́Eh=ƒ‰('~gÂ÷ƒù÷°„ ™/›Ä»ËúCỗ3âgŸ †₫9ņ€ØbH É[#Ÿq}Q¸m!²0 {€¤ii¦ïỊ̈foƒM¦ŸH؈FBÄ¢B€ O3̀L¹àöª"ƠÊöTỴ̈đ¡ùp¯ïïª;¶ô¶`Ÿưsoû³;?›ç³93\vÁ¥ˆ¢ U¸# Á‡)LÆĐR³ºZKÍ ´xçsÇkmÁ@*E¸GHiXA”dĐR0Ñe|–YŸR´X̃@8.@“¦@Dä£>Z°.¸)NW{=ÏçË|Í|(;Ù¡F)%‹zy3öÑsn@đAUSƯÈF 0̃¼×³?ÓL %r‰ÂÆP.:ÀCA$8p*(rD¢ !¢"Ų×ûú₫¡zØÉ@a¢q̃‘OăcÆ”RÈ:Ö¤‰Íj0àf pà%«ÄJVÇêøĐ<Ü·÷î”TÉ<>@"ƯªDƠ©X85¹ •$™)‚D$Œ1"Ơ¨f§w;½ă¡G£]µkdĂ!e,YK–¯(ö±eǺæYÏl4j%/’L gBWbéºÖ5·™YÚ‘Æh(5éNv8ÑÄLî‘sí´×ûÜƠ²¾÷ûv?UÓà aûŸ²•V¥*%—C+Z®î²‡,ÿ₫TØc à ’µ̣az²âÚ̃9æÎå©”/¢àăĂK‹mуưx¶g2+ûå ­lw´c¡Noú̃ö/óËy:_Íu˜‡Á,ûĨb1̣IϺ&^‚’Í?‘I‚d2H¾¼‚%{Á˜6b^¥S’Ü"0e1oI5È₫Ư¥©„̣à-ÙZÖ6ÚÙÍu¨“¯¿3LÖg_ œ6Ă+-T³ï*Å«@)R2¦Ô…*BŒ"2p°s½®ê:¸ &7ÍaƯl\RTó^I¡¼+¥0 ^pâb¸œÛÿ¼à;ti' …+ €ÂBª¾JƠÁÚÖk?™à¾u«ĂRÆJ+­¥`ØT<»\/œ×“·¿¼béVySP܀ńö¥F~ ôcv+ô‚,J,?®°äü;À bîêÆlî‚~ï#øÇSU€>ĂZ)evm†Å‚¥$!GHƯ%ήa#^ ÉŒ|"¥Ii)ó(( /Ä5ÁRNĂÂn‚BI¼"m(J¸-u|Eùq §ZÈä Ôf¬å“qáóÙ”u†¼e¯¶F™üëRc{ñÂ_Áú‚kKó_y%•÷̀¦÷ÏĂâwR.¥—ʦSÄô˶.K€@ µN· -È5· ĂW¾ Ë¢p¥0Ư´½ËÛ¦ $AQFßÎ.–ÿ¦lËŸŸ°¶ö‹ü¢đf–WưbṭûFo›å (̣q‘˜PN΢MNV^ªpË×ß ÿ‚?VÖÙX¸§•7UÙé/=¡«»JW8OsV¶)RÉr1·m‚c\JvBÎyå¾O ”L:Wn“øè™MËç0³†Œí,^$.Óè›r_'5À¼ç·¸xÊÏû7e°cFÂsƠ"»zg¬µ³™¹eËG»‚'ü#RH>༗« n^r¾§w2p¦v̀/cAyÙå“ÈXzđÑYÇkDˆ %#"gÇ›ăûîưÇæăQ?T*¬ĐFûÏî|q—«»^Í•ĂP“Æ4«¨ỈjD£5vO›ˆˆuĂ#†Ô­L0%ÍW£GÏ ÈëxơÁ[k3©''*­“UH/°‹b}QÎeôïc Q€`ĂÓF4 ¢ @à‘} É]d²“µJRH”(¤PJUºBđbâƒwÂybÔdŒqđCïû!`@(PJ©”ârE¡@±í:„w~  E!²¤x'v­h+ªɃgIfñFƠȺª‹“Ë*5-¶ÑÆQy¹ÈË'@PB±f÷TƠ±U­)ÿđrÏSJ(rC@IRG]¹ªÖucœ@Á•a£}µ?ÖÇCuhdĂàÛ«É)=8r­lCÖÙ¼Fùè½óL„h£U¨DLÙ̀GgÓL)e%«F7Nă, >U­lYAËT¶¹ä4Ù!½èÏö¼Wû½Üơ±“Ư^îI x8öÎEÇ|­4ûạ́aá“£ë¹IĂ ½£÷©co>ÅRJ­43 ]p³›3¼N¯¯ăëëüÚÇ̃ëÁóÎ%QjÔV©Ú0đü´Đ1ÆÉL/á%øà½!ªÓ¥”J¨¦jêªîê`Ơ¬;¥ÉN³Ÿ¹¹À§•ñ%·?ø’*-RÛ),Â'rQ ‘Ơt>$¾*Ê„|ô½çĐ9tlÅÍæ»KH(Aª¨$I”Úc¤ÉK®u–ËÖyóƒK̃Ô<ø̀ƠfFZ“æJ@ }êNZëk¦Á(Ăn`)ÛÁ^¯öz1—‹ID,œqf ăÊ”@äabGÇi¸”I+ É?#"C^©rNK,´¶™dµ¢í‚zçä—~H„ơ’û¨,YÏÍ;o JäM™×í²“[v6o@äÛ~nY¼-¤!ï<7¹`kQºÂ’Â¥tSl締膪PÜV.ƯY¿ÄLRHHˆ·˜H\?¤"øÙ{ï‘§7Çy¥ ‘ȇtCU(‡ áö‹°X•”£†\ûÑ¢a_}/q­(̉JQYÔ ±° âc’ª…möQ.áREÁ•s¡Ç¸í$ÎĂæ ȾÊ0:L–X%}¿€̣7Đ“ÆR6Âq¡ơ¥M[¥ë,¤Ï×údkʲù .„-;[.h¡~ÍÆ2ËK±̣VŒ[)đZÅíë‡[´ °2‘¾<+ëé7C´²h^ï\0|©ß ﶆơÅóíWe,#¶̣`.±ÛHÉĂe"vC›+Ë€ơs·l¦c媛3”M,ÈB¿øúí¾íÇ₫7¿ưq̃Ø2-åËØ½#˜ÎËÎ?\ˆûàM4ÜĂËüÔ„ø™º4]V“{LC@f³Êmô#ëy%â ¡̉•’€’ơ‹Lká°ƠÑŒ“™f7sÚFl°!IL5^§Ë#ùvÇÉwµW¦úd¢ê†R…l´Ü[eF,;|çî,d¶\qâ÷KbŒ̀;ç! }³ÿúøơ¯îơÍñ›_;F·wùÎ|w±—̃ôI<Àû"­t§; øàG3ö¶¿Lî̀™`øâT¤îÛûcudº“;âUB1®µÁhXĐ<º‘ƒ®|đZèZÔ ¦¥f WÎëmUË_L¡¼vêM™.çùü:¿^ÍƠEǤ­l;Ơ’ Ê¡$R&«—¼Ê™hx2]$O"VIrÓKE)̀2„Gï…Ÿă|¶çÁÜ!fÀ]éªƠív ƠNï:ƯƠ¢®EÍƯnr„u£ÁĂ`2D†È9’Q’§Ñëc]$¢®í˜jCd½$ylŒ>Ù´¢m Q^ùÙz¸ëƠ]§0yđ‚D…U§ºÜípWÅJxÁnH £„Ô‚ũM8yôDÀ`À̀qN2kB"̉JK”­nơáX﻽̃עƀ̃ú¸D7„e Ă P“–Jƹ†gíi-뜇À³6‚‚å4“™RR„Đ" e':e‹-¶L0&Ùωî&îˆ_̀E’|Đªïô»SuªeM’ũíÇ}#Ḅ̃_çëy>ó¼Q€he{”ÇÚƠ²VREŒA –/66« !g†8Dçq¾ªk§»]µăƯ-ƨ‚ª±öÊGŒ @:)­ÔVfíÈƠx-.I¨)-d×|^  ¨„R°KAªœe8›Ôüh…Ê)%”vÓ|+Q9rmÖ2±H]€àñ,!)P’dE•ÎEg£ẰΡ,…7̃p"5[ø ™ãtaHÈ öiÍß©ƯûõïÛĂđÛÁ[/@́h×…î$NN¹¹G?a¼ÚëƠ]¹Uq1—̃ôÇǹhäu’s y¡hUˣѪøU¥Lƒ°*†3°æF&8Í~În7ù7 6A·eÛ½á¬cÁeÏúuG.̉so›kÙkqy”xi‘…meƃx„u]À4¥)î¾…:o¾UGJÍñ[üS–+˜ŒP8§lqmâ´VbŒRJ­µ>̀ÁGÏW%Ï-É\¬X(lmëßh¿Àg†-ß7U\nzBÎ(ÿ,3¢Må¶ô»Ù6dsÖ`3=€EElÔMÚ€L!”©ß\—+̉-Đ|>ß7Gü¶X,ù<%Ê/t½e}³öÚs›!_Ä1Kh1Ö-;÷”( HL׉)V•ªJªO₫͸p÷oü¹øØĂ _©đ†ió{ºø7¡ ùgkûSÖ qXÿ¡Lù‚,º]¼Ẹ́ûZ¹Z˼’Ï £ưrÅÉ̀–̣JƯ\²_́îom³Ê+¾œT&-o&S-,¬l4A´:G% ‘4Uuå‚“R½‰M™Ê”w%ó'Z¿ùe°ÿCÆycË Ô°¤ö¬·e€ÔÜâ©.ƒï\ #a]ƠJ*)eæ—3µ”ˆ˜÷Cdñ%ÿ .Deè™qĂ%©G6X-»rqÂÎ0Ù—z½Ï1fôf½Mj„Â܃ízøÙé ÁEdź¼đa$ơñÔœº‡‡îa§w­lÑă·/߆ØÚ/…" "Aº̉µ¬Arđêu¾^§I›ơ…1FBÚ©ƯAƠᾺ×¼ÛɳeB sœ{ÓadĐo£ƯÈ̃|p88§#q{¸ÄçyvÆ…8Ï‹cD¹đ˜Ắ¼Kăæ_ÅÈÔ£!’B 0¢BDSå¬ e|fƒ­AĂcƯä§Ñưܳ%yˆA‘ÚU;6E½oîOÍéĐvƠ®Q ·H£̃zo¼́4MưÔ_æËlæ`‚p¢µ BàÖiôÑZ;†Q ¥ƒN65ƠRHÖU )’{:—‘‚ HEUc-‚1u m*é¥"óøư¦Î_”Æ(#ŸƠXoƒ́¦%P4ºi«¶̉•2bôÁƒcŒơ–;Öi-"QTT‘&Ʊ cP`¦V°É;’5$*5܉•Iº´W{/<;üŒa´ÁaL4lA3…É‘SµB‰Ăy˜aîc¯‚BV<‡ÉÓf¾Ưl°‚Rª,³8& ²£Wï|L´ĐZi&j©yI€E#>¹‰5¦Ù88‘÷‚ó̃Ÿíù™wzwTGB°qS¤˜–o“ư@œLs¤ ²yºŒ§G?̣8bÄJV¬WÜÀ.7>øløĂÉÍ2J­Œ©È]OvÔADpÜ{bL®a&·Z-s V`Đü"SCÓ( ¤t‘j/=›÷»˜L“s À=ûÄ6Y˜cl®Âx@€*\âÅ:û£ûñÉHǬXU÷‹Càß^ŸíL½ø̀º6Z¢ƯÇ­¬&ñrùV¾k¦€i‡AÜ7<=zƒ´€Wj#Ơg,L÷ñÖÈØe¾_t0ª/÷ưÖáx̉ƯÓÓå@^ß¡:}ùÚ́'Dr=™Ư¾é‘ˆ?Lù‹í®^”ăOî×ô઻Sä;©n¬1î^‚ù¢¬yhLD´mÛr]ÖmEתQs¼óøÁª‡Ó@!œ"¨ó¿å+î¶Öö̉¸ør÷^ !đx2†‚cEw?øđúü:‡4~aƠ VˆfK*9眲Ù6†©Ki’k4A ô>c‹Àº—à[ăƠ8̃ƒ ÖÈHZTĂû́u¤½ÑưØT…ẁ\©Zc'3Ăñ9Oç£=råÛvû\?żˆ‰˜@“pÎcj«·í¶¥í¶Ư.ëå²^8«í46 ûѧđôóüó÷ùûëôúäŸÀZ)µ\óơ’/×|½¦ë­Ü —é4YçÊ¥˜f°ƯN:.˜™´="́¨I»4×¼µ ‚ÈàẦ3ơXS1{µ́OÈ€̃p)̃‘³dƒ ̀ =öÁ́ÔíÄØ1́/ĐIÉ;đÅGíÅ#5è%+0ÆFå×N>¼¯̉2zoø¡êëÓèĂ*&¦û‡T̃Ê»€aÄ÷̣*véđ̉~ĺG?`éèµxßƠú˜ơîơ©ø}PÁ? cê?îét;Ö×ïưöÆEsçf5¨u¿ï®Ư^MéÏ­×®!Ô¢8 »¨Ă:ˆï Á‹½ƒFÖ·}~¥w…N<åÉ6l¤µo=vwh ¼ơÁ‡?ưô§ăt|{ÿ|ÿ,Bí/À7)'Đ~O•9Mù8"çí VR™À˜¯îé}ûođdÀ·J-z÷¡fsÆ=ŒàH­uÇYsÛθƒ;<ù§Ÿ??~?¹°fṂ Ao‡{†¨r‰0µ_ÓºlËu½^ÖËgü¼¥Û¾‹0#¥øûñûÏÇŸ:₫ô}₫₫2½À2•zîÛöv‰¸é*ó4ÿùÛŸŸOÏ¿ÿÓd“=¹ÓÁ‚ (®4đ«´B°Ñj;_Ö"&f6Æ̀ÁY±Ú_w@ĐΤÑk ºÚx3ÖÀJ\ĐU£ÖZ)€ µ†1x&—x¹Ä ¬Q™8Øpđ‡×ĂëÏÇŸ:üô:¿>ù§ÙͶْK*)§cŒkÜđ7ÄD@v‰đf̉àT£{R¡z7KvĐÖÊëDQ0UÑzV \m±¸1²+F}đa Î;8æOît2§³=£ÆĂ²ƒ=́YsÉ%—îØ/E£µ¬:º)®ä’K)¹ÈUt¼~t@/|mdH U‡1Z¡P€°eXI‚¤J#ÈƯ_^ÿl‚)%nѰñÆ+ËN€Bkà½@H€DyüÖØÙÏÎ:)}©^ă£X¢Ü}Ö9ëÀñÎĂº!Y·x+µX¶“›)]©reˆ‘à°™(%“^́˱1É1ÎpâÊ• a€‰Ñng!„h_Œ%Ú¾ø°>³Ë’ 6ˆn¡G‡•VØpå íœàơ& çœÏÂèªr7SÖ~00ÀE1€2À‘Ó¢bXô;êzúÑôE" )«LZ«­®i]Úbư0“Ÿ ³‘°?/ơ|u±KâxJ¿©$rt8Øq¬±-­ƠæÉsăÀa«[*I †°¶¤’F¶̀îx/ îÿÀ_è'Ưª_Ô†¤ºq#$ëA˜ĂZ)edC ïáäƒú±¤§Œ́[àÏûz€ÁÀØăÿ[Ø}dÀ›™»6.: JÏc¨GYé(Ú¾‡[#,Ôç†ö₫¼â¥»–¨Ù˪1¬`dR<}p÷ÅZnuê·j₫êåĂ?:5L.¶8LăË{` µvo+K÷Ǩëv®ÎÀ­—=eè=?‚ûá+wÿ¼¯GÇÇä²¶p}È0>OÍÚ¿rO觇´ă¦¿ÉØÁz»+Æ/>\åăß’9û@ ̉ûG‡8c%Ç÷×àx¿Ï»cKwưQÚ̉ …ûxqäñ>ßëÂø-¾g*áê®ÆÓ³¦Ó˜áRÑÂh_#z@Æd'_½O~rÓÏO?ƒçăŒ³V„ù`p â/ñç¸æUÜụ́&­ô*(v¼½ơ ëơ¬ 9Ø€ĐíF•­ FT©ÜÊ–·åsùüǜ9—RRJ­µ˜D¤›J’–ï̃»“#d.ß³Ûîn×{·«Ö31ÚVV¢„sëqîtU=>_WüđÉ^üËËộâ_V˜ỗyƠÉT®©%Pnéöëû¯Ÿ·Ï÷ơư²]RMzè_Çêă­ÿ~ú₫§óŸ~>ÿüưøưe~9ø3ǯéúßa_¸¦5×\¸Xo'3½œ_₫ÍŸÿÍ·ùÛóí¹®Ơ³ÇÓ†ç ômZ%¢‡ B[À}8‚2„ë$•wna^ƠVkmà9Ê„,©É‰qf¶skẫXrI,²H°³à; ÎÜ'©Ñä¦ïÇï?úéđÓ·Ă·çéùè]Î %¥j®(R”,°˜#ZƯgĐăˆÓ“%Tˆ "°ÚÏ8₫’‹ N S3Í(QJAt|5µpÉ&ƒ[f¿:ĂÁÀœ÷Úe\T9çhăæ¶›½!^tp4ĐÔ¯e˜³¡<@Ád&0F Qµa¯eʉ’̀åH¾È$ă\Í̃j­a"ÄƯ™£‹«.Ô°–5Qr“{̣Odèe~Ù́†Í׿u¥dtÔRSNĐcˆịÓfØz;¹élΆLLqÙ–÷ơưíööÇúÇ5]AV‰5Ö(ĂCk¬ÚƯƒJ¤s|nŸÛGI=ÈXâïËï©$ø5e“O₫t Ç“;=ñÓ·úmKÛ5^?nëÇçö¹æU”¦µ€©QĂ²³•´Ò̀x9¾<[nT)•T©‚W¨P!Ăi\¸åz`ƒb²–KF¥s„©ô¹K®­fNlt C6vzqâý„vn·n4zeíơȯ÷ư¢2¤dÓNÂÇRT7…?oƯ%‰ kûd&<”ôjÜê $U¸×¼~̣'¸¦“Ÿ°È`,pp²æ@3pr'…ùÉŸ^Ov²ù7ûÛ-Ư–¸lyCäÊ~6l8M§“?-isÛ’¶¼meƒ.ë+ wvî]³y ̃°&¶ô¿ÿØ`ø¡½jÅÚ$ÿwW ́I,ùO?à̀»ă! àkœÑøOüyôƒöAa˜½µàÙb´ûcä6R0ºl•ú `¿ù̉Çï̀Œ»‰©÷«¼•ơ/öÅ(å‡ß½°Øçh'ÂÜHéâưŸ{¡¾ ´É÷~ùĐ~ç#¾ÿ$íᡯß0Aª¢½ÂôwŸŸŸŸŸŸ}đ¿üĂ/Û¶IÇ£÷ ¾Nh *=œ¼ÀCwè—×C/ÿạ́z(₫ÄC§ÏíNP1üîˆÀä¥ …2ô~H•È¡7ùè×ÉØË×¥Ÿ†±à̃!ÊJå¢={cà~sW ƠÿX<ă+̉ê“úx5«ÓI‚¿w²U,n ¥è˜ë#(•0G¼÷! Z}u•X̣+Æpî.L—NjÔ’ĐÄp­Q.ùíư‰oëm‹}’Ûß‘«¥^ûèúc@¯á;ø¨y@o²K3MÓ¦ZëơzE楒¸T§gp,ƒñ'J)±E8œˆË˽Ôh}™^¾¾ư|øùÛüíy~~À^@ÿlÉËe»¼-oïëû5 ÅEñÀjûUÑi*Á…—ĂËy>¿_^/¯‡×§éir“1ûè-̃–¼¬iẼ°aă¬gNçå­¬a5I´Ñ × •Ä MnlK?çà'sƯüO₫‰p¢K”)ÔEW–-|``;SZ1EbŒJ-%Đ´¨W¦B¥H¿èø]ÆÙϧpƯ ë̀çùù)<á+Î96ŒØx‰¨@CâjŒ-BồÄÁ„Ø¢k K WäWƨ#t[g7KΑ›`ÿ‹¡Ô"]ØêsÁĐ Ô8g­Ö“ŸíÜ\cËÖI‚&vîÂ’HJ™¥FdˆÛÚ¹¿I2•î g £ »Đê‚™[mƠT f‘¶=1.T¥[»ùêm¶X3eŸfÖÆ*‚Ø)Càи•R =Ỡ§sÎz ơ†â"^#;>¸ƒ7¾²¤ó–Rp6·¼É{ÛTH÷¾ư³Ziºc8‡s:¿¬/ß×ïï·÷Ëv¹ÄË’Ü¡nRWC‚§éé4^ëk̀ñ¯K\ÑrÊ-[¶-·å¶´ÜRN1ÅàĂä&ïư<ÏÇăñO¯ÇlMë·ëv½m·5­˜!C¦µÑlÉ V†Xă5_ÿéóŸpüá Å’q̀́­Ï.CÆP| >‹^Đ™zï·íe@±F¸ÀhK­ L̀R•‹t -tï°Ær“JỦ¸tÅî’eÉj´ÓW˜‹i¹ÀAŒ;1@I@{Á,¿M–h™’̀ aƒN†L3®9¹­Ú\jÉN&´è5 <ĐZtMk.y1Ë%^`4ûyrÓ́æÉI¹ëŸË\l™¶é@‡Ÿ§ŸsÈé`Aèn¸Äny»¦ëÛú¿2@c̀ϧŸ[k×tƠ´™Q“&ÛkßsÍ’F»úÊî(0üe>ĐB6?hT0@é(cOmc¡04ñ± R̀;¤~ïs×Ơ,‰ØDÓVwO3¨Ár]-zFÊĐÎÑÿHƠ~øÊU5úÜ(ØKÍ(0Lƒ®À©{/eøîÀB:xô¾¶Ÿiàëïà¾O÷,î…öJ„1æÛë·¿ÿû¿wνÿ₫Æêª.”‡¹̀ñơó&ư ú₫ן»₫;ħƯ‰Ï÷Ï“ïư¶F¬&Çă¥£³›½n£Gđ½‚ƒuf÷=e-½î†MN¬?*Zè̃Ưÿá « ¼F₫¥GŸ³–.Ú¥Ö¡˜Ú́è"3rùÔk] 7k©2!•¿$ióר‹;VgñdèÍ$1”d†c¦±@‰Å±=2ÓHöí^Ơ4j­Áq­ù:¼Q%èí°u¢åôË'\1sÏ”ƠïO(zÍ–̃Xé1±sîß₫Û÷/₫îï.×Ë₫Oÿ‹Ñ836»b¯é5«2rL%ao«ơÖăeâ–Dküè‡pø6{Ñ¥öÎ3s®ù#} X ¸_̀=ó η̃×̃zlä8e³Ÿîp‡S8AízN³ŸÁ¶O9Á•óI*YR«º•ûÑgëRK*:Xg€~a¬…Í×k¾"QH²9™»ƒ?NƘu[]q¾Éåj£9ª9 ^̣ZmpÚñ­¿Ø–eyi²°ˆơ $ÅÜ–›sΓG¬èƯPƯ,uÁ$ ₫ô(Ú5‰“ë́/œ8ë¬iÆ[oŒ™̀DL:t‚¶ËÔFKFß }¯è¥¾ly[ă*ι9–Z¸²i†3ƒ8D…ÈQ­µºêƒGF åÇ׸®q]¶ek,挸b•„è¡/ùr+7́°¹å‘AîŒĂ¤:)Lø[Pcꬃ3&ä\1Ö’̣ vC¨iA<WDÅÇÆW{G_ ¶¡åŒUNÖ±®©ûµÖ‘äX¶hĂËx¡;ú£æD>@e™¡I†¦¯9 Å@Ưø¨çÖÙf!́R*¹æL}¶@E‚ ˆZm±E˜K‰bee&„-ÓÑ[_’”vÎæ‹¨J°&4j‘$K=#Ä ơl“ÙͱF ó<“¡5®ëºî=iªÜ$ûOv˜Ö;”ÿµà{*ÑÈĐFᨤ¿BMÍy@ƯopÄ9“úÏh)ê#-…5̃Óđ…Ÿ^z}y­Ôâ-Æ¿u)¤äø[*ùưøxŒhS †ö…'?œÙ1#ºîL‘ww9Z‚̃I[{¿rgÑƠÑ™.èg‡ŒØ'́O•eªl€ÙIAÖaôñÿ ,\XéåÊ×hO46ơû'wÓƒvyGè¯Gа9O¯¯¯Æïw ¯†GwưƒÎ½üÁ¾óá×ứ>¢|å’1ë…2úƯÿñY×̉íá«;UfẾŸß›óŒµÓX ̃ÈF_·¯q¤̉3ơ0ă£ø¢·´>O冭±‚já1=`4+ Ă=+ Ë46̉ËaÉáÚÓ¸X¾ÔSuaz“s̃R»h̀!h½GN}¿ $d—$v@ÀàWàâ@Zk÷áO#4‡j₫!&<ÁƠA ơ­SÊ~Ă»¥÷¾ˆBóƯwеQíƯQ¤´̉3<…éßÿëÿüŸÿç¿₫ú×ß₫ûo­4 dÑÖÛÇ-ƯZ÷ë8Ú#Y 6à̀¢üĐ4ÍÉNOÓÓ)œÎá|ôG4‰¨æá­ÜÖ´‚ÁŒæ+¶1&vä2†÷ƒ;̀uʉ¦Ej 3Ÿ[º-Ị}À̃öÖ{̣ÖÚS8};|{™^îdH/ô#‚ ÖH s vƯdÉâ]S*7öäAôŸ)o´-m¹ÖëZ×Ü2T­Gî?‡óÁ&?YcuËÙ%Ú´Cđ­n~B± å·²áÚ$ }_*%K ßkŒ; d’£?§ó1î€6³´·¹P¦æ,_Ȉöxk›c‡zCL–£DQ? 6A±† ³wÖ!‡µ–Zr‰)âŒỤ̈ GƯO¦Zï¼µ.“€wZ¢„7Đo<ûỵ̈úô:Û9¿åÀA²Ù:v‹Y„zÑDë›sIΪ %H,`v1qªÉdKT¥É¦¶Øơèæ)â…£S~ÍWèt±úyö[²\¹•–s1b%MqCpD=µĂ[º11ª@(oO@ĂF‡;¼ẳ‚éöΣI&' ¼̀”[«°]q¼ÚÇsÓäĐÿá»ă Ó3ÊôPMÊ*đå?44¼‰~PÛèÏè¡x€ûúOí|=₫µÖ3́¾¿ûúT#kŸ3F®µâu±¿hÄ̀©&²ä/¹P¾C®¸çÇá,úîđ÷á>¢µÏ®•ªÓEIưyS*?°ă~¦:·–¬ûú:Ç\P<5¤a_k©₫÷Èé,~[ơ’’ƠS….÷LzcŒƠI•„ÛÚ¨™jj­¶Ytn¾^6û5 u”1àÿœư)´i*Ó_Ni¥i‘!‡Å ̉R¢„cp™)#|êÉ?¡o­Đr‚ Ø#±j@±pI—%.ÛÇụ̂~Wôæ+Ơ`ÂO‡ŸÎá|öçÉMÜ•mâÔ‡³₫xöç£;Îf>Û6!ç\̣å’.kYïÈNƯ•Â'5ƒ;ÂÿÉ=Üé`“™ÀÈGÿ₫–oŸñó=¾ÿ±ư‘[®\Ü‘1dŒy9¼|;|;…Ód'g`„e²È96l¼ñ“™ &Q&ô’Åû¿6Û¬­Ö‘;¨rMœní¶´åR/K^j«ˆÔEÖy:ŸÂéà̃y¶œ)*½@kÍôN&f¦n̉‰‘"*8èXÔ2_>{³  ÖѲ=¹\á܃̃Rm5s®\Áº ‡°^×3ÊT”ÜƠˆ$Ô¨: f[Ó+z 7ä°âÓ¨”’ṣ̃¶¤%–<í21ÅgÉ’qÓἕ ĂJ\iL\æ̣—Ó_¼ ëÛ ×|˜H™G!eé)óVt"MwÍ•«Qk¥¡Ç…b.lÈ+SAC¦rÍ6ofÇưVÑE•Ur)¦X¶“<{G ·Ü Ô󸩡Q£}Ø. ø†‚ey”“¾Jc¹pä·ÊAZ±Åœ³!ƒ@â2Ơxï¹FmÍk‰%O¹Lå0¦0Móôtx¢F)¥u[/ëåăö±Æ5åTK¼Ăb ûÛúöËå—ÿ₫ù߯ñ §,”d[̃Îá̀̀5×”ÂCf7 ­ÅÏ8†ă1‘È^Óä&Ó£ÍA[)B²•íÊ×Í÷db(/I ZÅ•*BWL‚¡̃˜“e­›fni‹%æœ –,µ ̀Îâ„kª‚]Ü2VËÖ5G–“È^ám"÷·–=™zÃä]èÇmÀ,¡u2g£\©BẠ́ùÁxiûĐc°|Ñùƒõ3¹)ÛœBJ5­e]â¡Ñ|?·O|nŒ &üŸ₫/ÿçï?¿₫₫óùă·?$Ï‘¼¨ưwơu%Áß Ó…cÚÀ^$tÁÏá+Ù?¯Œµ½% ®Ữ₫ïÆ†J=à®p£/á_­µ’ʺ¬­ =R)?DêŸ ÈđoÖ½‰|GC¨4_Dûă ùZö́í́̃_æÆµ— Ô€(D÷~ú€»F₫å9øư‡]°aGŸ´—c±÷°YiØŸ¡mÜ¡|>owŸŒÇ =₫y·m$Smơ·ßĂmy]®XÍï₫}«­ñđÅ64́‡Cœư‘uLÓĂÇ‹f$½´/̣Üá¥U,?µ4½¸Ç¾₫£Räk₫îúưôІ7w§o 5æ§"‹¶ Ń‘ơ›ÍV‹Ö5<eÉ6°C79´‡ÇVÎÈ`Đ!–gÄf³JÊ”÷\ko´ –RQô¼XTà{˜₫¦·‰’Ù@›JhɪùöÇÇôAq¹¢íñ˜£L’â§!¸^”‹•k«ØŸ˜¹î9Ä=Óº¯¿²ê©¾Đ(•Übëûï¿mo±Ä<ó̀=Ñ£ơŒ$`àc(t‹)S˜₫4ÿéùøü4?ÂËq­BWCÖ¯¼đœc°̀Ç;7~öÏÓaM›;‚q ´̉;±Ál8ØĂlfäq¶ÚrÊHÜüˆ—|;_¸ªÜp ;ëf7#ëÎ'’Æ¿=̀vÍlÙfj­`í/i¹¦ëGüØÊ[„°û ÎûËñå4ŸÎá| GPb˜¸R-¥Ä3çPB¡Â–áø¥‡±]%Aÿ-ăÖdûÚj©¨¦b‹mk[—²àPS#ôÂ'?¦Ă<Ï̃{ăMu5é:ÛIÛ¢o¾Zá)nu[êr«·µ®±Ä-mº¾©0‰ư4Ùiœ•a1Á ~dñÄ”(Åá’rÚÊ&ܳ–sËÇéØÖ&49Spq–R •b |×mƠä m¾6¦TÂûJ]Ôëdœ ̀X„«CƠ‡x,ă dĨºmµ6[̀†[j¹äíăûơ fZ–+Ôx´Â… [kñL ́i­‰h0å(\f7{ë÷™X«m ;GƒÅ&· êZ¥ZKµƠB<Ùi3[²i+–}YXûÙ̀ƒ'o«µÉ2q͵úÊVñ'?1³w~‰Ë²-·x+¥Ä[m®9ḱq:çăß½üƯÿ’ÿ¤ÿ±üñûí÷í™_[̃ˆèäO/á/ö²]₫¸ư¡¹Ø_ºù8‘½JsÁ:üó‰äµŸö>¬đ5•R4g]7Ój*NFµª¿’[©‰˜:ăcÚ0Rv‡˜2)E¶ciB±U¿„ÑC ‘uz¯î,ßÚ[¹@ÿ ç÷˜h/R¯ öQ0·ư%7)D{0ạ̀ÖÍ F˜°ÎÎf.b¥ÂgDDDÔZƯ¶ø±|"eRAËd§àĂWÅ!ʪ½+ ::RP·—L_‘Ê₫‘³–å|¯KᮕÜÚơÙZpw¼‘ă2̀\½×ÏÏÛrĂ˜FÇơ†)q`Gƒ«0¸/v~ÈÇăÏĐ]Ơ1₫ ̃GÄ4~}¤Ưç¡+_çÎOa$iÂ1)ƒï!₫éî Ưè;`z/Æ¥®DKU£ÅÇ瀲ƒ†–âi=4Ü?j Zâ²3‰ÇÙûÇûr[j«ë¶¢1U:7Ïu^/?3\åw)?r;߯ó1bzd­ư v¡ÿè^SYg¡ŸCP—åÖ0ư®ø₫®Å<̃uü…í#U„>æ8Ÿé+ £&:Ÿ`Pm¢èPXTíÊƯ7ÆG~ïàEƯtW‡è9Ê%«W\äº;²~Q?Q ™öAÁ3™ÍŒOذ#眳ÔÍRúŒRYâꬌ™,â Q ‚r“6ŸÁdĐR/lÈé@m¯½™`.&«V½QBèÜ@`“¡]ï«N¹?cŒ YÑÉ•[¹lŸÜ?™_×Rj„ÔfÛÑÓñ8ÏÇ36cTDBg§ZáS[Ëh eL*Ø€üæŸO?¯/+’ûàf O^&5bù2dfsÉkY¯ëµRơÖc2 Í©üؤƒùpôGQ÷öÅ_†½úbR̃IȨ0‘]pđ¹\÷&µ„r%–1.†(cà<îí ×±JŒQÖaicww5²¤?¦½!ç` ‹ítÁÚc :Ô.TtD U*wW̃[¥(¶+UªT¸S¦́Ù—Z’‘d˜Ä)Ô ’0¢+ư‡ÿđÿóôË/ÿˆa¾j›?àÑ~X̀ùÀq¨TM­ ʽ¸­îËÂC¡±'xg祥(FÍøí<í”RJI€˜Ùo|lôv˜‚kƯ‹«»c2ö5ơC¬“½ư· úa½1 }êS²»§=?I‘úa¬ öt§‘ă\P#wđyØ£Œåß<Ïç§³5îọ́kNăèxgï¬?̀AƯ]‹`û4‘X“‡Ÿ̀·Ü–öđ“À}<Ês™üé{|¯_ÇÅ73P˜¶¿eZ¯*¾ ¯}ÍàăñxœĂ\K½^¯½ù½€fCDH§»»‘Æ©áǯ<Œux?ẻä ÑYk¹±’s$B‹₫œ…Z+ £‰ƒ Xs÷ƠĐÜ1ÿˆî^¾Ü w#„¨‡pA&<‹Û½̃3†¥*E+13ë®ÿ‡p Êto‘*Ù™ºÓH½‘wGÄÏV¼)P±T•d¢̃¡'",Ùhíˆ9ă`ă ©̀LĐ‚́ơ0f&ZÖ3 Çtw»ce¡Ê㸱XÁTyu“Ùr¢TMµÎ‚Ị́íøí<ŸŸÏO‡'°§rÍ1ÅZj+*qa®ÜjsƠá4nÙ1¨,³“¨Ë` -́[•« ÆO®”sÆÓ &À÷*ư\·ëGüx_ßßăû5]ƠI¾₫ÇéLpŽί¯‡×çéùez9ùb5'3áBÊ%¯y½¥Ûu»ˆ £Gæé\A¸rÎyç_O¯¯ç×§ĂöÄ“#'l5oyk©•XrÎè‡1s±̃I…µ–… ½ÄckZ—´\óuoÏ“°ó½ơbéèçó|~9¼¦ĂÁ‚ïb_&‘£à"ơjNà4¶̉rÊ)' ÿëv½ÆkÊI™ÇŬ & ưpÜ™çŸNæ4Û9¸àÅÖaµlµÅcàlHÓº{çµÖ2eÔ{ñ3^×+ú£pCR|Ü|³³­¥₫vû ø·<Œ̣ø÷ØNH•QX•©”ÔHlàwÙ×µr%KÎ;gë<çy‹Ûçi®ëu‹b˜xÍ+î>9"zæ¦3=Úô€?\‡.;çöŒ¼°*"¸Í²Gê;» `8€&æmÈ%‚ÛVj™ứ3ÆT#¢‘˜çˆL+ É¥ƠA‘w´9ZkSdŦơôEâ¹-Ës¼ÄK+œP„»‰'b &,Y˜bµ̉ÈLQÑ¿pä¼ó•¯˜¯ —²Ä”Äëø>ÍO9ÿ%•´lËÇúñ±~¼­o×x]̣]Çd¦ÉL+‰;₫-ßn|»đ…˜œu“™T‹r §“?áÜ,“›Đ/0ÎI£•=”½›ß‹̀£÷épËcG°ÀÅ”;éK&0µÀẻônñ¶Æ“^9ªµ¦À9¡ƯNs₫Ëô•…§*v Æb¬öÈ«F³x{È17ÆbBE*t[ÄW uÏ´~Éab,kZß_±a~èĂ4ƒk´̉rËÉ$=€Z.æÿÓüOl8å$ï̃-Ŧ¿ơÖ‹.Ê÷Ô h#U^́ĐU4<)7¡Q¸hG"@¨t\ ˆh`@ŒMë J?¢]ÚA[L]xeÛ …ßƯ÷÷{d=bÈ̉‡ä·?²mf§+ë<<Ôø˜J:̉áÀSñĂܹ?CA©µ¿̃eƒk §`?>=S —«äă(~«p{̃̀ÖÚŸ~úéßÿûïCø/ÿåư¯ÿơ¿‚‡7¾êÖ­RG´ưøô­’KnÙD³ÅM¸wƒ½«à~¦eEüc Ù01ùzNö̃ÅW“Ä̃ÍW@ÿĐ₫§ÍIîæ'CÛ₫çןŸŸă‰¿́À€Ưÿ´­ë?üó₫ă^£sÚ tg„ƠĂXK†D¨¯·,v@V uï&P÷*Ơ{©u-Tk²̀aµƠ«gŸˆơôY’Fù̃éoÔđ>£Ê:Í'$E˜îPêÖîR\9¡É)oi[Öåăö p¤hí«U£™fÇ®Ơf¬ñ́§6A íÉÛ&ࣙÚRn4ư[¼Á@‘sºM¢W‚+GÈ·¨µ1Êr­QyeL)åcû`bÔ¢ÚÓĐkơ’‚p»øåÖkK e´E £§˜#®vv ³©C8¤)£ĐH.ëeÙ–-m¨'‘ö€uR¹—2å{đ‚ë’}ø6ṇPßI ÆB’¬W%Ï¡n¹e Lß9É©HEÄ9ÆxöÖX)#ư¼Öu¡åÚ®•+;¶lsÍ—ty[ߨÑ!N₫tÎßÏßÿt₫S)å¶Ư>Ö·ÛÛûú₫±}@vMóÏáçä̉­̃–²\̉%§ŒëWW’£?>…§s8?MO'z^†HTœíŒlXB |GJq:®­J˜14 ÍØfÁbŕpf­±“Ÿ¤Ä2p%̃̉m+HP×ơz]¯Ëº¤îbȼz5ZÛªH{º„NÚ̃‡rFI˜´H‡º·I„¦5×V$%P//Ø`‰C=Q»e‹[³²oJÑ èÇÄbhsÉà³i€ ˜ÿƒ7í¨₫­êàß‘0öáaăœ 6´Ú fѱ€‚₫‘ç¼x0½|e±Óè…¨­Ï>¢”híÛrw̉Â;¸Û¿»rÚ₫¹=8ẉ¯}ưô;6¬uØ̣#ăJÅ4t·Ç?ª£f2]1I¯¥©³gâàŸÎt/NAÿfgºÓ`®O•mÖÙi1gDU=>9¬ttïÈÙÄ>öéñ½zUáṼ‹ñ ¸~¼j÷‘mí> ¿½©ÏƯ“µƯ{p?ö)=4¤ñ ¼ 5í¹ïÓ6ÁÇ®™6ûy¼‚(q#Ǿx»̃!₫/Đß±C ¡3.°äœ[¶zÄđ…‹p¹z9̃zp_;tÀÎ:mIœ©̉Ê{`%êV'ïưlª/đe{đ&FY‚µ&Ê0«!"p1­*Ơµ®èö¡Ù ßn”0‚Äj¨íÏÖÓ^½ñ–{ö;Ï̃(ŒX§I0z÷đA¢;l±d‹µÛu­§3KÀ¸d¨5¬2FT4£÷‘Øv«{¼jÍe¶Đ„U©ºà^/Á…ëy:¯eưcûăZ®¿^j`å£9Îfyö́mµ˜ZBê§ÔO¹2m@÷.1ĂÉ,”qt¾3ej”SàÈoøZ+ Öm½Æ+¨Æ×|½–ë­̃.4™ "wü»¿̀qÉƠRŸĂ3 ÿÁĐWC7UÄe»,ié‡]/`¢S8=æ§£?íñħ¹Í¡nŒ²óo !½moŸÛç5_SIowÖ¹âD h˜o%—-mÀ7×|]Ê‚¢·~öóÓüôrxy=¾>_Ÿ^Ïóys°A„°µä–¹rkÍÑH)€~-bŒ1E  ”é«“l(Ïf>ăS›L2µƠÍl¹äL¹äBÈRåkÜ̉¶¦uKÊl]± Đ%•ɘKâÁW¬!»]­9çÏÏO 4ÙlµÍ4t́ ôỗ;ç:ènhOâéC¶aÉ¢^Î%"°MZk(”}bUdÙzï}óà’»¬i©ûÖLỪ—+ Ô bûhzë±ó1đL°J°Â„&;yëA€Ô´́\³1†›¬Û€˜dhj“êƯ™8„àÈQ!’3UV CÆGBµç¦ë­¬ö*IêlXƯÁ›•+¼˜WÖ[¶K[§ ¡œv${¸Å—éǻϳ™9® M6J•#ăÎ<;v³›£»½åÛ̉àÑËv¹¬—ßo¿cÜäÙæĂ䧗Ëάnù¶æư&yçy«Ü`c‹%—Xâ%]~_÷Æ£8‡‹“?¡ªvÖáơÎv.¶W`Ú›Úδ­=ÍP¶oÆ@›n=˜Ăä§vlđ&ÚÊvÛn·xC…yÛnđ]ƯâöP Đ}Ă5­[̃´÷Œ„D¨ŸQ́‘¦·ŒAp­2+kµi% y‘9!$ᮀà¤U9×.Œf›î :f—ézg‘IøL÷3ÇÚZ•£̃¹À}ûwü±ÚSñT­µ~ö)¥u] S:H½kîưj:¡Z ŒíN£¹Fƒ¹Úˆˆº'éØûß ƒ̃ÇÔ67+–Dƒbè÷ÖgƯM‡è\ô@?Ù­—†¸ŒFxüĂ1‚OỞ†÷ï¸÷+­Kf_O¢Búî=(EØ#èhƠS¡ËrưÇúG¢ö₫ùöêø:Gz¾̣¯¯p?.ơ₫ÇH?`ù+0•»ûí/´ÏAÚƯK¿>ơ¡n3¶öÇ/́„¿¡Á?‚₫QÅBCÖrÚ´ 0ÆÔTă5ÖRJªđëáÑhmÜû«j] ´ª6gª2²z°Ï#ÍlmĂó.™€I°¢|ùØ›Ù8”X&0™Qį€bnÑÑ̃Ëäq?£µỤ̂˜tr 'ر«ÿg©ek[ÊiGü°€èq3/́=ưBuG !Óá>‡ÉLè÷K%u¯\âÑŸq|Çxaîªb́£…+|âï–ȶϯÁ…¨­ê­(’bĂdm£Eß½X·̀évÛkŒ1‡ùB.Ài? *ÿd'E0¯·MâuÀ‹…¿ •^?0ñ„ÿ 3e.O=̃•›56·́’ÙO%ôA·$̃…KZnñ óJ—gL˜̀ṭ§ŸƯϯü|0dà/ÎÚ*Fö×xEÚÀ5^¯ù /ö* rÙ¾Hܦ=ø0ÑZ0ƠÀă<æ› ·ơím}{ß̃¯ñº–׿5Ö;ï«% 6æÊ¥–-o·t[Ë*BêqßÁXđ¯Ç×oçoßÏß_O¯çĂù|8Ï~ViµäÈ¢ï̃: Ä‚°óË×B2‹z\¶H™f:†ăÑÏö|´Ç#=y®œsΜ©ÑBK2©YazÄ”ƠM•;;Y¿ ¨`Q’k)ă [̃`§ư†pës¥B0°ÆJS ăoḱù|!įË5-b²²Yr”›ô¨¸°É&ºˆÜ¨”SÉĂ” B3-“#Ø“2ÑDĂ"6Ûél Tox¹ÙÙ‰´£Yꡉ×$–¾=z̀Xù%›[6Ơ¸"¾±F,¤Pmí[¯÷̃’­±fdâ|ie«éÇXđSÀªÈFÜ“zpƠNó ®#êÏÚ¤¹ÎG{<¦ăƠÈía1½%.ŸÛ'Úó¯óëëü`1US³Í{Ơ2úz;ˆdo›„Ç̀au+ä."miú– bƠò&cÍ́gDV-yÑH "²Ơ–Z&;Áïk^ ™kº ÑÈLp~̣O§pz O''•́z í;OÅ”Ä ©‹˜ ́l̉V`o Ûđb IƉѳµ†Íæ™æótFƒÀ-̃–¸,ë’KÆ5‰=å®·ƯA[å*ó.¢F-Öh’Ñ¿"vCˆ7̃9'têøIÖC•Œ—ƠÀU‡Lî’ ¸©1‹t2wÜ­²½²p0å-ƒΡdw½sÛäÔĂP2·¼n«“q{:`?³Ü}k è§4ơ~Xè¯6Î;79 ÇH£F?J #ºO €ÓñägO.Ÿ¥ íÑ<@ÿ{ÆÄ¥ÎÉçƒ~@ Ô cĂ6Xố-T=FFV¼ñëcCY+|C÷̉‚vƯơhÜwú́‰•÷Áö×̣àË©y茻ñ°»ßưtÛ;襕··ôÿÚårŸù®_ßñÄY@?¦U©ÂF½(-Ú#âjÔ9èc=·f¯ ['kK_/º§ốÍ›n‹D]B¤×ƠÑ7iäóÈ&Ụ́Æ̀³›ïÆX,t:-04ÍA L±Uv£Đ$xxă­±²Ử~ájû‡h?¤8b»>©ÈV=ÚÛƯJ³Ÿz/¿ve-¨/Ư¯‚–IU9‹̀ïüd'iŸ˜€eB8ưÄB*÷·º¡ï/9B](Y†."b›Ă¥ çd&t1%W/E¼ü̉$̉5Qßf:@ô”M ‚p´¸í7=ă%Œ¥¹µĐ±£ÊqtN‰Ç‘_l(z7E\D¤©BØoŒ5̃z±Ü.±´‚³÷ÉLG{„{&7–Ü¢b¥ˆ«*C"áh2å–SKàílU3£áçK-y´4Ù¢ôQWÀ0 $ ­ÉMpz /¯æơHǃ?8ï3LD±vÂ=è₫Û.́kY·ºá®‘IÙh°ñ́=y„XƠZ·º•V–²\Óơm{ûcưăm}ûX?>×Oäáw½ơ‰R¨!•´-j ’+1µ„³jŒ 6Lv:¸Ăy:?Ÿ~úùûÓ÷×óëùx>„ƒw}n¡çª\Œàª„‰ å¬×½•+ UWsËƠjúà{8ØĂÙœ…@Á5fB1¥”’[Î&WSÁæ—a_ǹ±eá}AÔ°ÙM&î_m¡üæÆ™3:ͧ§óÓ!Öm}{3Ådîæ̀R?×*Œf„4Ïv>xăÅ#Ñ́è ₫×p)¨µ–\ H¹¦ë%^>âÇ%^`‚yK·k¼~¬¿ú_Ïáümúörxy™_; T”9G’đ;ÀèqGƒu6çC8$—Ö²̃̀ )T©¦k¹^ÚEê+ëEë̀d&6́²[˺eqöÄ́ €IrÙë~$¯éú¹}6Ó6Mv:º£”₫töç³;£èưŒá 3t”]LI”"Åh¢¿@̣.\Ö¡‡­/bl=’\a­gïƒ?†ăÓ,*) –m¹m7…$ªo tîH£ï­è¡D”ˆˆĐ@nJv7`•‹‡úmHMB2°²Ơjl±­´ƒ̀yrÜer%#u® p&¥6pÖ‚m7YhI-¥ë¬q&·üö₫¦” [÷ßwAµh]/©½Ç§PmB°Qwú7ơö¹º„)HÉ̀4$}Ơ0óóü|x:ä”o¿ßt©yÉóư¨êxA¬!Ä…>|WÄ{m÷'¥;‚Hí‘6‚åh‡CC^+ØwÇN?ƯuˆŸ1©1‚ä ¾<Ô^ôÂIồư¬g4Ẻ)C«-/ùº\´|ÇaêÏénhđ  ƒ/Z#Ơg¯@F ?Z ơ¯ ©§ŸÁX4Œl˜q“(OcŸ Ưw÷´­{Yy?R̉ ơ¯íüñ+wWäÿ}”Û[cÑâ“ÉNÁ½_ơÉ+¸Ü±>ÊwE¥j‚5Nµªc›ÿ^ª"ÿç#¨´í÷ÿ~6‰¹'Âb=úN›́4w<çZk.°C!…ŸÆ–6h(¿¦scØ*¼L¸%Úy6óÁf;OÙivs0K'Fêà,e¹•hĐÔfb¿Á„—¶lC›€”V<2ê:Gα §ç“?Í~FËö3Hä̀ ‡JáæÆë—[¾]̉å3}~–O:CF OW3MM{ল¶5s¾•Û%]>ậË.ëåº]oéVj¡FÖZÇ=“€u)íK¦F¯Óëóôü|x~9½|;{}z}9½Ç)L¢|(%ÅSỤ̈†±»Ø¶€xÖØ5‡‘E°æîk]ÉS-µQÅh-øvølpäf]u¼©¦– "Vâ´µ ½=XAăî“Z_6™ ÑÀaâ)P@Ä›±¢lóä¦ä²í¨‘#×ZË9£œ[Ë#Ă–Ñz‡(Ù’µÍ>Ÿçăº®9çmÛ¶$²]̀”P‚€âz–c̉t“e{M×%.§í„Ôäçăólg´B<ûf;vÆ%'>x]¢Ô'éô©ËwûØmi%´0Ù)”pË·­l`‡o¼)£n˜cơƠ$m f5ñä}0µƠ·Zêñ|üÓŸÿt>ß₫x»^¯đ>¢îz'F­‰gn–Ư]f¡Í6“¬µR¡´–e¶H%€Û7—|‹7¨r_ÿcûc) Ö̀?Ö?˜øà'zÏÏÓóËáå4$‡®µÄ é¿·í†l&nÜÔ͘;Øp2§Ó|*­@xsMW´%/ȓʭ1¦™æØ5nlY[BÜ5 hUÄ/ṇ̃Çí?n€¾XRỴ̉Îï̃z$~œüédOO₫éäNg>ÚăÑg;O~B+q ÖXÏ~¢)™9neĂÇ•VD=+V÷¦;Ô¡ Æ àêHpá4Ă¹ <Ƕ´A7,lÆơºæµæuôkE„­5X¦^ÛU+n— ÇÉíÓï;klT̃o9×\+mÎs)E†Iôl1G8[́¦Ø ₫‚Àeœk­3,Ó4M>øÆÍV+ÊơÁëj=e±2³%©÷¼ñ(ÿt@‘˜%æ¬$%myĂ=‚•bº̉5Æø€œÇFø§™÷T2]nvnvDĂw4ÂơŒÿ+›ú…[½Ÿ+¬÷ˆ÷-^É̃Ơ´ÖđóÇN¼rîÛ`$3;Ǵ đøâ 4øÊCó₫+Tæÿapÿ­ư‹=‹€9Ydïqÿă@à+ci,hÚưs½çêÜ•íñXŒ—‰–D|o·Ï]§‹ĂêöĂw•¼…s9ù‰ ƒ{‡o©–t¬ GO½¾Ô5¼‘ÑKÁư¨V²Ó̃ /Aêµïû»ß%P˜*Á%©Ăf7çÁâ›bJ©ÔKQ‚ V Á—Đ•v›âR¶•Kü~¼;ñ.6@ÿµ®kYáAy¬€₫¨ưa‚! Æ/‚)ĐlæÙÎ2ä±" .øà3ƠƠÄ ¤‘Zk*éº\/ëå–nH øÈk]U!zI}²ÑÀ†N.QZi-­©‰«æe»|®Ÿè1ƒ–™Ç7¬ưáp?bÓÖ”‹OóÓ·Ă·çăóËñåơéơùô|>ç0{ç¹qιä²Å I«x•½vÍIùgd˜)fʽg?™‰»*4ÔÉ8‡3$ûêÑ_„\s¤¸µ-‘d)€DÇ]g"{FÍ7’Ël퀸Zw ¹ÙXÁ[Zi(À2 6lv›Êá2±º|ÜbëçZSƯ–«Ÿ `±‚âHD¨d„¾\ïlÎ •[ºẠ±¤e×p ó<·Ọ̈™8˜`É0ˆ“ülg‹^YRJQK+Y !CÀU'ÎEÅarnam5Ö¨‰jc‚P9Ë­VzCSɱ+¥°á5¯´̉Ç̣3.¥;áDÙ¯I€Ă"Dù₫x¬ÇÙÏ̃y 4DWÍTMmVz1GøœŸ¿çï(̃·÷·ÛÛÛúvÉ—[¾­e_î}{K8]O%!å€ /9権À—xÑë+*R±-Û'ÿ„1ÑjW,’©$˜¥*€Óưwu24ÓO₫éezùŸ₫§Jơ3 aé}{Ç~tËr |Øw÷~p‡“;ÜéhOáéTNpổ”µĐ8"Û[ä<ûƠ¬Î:Ü ZêØ¶µƯní'ô¡Ă€³PND“™Üä X€ÜYxX+ ½ÀđAAë`·RËÚÖ­lÁ„àB,1˜àœóYœEú…«TßhW Jqa™ ùàmµ>{”4S’sz¯*•„«‹“́S03ÅôăPS™W(ßlä ©¹-FúØÂp_K˜7•­S^ñîÇJ»Ă©Î̀ñô*Ơe[¨Đ1ȸà HØÂéÖß₫øü#Ơ·¸–Ơ°‘ aˆV¨ö`<ºÿ̀=³H¾^öN+voẪÏ vzÏÈ&j;6 íÇ̃´ ̉A_*Â}a°ĂŒ¡‹ ,hz‰µß?Ü‹ö/~DxÔĂ¼†ºly¸‡ áËï¥ÂÏøä¨»ÊŒ¿;;@àôÓqz¥çCùJ/ƒK@1Dá0|đ­´Ûí¦*uI>z} “¦;öÿ`S¥ŸĐ¿ư¯-™«’Xéc1R@ 9²áÁ\¼VIJ‰=nf 2Ô˜Û÷}áï™f¨ík™Rkô1U3' ö”=µAÄd°°îŒCQ‹d­Cbè²-Âäi»(mĐ¹‰-è¤Î®c}3Íví<Ñ4™)PøĐ2AŒàó¬uÅûR–­JË,#<%Ử”E-ï_ Bp€K¦ UÜ̃Ö0„(å» ’d’Øj'û&æ‰X”¥i-œFRI\˜ ç đ@‰ẮœĂƒù2X₫°‘½¹´™•%Đ¿[d4`úŸ Ë=TÁ¶B¨Chk¬₫¼ dƒ6™‰™E|BBCRĐN\-®$“ˆ¨”bi¹åœk®1G°t®éú‘>.ơ’jjÜÀW=€~láÖZ²TMÑË—àx»n×[¼Á²|âÙÏÔlå~©6ˆh_Q—`wưùezy=½¾_ŸÏ¯ç×çÓóñpœĂlá&Æ·¸ÆUĐƯÓ¦ŒÙáÚiƯ“¤f*„³ƒ³LDf,“Ÿf7Âng~§Ô)â}k[ª©piÜPn9rÜ)ª:v€ưỊ̂¾gT¢J\ÙZ[¹–V„;ËÔ\3d…ÎÖX—7>¹$•p%p{f;{ă·Ï-̃bZ“²n ôÑ…XÂvçàvæáH$‰bƯmsOñä&WJÙê8Xc=yO~2S¦ üetjt5dÀÀ‚Ï’+¨ ©››1Ö¸â@/,¥4j+V"̃z»C½6D§ËÔ¨Yk —VÛårỴ̀qûˆ-Â0@ïkĂÆ6‹¹ªÉK-”egD1KœĂ<»Ùç7ôïq˜\¥F§ùô||₫¿_Ö‹¨\Ö÷Ïø‰V},q«Û’Ï%ǻgx 2(‡„LÅFo LQ”¬cg¸µÊ _31íƠ²7Ayï kÿ~ă}­¯h÷\¶ËÇöÁ:>k]sÊkY—¼|σ;\Ûơ™C ¦ô@V#8ĂÆ0Í Ó F²™6)Ñâc+lƯϯ]‡{`pPc½÷Æ»à&;ÁMÈ{K[¬1ç¬ê[¬!ê!ƯœÚ0ŸôƠg“]q¨ô ·Q¥²ÂKÁ Ê3©bU¢u¼Ú|ơ«ä’sαFộQ'·̉´qÆY²ä;½¿yYs ́₫́x§÷ûQÚXM\t©®̃Ü2B¾]u¸C±¨/*߇µa[¿¥vF1ă®)ç¼–UÛ>;BṂ€nñö₫ñ¾n+ö ¯iÏHk€IDATÏ¿ ¡9ûÀËàAX¼× ƒưúăhœ!Œƒ‚N¿SŒß¢îZ®ú̉‘#p÷¢î=ÓơÔïđv0ZÜM}†0ªéK½ábí±ËO1=€y§±?`đ·NW¨{Áñø±ÊŒö¾›W!́Úˆ{ñwR₫ă@ˆ†¦ËƯºKiG̉rĐdíZ3h_'¸`Œ)T`Ç₫ưåûOß:·ëí¯ưëívÛ«ĂAÑ;^C4È̀¹=ĂWˆîFHû/¶»zH7¤gc áÜo4$|°¸̉6Ơ`mx "'KçCˆzµ›ë·½HƯ¯-]³:E~·̀îeNŒe‘ˆv/d³')ª›º4˜»h,±™V¸Üâí²\ĉÿ^Ænz(#nH°z&;¡-:Ûù`{˜yó§@`[Û¶Öuk]—¼ÜÊ ^̣HŸQ ƒ¶²€ơ© ¬EZdöNm¹1úÄĐÀ8°¾”$×[C¡;o2äDÖ–)Ç t½Hœs•*¬H¶´mu‹4«~,6@9‡ÆèØÚ¹2DϨ—<‰Ù%*±T̉ÚÖXbl1QªTÙ0ˆF`¬3‹[¨8;å˜J*¥pcÇÎ;/É =†Y'Ú@x™r¢„nt € Øk¡L5×cÎyIËçöù?/ù²´%µk? IÉÛnaŒsnrÓ<Í!ls­˜̃/ă{+­˜l¸p³mâ íḅÍ£ÙÑ[ôî=”´rmUªÓ\P bƯ3l*Wmc³ÎWﲋ&b„KøÂ%Ơd…œ]%72Sk Âô\󺬩¦5­¥d÷b•ÀÊ„Ë/Ó̃bkµÁ˜H™9d̀ñĐï A˜ˆ TÀFÍ[ï¼›Ă|ÏÏñùûúŸÛçGü¸¦ë­ÜЧßʶæƠGq-Ö 6ܨ•\;Û,V$9A\+±t7j“Û{äXÿ­±3ÏÅH‹Wƒ…₫D„̀.¥ĂSÁ‘#CG|=¾j­ïëûÛí Ó̀Ç Æ­mÙæÈÑ7Ï™æp0‡Ù̀©({½–+¶Yñq6n£Í³Ù MØ[#4ÊÆD'`\°RáđàU2“›`R”|’ ±¼Å…‚öÖVB¥–ÚZ«¦úês† 8; ç˜jD.¬³&üº0æj®6¤P;ëÈi¦”â‹ÇUM”ˆĐP[ÛbïÜơxPj?F»ƯÔ[ÍFU!d!ÊP7c|ơÎ8_w-¢˜YÙ€UZ‚I B-ˆH¬ºkÂ\TRü¼f@ƠV—Ûr[o¨²0ĐÊ%wÊNØ®w]Ú‡¦̀Ăp`, àÖÿ ù;â~Ơjîø°Z$Œ]i!´}n °á+úÅăÜwɹ˽îúä|WººÜÓ±x(´¤Ê7¦I?̀FZ̉ë3} ­uÚè²_÷¢öáơ´ĐÚ]ɳ_xïúăÇ Ë;â{s]ÙöCI'¥a3̀l%¢¿üü—ó¯ÿÍÓÓÓ?ÿÓ?/—¥¦º_ÆR÷å&¼±¡d|èîïO¾×;Ü7^B” ¬"«±*£=»‚>»9ÀnøƠKöQ¼»“Oh÷úÙGí«¸‡d&(‹÷#`ŒB|îÙ+zp‰Ô,“Áú9®eçñ+Ë"LÁX“Rép„₫Ô™ĐĐ™ 5äÁö8ó<›´~Kî̀*ư·z»ƠÛµ^—²À̀Q¬]̣Nî»Vz~EJ5½!»M5$˜Zàø×VqNÑPÇ5¬íÍÛ™=₫fgŒ´f­=ù¬ 1ÿ|ưg¿~¹œ‚ G½®¯ŸëçÛíí®×tEt×V¶BæÈ¡†êª³₫(à±z”Rv‘·N°)­\ÓơcûÉäà‡ v=Đ¹†ȉד¶r•?‰Á`«­PI&Ùj/cỡÿƯáï₫₫ơï™øưö₫ëơ׿^ÿúûí÷-m€}¥•%/©&KÖV{3742f'&`Ü †:w9\- "ï­_i…UÀf6ÆÎ{ewÎwmD<Ö́DàD¡|2H²fç/vo½U?ÆÂ(~A®¶ZL*Áj$E,6ØdZBQ÷ %ç`U‘ ²ÇÆ»êJ-S´¤Ät “]ÏF"̀ÅUÊg²¨b&;ë:ˆ•¿.E{‘fM²˜ƒ˜'æflß“›‡ÙÎʽ¤.tÁI–‚"4à÷ơ½ÔK†5uc†’T²oÙÆ8ç˜yÛ¶&₫®>{đuđ¿[|É%x(Æ’cܦwnöưđ_ ƒ*TÓ pW>T<¦ëc47Ràôó% Ÿº±û(è #¹h(đ(Û%"6<…‰ˆRI)¦̃₫ `2FÆöóXÛè?¥3ª±½ë¿Ó0x¿?÷± ïU¥ø.éøz‚Áô'"*oñÆëơưjª™Üôƒfÿ0ưßú;ùÓpÄ”°ÀM’́îZØÑ«&™£ơ\[t°Ö€`7Nèd2Ă$É#ưùŒ̃X{=©Ö¿M¦̉{ÁM’D¨×½§ư½15ª¥j±!Ï e‹9¢·§ "iơơNL‘3£TÀÇ̣*¾1Ǽa¶3ĬXñg3ĂÉôœJu¥Í~túoå¶”eÉËRtúÁï©“6H·ĂtŨ§đt¿!X  Îʃ=Lq²¤ñoŒr¢œ5y²/rÓKÚŃ‚ ×x}Û̃đ©$@mÜ>8Og8¥@g)Iö‘ĂVbbđ%îpàĂÜæ)O>‰Ö¶Ö ‡ŸD)¶˜9S›à~¶ «™Z¤ˆ®¿X°ƾ‹åp?è7Àk^ÁFeĂÖZØ®§’¤ƯX9¥™Úđ±EA–'µ±qââüq>b[ .Âạ<₫ßK)­6S'ïŒĂ¨»—=¼’J-)§ëv}[ßֲ·ĂaK)Ÿrîiú›ôđˆ[i%•\3Nưư䇃O₫̣yÁLỌVÓÚË tœ[Ù`s´$9>¸‹©Q¦lÙb©„ŒÄ#̀u\–aKgƯàsn̉ZV_?LÛq3³#‡ ‡†œ¾X+×”ä9Œ€æYJiÊ »ËÁ´f¥¿cØå̃øls©GC%:´ lÀVU)ú:©Í4 ñj«©¦­l œ!Äóá¶mµ5ÓZmăTå³DÄ ™Jµe *Ñ´Ô0²eØ̃äĂh¨¦qά}Ç’‹³®Yé‰ùæ›iøª?\¸`̃¥öh²,w*<{öÔưûđ´Ñ0Ö´¯V[.YƠ ª̣¢F(tQª(KHÛTPxXgó‘ Oqă|tG‰€´©e"¡‚ª!₫˜F:MXØ[OiÈ5saS ![-ª—ÏơósûƠSuGhiMv̉mb§€¸eúÛ ]bB²„aódóá//Y¢d_¶Ëöh¼jêF^rä8™ijS0!´ZW70¿ÇΓŸhhy^Ưº™m6óÍÜ6»k\bܪFÅmđ₫ŒŸJ׆ åà,¶ 9,*`NËà ”KFíXrD|ÛœG YNĐ`ưæ±…:’~X́_Qb'iv¬ôsÓ­J$Bㆻ@n®^đüT÷J£Ñx 4^w*£₫¼S>ÆX%Ü1– Ïóü¯₫Ơ¿N)¾½½ưúë¯_ü=ûgÀú&ơM<7ï§$û¹ï~=^c5&çRÿyÏÛ-¢đŸ¤mÙ~ûçß.áry¿påÉMú€#{u÷ôÏÇÊ„z—]pđ_WªI½~§jmº)qB›(Ê>½ñT¡KƯ¹vd2=9̃z¶|-€ »§ØP2̣¨® qÛÂl2îươ‘$&ö *U„=rđ‡Ù̀ …‡*zá'¨`N2¹(ç–ÁđYë ÜË7QÂÁ½¤ÆñùèxJ™W#YPWêIă+J=^ƆËzAên$k=eU©?3c¿¼¤‹%ë²[̣kÔÛ×stÇÙÍÁˆù&;Y¶\8æ¨öhè`êƒv Ăœg(‘.‰—[̀”#ÅÂ¥°@¶l­¶Ê¬¶#“f á„‹Ö.h}áUÀœ¾=K^–¸À:°QCkÖ7/X–#rvSN Íç,ûÄjĐ1ÏA‹Æ üÂ1wG)©ÜȬèæ-½ÀºŚä‚©Âg¼xß̃—´¡Ÿ~ú₫—¿üƯí¶\₫_à*EƠ:-täL1”E OÆZ+{v́*UO›Êhë±CÈÖ`ä·åm‰Ë-vwÅ’PăIgƯ×\jÉæ´úÈp¯à ̀4»]£ÿz‡¼×‚G–è@Ë•*ƥȕÉÄÅ”æ6˜q6%}•9ö•Y<́‰VpU?!Äd¦à‚'/#Í&¯\đX#º}B£2‘CƠ­P²R¡NQ‘%[Mµd‘H÷I«ôwđÚ¥†iB¤À×=¨4†›´?Æí …Ø\:z†ßHcÛD„MD(ª©èÈeÆUöiºc:®iÜdAVÿ46!££>̀œK+±D*“ƯUUØ#à ^´-b‹Xù¥ĂSY ÁX̀1±+¡ÄÂ"PJQĉ¡®‚fL>SĨøÍm³ađ:)ªˆ“aa9d-YTx›í ¤q.ç§ăÓëöºlË—%.?‚†̃ZK”àa•(…à “\d Ư˓ϔ'RK‘âÊk´q¥uµư½Ë¦"×,T¨ˆ M”À/–ñ—Dî [.¼ç7 y•Œ5v́‚ɆX›vmj­†M69rôƠGƠ3cŸ³áê²DJŸCK¡J0(X‰uŸM1ª»Æ£<°öƠTÄ*úK/S@‹u¢ˆ°̣9„a¨QHƒ¯î\_áå\kÍ”©•X4>¬ ( Qˆu¯±Á…‰&Exđ%-hUḥX‘•j¬ñÊW±‡àøK<w#Tzđ́ÿJÍØg÷’…ø!U¢£Ạ̈ñ'ïĐăùBc\ñÙ"̀L\¸(„ ÅÍ«öøÇbàKA´—QJÜÉÆ 9,Áw`~(đ§yú—ÿê_®·[)å×_9ưăç;8fRR¾2™ÆBG_< ”º×Ñ~°èA¼åđ89eÜư| ­é=¾ă^E×JÏ TŸq”³_%C"ÂÍN†âW«½6 6Ă]é\˜jˆßzÖqÜü·z[óz«úoù¦¹`ß×À¦#<£†kÜG.¼G Ẹ̈J2ĐØD®˜´z™¤W…jË_j—èhƠ¤ côđ^[}Û̃hĐÀxëƠàèÉ?=…§ÙÎÖZn ë$ñ¹+Á«ĐnBl;¹i¢É‘£J̉lŸà#ú”dˆƯî8\*ª$¹ôà©—t(TvKí ón(ö>âÇgüTf ĐŒµÖ“o¹ƠZÅ%gØØA|‰›erÓÁ₫p‡S8§àC­€w~„₫*-E[ơ `ϾË»£’›SJ·tû\?ß×÷÷ơư®`$ŸÏç?ÿåÏïïïÜ™'ÀÈxé˜l Đ«¨Wn±[jªÁüQkE•ˆ¤´ÂQ¤áU‹ê oà¼êU*HcYy2­ïî5µ*˜©Mèbà¦dké V±äĂŦÓv}¯­"Á¡´¢2qÑV~0¨ï¾€:/7¹\%ƠˆÈ6Ë̀¶X©XA2pÂÂbHj­¥”d̉lç5¯Áxïîû]¥M*×j*FrÏÂîĐZæ ­Ä(ÇƯ¸É܃InFÄ2h_­ñ̃0ư‰5*µ†t í7åa¾¡¯¥U¨<µz¼Ơ›e ,‚ÙQ£í£ô¶VÉi"Iù]’ƠªÇ Üm4ÙDZÍ"ÜD\7†oÎ:,̣S˜rɰ©•r®‘©ÆäN0 s˜ÙÍ=›%9ñâF s¶[ºỰmMëZVmˆly“‹+µUd'k ƒGMï|seSºă„éÊ–wÇéĂÓÏíóº]—¸́!wµbÜbL7Î\ q8@2®G®uÓç##ÅhăÚÖƠ¬›ÙÖºn~[óºÖ˜×ÁºT¤ª‘ăªi§8nà@j?{dÇyhzövŒ¤GÛ=ß,“ ±è±.˜%v¾•é¢́­Vø3Z›AÊ¢ ¬”zFgH±ơX²Âøí„{|’)K u`,ƒ„™€8ûY+â%ˆI8Bđ#Êb *ñƵlu“RWñ’•Å4!xRÏnY6̉6 ¸ºc¡v׼旼,ó²¤LcpƤ é#ÜÑè¡(Ú¹&.Ö̃̀­ƒÔs0mW”µ8+àajE±kJDƒéˆuØüă@@:¿:éâcôJ¤I¯#̀Økƒ¡fp_-™ÆBJË)g­÷̃ZKƯŕkêiL03?¾¤ư‹÷JY9‚÷Ưưư°•ÀÈêÑïêÑ|8y?˜ËèÇÆXaư₫|»QåÚé¿Rù;ù{䮥.T° —VôÅA¼î^fI_¡ÿiô”¤®eɈøe@LÂJç;G­¸ź×è œ?$aÅe ”*¶‹xçŒíŸPcb1‡k§r?ÿh¡»¬4ÁÊÈ5S†G L*o嶤ˆŒ#€!í́Uh÷ƯW賬—uă!#ö˜ÉÑHưË÷µ£¾ÇíAk9 'éÄ´ÆÜD̃m¤ơº̉ûë́ÏߦoÏÓóÑ;@Éu“¨9Hœµlg;ŸƯ?¾újä˜8áLeι údž-#ĂˆkWéUª± ǛIÖlx7!±¶•˜àăªˆ5^Óơ#~|¦Ïk¼"H²i`§Ö¤‰x«·”¢Ü`åé¬CxöççđüÎÓù8O‡Óét2ΤœŒ5̃{Ô»_q+ú—ÖJ“4MrÚ ‘fwZ¼åÛgü|Û̃~»ưvM×­l«æœ/×Ëï¿ÿöùyQäd'ĂA?”1[-8\@¾æëíJL³™™¹3̉¥OÆ¥Z Mv­’ơY2”ˆÙ[±Ö23l̃5m×̃U¡èHaßD‹æO2 frĂöZ]/TƠö  ÙµƯ/Mqy=£©ûE/–zDŒ^ ¥ª—ƯăÉ­¸ë@C̀©Rá¢9ÜX?‘;l·™¸eΉT»/‚gw[¬çĐQf°¢›Üơ¥ 49´óqVª° ®fv±ÆÖ#S„\D,Á‚ÎCuƒ<eï +¿ƠíVnj6€% È Äpfhy ¬×ÓƯ`5¼FvâÖC»Í@*)º¸æ’›ín5K *ÆÍ8s~:oq+Ÿ¥•f›U:®aCYfG pÔVm°ĂJ%ÜLÏ!‡Ê&éwM×Kº,i¹•[̃§X¢Œ̣̀<Ûù`ˆ]G{^:kàW¢LT‰lç1yáÍ4ĂfâÉ8s˜[ÚàÇ™$x±Ô(µ$©íœ=ûÔRâäÉ 0S—ØÆ¾y‘ÏQÉ,Io[Ưd ĐÖ5¯[Í´„¦Ơ,[?÷µe ZT®¹æƯºÈfp'™HnkUÜ7”&@qïàlÙx³qÏ·ÙJ­Uă ‘6#C,à9Aí ÖjtspGë f ¶Y©CLÙ‹̃!Üh1.E<¥ÉMb¢ê<ÊdŒ¨?̀( ³/IíărÉ[Ùj®£Œ¯¢ èô}¯²¬›XXĐơÆZÿ+—t¹¥Û%]®éú?—¼Dk[Q=>ȽFˆûĐ«”]₫ÓÓ]—ùvJp¿`êºÏúPåâˆwoß«L‰¥—¡àA«jvV[Ư¯[ɱ\DÇ*h/FDrW·z¹\₫ăü1ÆËåÂƯmÇÍİ>ÔG1ư^lơßm•øo§y>÷m₫ñWF5Æ(x|{ÿƯ“T{ÓG5â£4-úövÇçÁœ·3ơ|¨ÄV?TÿÇüÇ·?̃jk)¥Ö·^vm÷²P½!f5Íäœ-Y1OP6 ef†ù­ôÀ¨@Á)TgĐ­B²ÏÜr¡̣çoöÁ¿¿¿/,¸$” ˆ­‰ï’xuè;ăD*D= »I‰Î¥Ơ˵”SÍơa‚ RË–³ ñ Yá"—M/Z\¤ơ!¤0;ÑtĂ‚›ï >Q£†ieë‚Ä*¢Åmˆ‡J”°º¼ØZÙ:*qc²TZ)¦hbŒeØ–Zª‘å×<ƠÎ1ÀEÔêƠ ]¾3ơ™âï|đ1Pv™n)¶.8§zỤ́†ù$ø÷x-Ø«a0ç­?L‡óé<ùéăă£dYºwĂå¾çi××"±‚ SàĐ¿¹mIËÍ̃@ƒ¼¥Û’d’4nÓa"K—ơ’¶£I`ldƠ Aèd81%2̃Ø`Ùq°Á{ñ ~ ́ Xâ’—%-—|¹Ä‹†…aX̣²̉ Æàlç£=bÆl€k$3£É*ä̀̉Ơ&†*×]xçK+lØU×ëéîÓŒ:9£ˆ¡ú•ê¬mt>Û,„3Í…K41QÚxÛÚ¶ukÛV·ƠI"$¼bÅ ¦F¤§”RLLŒûWÅÊÀh 7t5S7Sêă5Ư› Toº‡înEF¨8°]n¦µÖªÛÇÀÜ’ZĐ?î]-©7à”(([FŸTSªIÁ®(‘l·Nr1gxl-ÔÃùÉNÊ\’‘fYŒ³œó-Ư>ùk/^¦”vưŒOP_a²$íBc&¦6Q£s9ă¡Pÿ`OßÚvK·ơcÉ;Ox+ÛÉêăê0$Ǫ`Ô‘w×38]Ô­yÓCÁ0~â¬;ιóº­ú]̉AÛQÍ«›n6­æG[R4[oCkÿ½Ó‡5G£é—7|1§ü믿ÂïE·(™§deŸŒyEüʲúĐăoïyüûwù‹Ï}©0ZFD¨Ø#·G•ÄØ£¤đâƒíG ïCX¦%PíñÚ"mö×5£Ê[Ú}‡ÄÜÚ́ôt=Ù˜în#ʧ½¢®wƠ•·úN¡̣‹¤ÔºzÛk£@X}‘µƠ;GÍ`@×ÎvÆ¥ùgLå)˜˜J®9SÆ‚+ù\9Â2 ¾ËbmVºd¹’ “Ût‘ƠEMXe2̣R§ú́z†–ßớ÷Z¼uµ₫ Đ?̃@ OoŸ½Xo<»ùäNw&<…§“;!ö¡ÔS¼åÛ5]—¼\óU†9ëfçÙïÜP"L¨ŒơåK¡âÇPŒ.́hÊDˆ¥fCëäNÇp„í’#‡¶:èÚxV×|ÚU"%ï¡QsÆưå_₫%ü~ùíX¬8ăf7Ưñ9<›¿}›¿ưŸçó<ÏÎ;ă ¸IÍ4aB’‰9µZ«pTª¸kS%S zº˜à'%̉8/K^Ö´‚Í¥f…8w·ơ¶­›1Wï̃b0F +ԇײE÷Tiè†gÆuÖgJ-•e&LëNÛwå‘‚W¨¡i¦yZ–¥Jî3«8r$@*©ó̀yФÔQĂxÛâ‰ùiz:µÖx‰KZvb+Ăæp8¼¾¼r5ŸoÚơĐ{ܧHjZKï#53~"RÛÈx²ƒi¡ăaƯµÍVSu*yB#HƯ“@¨‘ÇÉ@¹.›™ú%´F†Ø0` ỶÚ¡»¸º$êè)iâmß{ ¨ €r”!|N–T²K<–#ºÈÂÙ«̉×Ùˆ;ùistQEŸÚÄÁ̃é¹_¨Ù  jơÅOv:¸Ă×[¾ỨmvóÖÅ,±ÄZj-•™ÉB-̉RK°„‚ª¤”̉\k¥‘%*Ôr#O5Ơ9bÏ ¢xë1ÙÆíƒỌ̈ZÖ%.Ư?/ùË5åd¯e½̣urÓÑöpp‡Ù̀¡¤4ÂƠ}V¢$v¼ÑƠ†³’—'ÓÓ£![C`mµrÅ̀S̉Hh/P 0‰ƯT4O¥•̀9µ9F[Ư6»muÛÚ&é(PÖk„¦P¶TÖñ†®ø—%»US}tà3nîû¾đ@ÉfP}~`Q‚wŸ­ơ˜Âyë›mÔv©=–-RM)ïFv¢)§ZjAç·p5•+ăÆÑ>£HVº„Ôh"‡±xªà­wΉ‰–•å=₫êº"¹ô§‡m= /j¥Kö{j›Î0vÀ°E … ¨¼óÆŸ½÷₫Đr×[9®‡uMëZט#œ*Ö"¸I·²=pà{oó®Y^[oÆôú₫ÓéxÊ)ỵ̈Ë/µÔ±áx§0滲Aé˜f>9·÷÷_>ÊOÖ}±#Û!T››;y~è­ÓĐĐ”®ä…q\ÀäöiW§ñŒµ€r̀zzöBä̃«glüÿMX¯ß₫@ÏøZ*ÇqÿA°ï—Cy@ƒúA¾ơÿ<Ôj2fiê«Ó¹ø9’ŒÏvĐß›àâÏƠ[̣r+¤‹b¥¡;jÊ..!2í€äÊ£Ê]p¹ämƯ¶ºi;S¥hä(Ê×RA]É2É=X©2Awl₫!*bÔ„(>ù68S(Đ÷Äu#DI4 Á°X&—R°¬ѨDÜ“j₫•J̉ç¿»}ơ1wÁ÷úi×?HœaÇJµB VÙ·Z,éXă®U.ư5ư~ü: ¬§ÙÏ~̣­¶í²í `ù¿L/¯ÓëÙî€Ư(—|Ë·K¼\³4­U&3rê=7jU‰ 4GênÖX¥'†¬Ÿ±í„'†uÜN':ălgÏ̃4ûV¶%/—tÏΔl„ư¤ˆ/ßü|ÂŒ²ÜlççéùûôưÛôíûáûËáåy~>ÎÇ0ă 9Êœ%>¦Vc„pö¤% d̀•ÁI°Ơ‚?€JåppA®]IeʪjE8¸Âe 1BƠÀî%dBqC+ˆ‰Â˜̃¶„º÷ûA;+¸‘< ù%băAcÍ~eåaQ“ï´á4Ê«°·Ùµëº@éy@µæ]pár.ù’Q I é¼;ŸÏTèóí¿µ/‰Md©L̀‰5P’€ªúbZ÷ G”…‹iƒICoÓàơº³%q#Ẳ\•"\/ƒ€3++;ÙjÉ’°¡¸¶Ö¬íc[f LøɼHnƯZاf@'K-¹æj7̣Ç₫½Ç\ˆ`7 …˲Öêª 5Lỳ’ˆñ~§À¥ ¥xÎy+.`Ưwvgç¾#pƯ9Ô« ½ ă~´ÇƠ®§|º¹ÛƠ]—´ÄSIÁ†9̀°ÀMJ• 8¢NụÖ‡DÁ™kJ)å]L>%—d~ë&̀uqG6µÖ8Ç-o×|½¤Ëûö₫??̉Çgü„á2ׯùz±x»íñTO{˜Ư(HF„h…’˸´đ¥Í©Ó¤Æ̀\[…+”̀sˆ3e£ Áä!> - 5Ï5g±ÍâÚÆJ.̉¯–§Di«ØäcjIkáx–ZJ5épÇmT¨ SƯP™=đGÖ[ëô¦=ˆ}¨Î¨₫¸rElQ.Y! …Qf>¸t* &́CéZ5²ósxéˆ<©ơz€;ßµµbn¸ûΫ\4’bØ_#*çºfº‚ÀÁ9×lÓi-p¡„=@Œ—âJ«²ÛqĐ&7!¨ạ f7çă1ƒ ˆ§eŒ!3µịÓÓô$Tçڔɶ–ơÄ(ü¯kYGFy“ö_oBüé/úÓŸ₫|½^ÿáŸÿ!å$Ú<̃óˆv‰æØ§V¾ât˜¿='˜Sé₫ 9«˜ÙŒl—ö¨•Ưqï—êǽev Vh°‚Ùñ}oDƯ₫₫'éÁ”S_ÿư«%ÑNLz3?H§÷²ax‡¯è¯ïO£—>wO¾ŸµtĐËW)7B9ÜîeKë ;ơ>Ö9)øn÷IÆ£LIJm­FMªrÓE£Æ¬k °) >ĐIny«Û–6\Ù$†œÁamđp@Fà ̀UªÀˆ́ˆû#Đ¿+…¢?V+)Á­ø~  »&¶á±Ù/|Çn¬©9 {Àd—HÊS¾'á́S£ạ́Ü@ûLC´Ô5£¸Ç_YCă«ĐA‡ …z…¡u?ʃƯEáG‚¼OÇï߾眯—ëX[>‡çŸ?}›¿=ù'à~ª”k̃̉vM×K¼|¦Ïôñ‘>.ù¢€€»¿̣Χ2B!ÜơgVˆ̣¸̀IS}(hb€[€å­Ÿ¦§³?ŸÜiâÉ‘ăÆÑneƒU?F¨ª”P–ÂvKA¨ç\æÏÏË?ÿó?/Ëâ /¯Óë÷éû÷ùûëüú|x>M§iŒ7Å–[»Q%¾qiÁơÍ?l̉ạ̀bçæÊÂüé:i ¶=[-ä0í•fO¸˜̉>ÛƯûX:Å6V…[k9eÓ: ,^î*GQÖ•«p«Lº·´! ‹; Q,—Y-ơíí-„°\—Z«7^¶7ö{§söVBŸ´—›!åCdÁ‰ˆ$Ơ-m)¥-o[Ú CÏ&{ë ™̉j*Irôx×ÁSXW ½’um;Ó½•uÙëå~³Ë¶bêaióiäs§®)ùP‰ÈÔǪD”I´ïÄD…P´Ö@€m¨µp±ĐĐº«5¶mPĐ.±dsËt P’–s¦ƒtw“k•›.×ère[-46®ºdR¨AœÄƈ€Öj©ë¶æ”Ñ‘v¾ơºé@m\j1Íä–UY´»Ëw£!œqkí̀3­'wÚܶùmIË5]¯| &3-iỲ"î79–ZZnL¬ϳ›g;£uk\ͺ¸ |W˜n‚FÓ°™Ư|ôÇ—ö^Đgü|ïoÛÛûö{€%-[ÙÖ¸~´oưlç³?ŸĂù9<ŸÜ ĂOd¥á®„ÙĂV6(ÔcøØZĂ)]Ï^å’®**P`ơ€Cªêñäm³¶Yô\sZs–V§L3ä¥Ä£±EDÁèÇ=΢&Ưdǽ€™³¡åÏÇø—§—yK.é–œ™€éاuc:Å!‰nFƠ‡HWÈîxí#xăÙ29R0đØm¡£ÓSˆOưå dm­í§°•߸ûœˆp·¢s:¨R&?é ÍZkȰåjkuâ}̣̣ú’júøüøøüÀ“XƠĂCZm¾`}ƒ"•ÀÓééùô<Ù©¤£jqVGcuÖgª™Úồç§ó<Í¿ụ̈KÎYƠ£l÷Yäx7wSç»F-S̃‰€ú̃;ư¦˜B%ç¼lKJ{k\ïñÓp½Ekw Ăøçˆø…÷ÖêÊo,Ư÷QJöȵ¡¿-7ˆ,N¦»gh́5ûhBn­¾½=™Ú)QĐ/üơVu8+‰ƒƯIigCÑăG°²ưY.ø½(º§ơÓĐéçn¤ÅƒŸ˜Đ¥Fj̉1Ïá|öçS8üé`ÁC¦–º”%æxË·%-@Ø—|¹æ+»v€.µƒ~T>8́ªUæÀXŒ•*^µ5ö³Ÿ₫pp‡S8ÍvöÍ[¶®‚9Æ’ˆ¥cÔRm• ‘×V .Œz@F–eùÿ÷ÿ˜—|¬Çï‡ï/áå%¼¶Ïøù?áÓ’[¾¤Ë-ß̃ăû₫“;=OÏX¦ç‹Q˜ÚtàC¢´•m­«à62‘"Ô/Ú{Úeh|—l+*l9ÀŸ„<~Abl@ưñumºØÉL¨ÙÄ@¹ 2$}4°RKhŸkAúnƒ”¥oS[̀5G óí±M-S¾Ä 4„/ ]QÅ0 :µ]…‹A½§Å0 úăñª“ƯWÊÙÉNG:*A±fñBhnL*)µ„=Æơ")d©$Sˆö†ØŒ¶¬v:¸ªµ3K7 Ù[ÿï₫å¿cË¿üÓ/ÿ5ÿW)ºaV…Qs·´]ÖË%^̃–7kl+ͱ›Ü|˜́$dPƯ°§è «(Ɖ®¹'ÿt,ÇƯN­”µ¬×|]ód!Ëk™WJù§_~)¥Ün7À¿» ¡“G!N3×R ›TS~Ëÿ·ÿđµÆnÛvƯ®h*)á•vëÙ©bàÇ`( ÆüHœQ<¯×ØnÀ2/—è‘itë;¹Dç$Ÿñ™ƯQ”áôPÊôGØÁp 0>Ơó&ÅâªB“¾; Ê®u%]đhpqQ~¿ÖOκàƒ3®ª…xơƠsy'<Àö̀M›U£TwçîC3ĐƠºD´Ä¥Ô²Åmúµ(ÍT›Ó’Ù·ñn‡Ùwb¨Wå€nû–?̀‹¸G„²Œ®°¬́k–aÈ̀÷ñÈÀ‰Ú ”ƒioóë’ '¹d†¡•ÆQ´»‡­=0àçz0́×IèXêŒ ~î´7ȵàWvº§rxgLÍÓ|:Ÿ‚ 1ÆËÇ…‰)Ư(˜đ÷Ïç“?Üá`˜/‰~P6ƒ§¾”î̉’’ ´¯#L*ë'3¡El˜Í\@+#ñîÚ®sÛÖ=Ôq eî́<<ƯNá$Q& ¥¨–èY<±µ¿ªxÔ†ùºäÈ”n&]+Á„–ß–@áÙ<ŸƯù́ÎGtÖUª·v»å›i&q*\Đ6vN.$o=|°[cj́Láÿ4¢Bê„­ëhaĹ…‰a˜k®Fü¤¯Û “˜£a”à¬C! gˆÎµÖÔ’©¢…îjܨt·5C•*j¹[I%­q…—ù5J,k,·†%« QS%+–~>øBsw ú”S¤(غí÷ˆ€†^(jßA£öäsÄÅ ”’ܱ\ó7®ŒËLÊWêDäz?AjˆÀ5ÿêv‚jAj€î¢3RΨQ5S ÜÚ…J5ÂâĐEil4ÊøỐ-!ÊRÏy@¹ ÿJṃqe,;¾zÄ9ïÂ0 ¼^×ܾw46͈8ö8!µYCôR¬~ơFÛw₫*Ó Yp¸§4²±dwÊeḯ´ø³»£€%-PgBp1—Ïôỵ§§đtç§đttGä[j«{£oåu­ën¶ÙÔRlS‘±K=ÅE78a8"äggI<Í57ó́]sB4"Ă•!vÍUª¡t²‘z µ$ &ʹæd“¸E·"£ ñĐ^ªÆç\£–RÊ)7j·t³ÉƯ骹¼@¨»Z íd`è*„&î#í´dñ)$…±Xß”̃́œ“³Kw›o¨²¬®h¡Ú‘qz“~î­ Z÷<Ûç#“@eØ}:ÎđæóùäC¸~^¸`ÄÖÓíôªóAYË–6"‚c²:w©’\P5VK9VÍp.l @•ơ@D¹æ§ü×Q%'#±G¸Ä5¾ươíz¹¦œr~œÿh0²¥u>x"Z–ÓøXâú×UŒ0¶6â=ÀÄĐHH?½ciºW+& €yq½më6.bºöW o=+O†ö5÷oMh4ܼŸDĐ@ơ¡rx†‡Ư‰:_H>tO4zø”ñÅ?4ơ•̉Ă÷©oL»zưƒ‹Í{Hoú³³Í¶Ô2åÀÁ¸Ç?4ÊôâPâ ẵÓ~³̣öt ₫<#«G}{pcèô|„¹¯âÛÓî½tïă©Cê²3Â)Ơ™µGµSáénˆ!ze¥´Âe¨vQÄè5^BG?vMœ)yíC™&–ï¾@ô8À¹;¼ó|´M¾/aƒâCÁ­™ŸNOúéOÇù¸\%;ó<•éhÇçăÁ0…x]²u5ÔđVo…KÍZ8`/× XèûÁ°GÎv† = 1Â%52!Á đÆ₫pN§é÷Uo¼ô¹KỤ̀ ‘[¾-y„×ø¸°'̉c•KæÂ²Ư¶F‚ ̀́ÙÏvÊtp˜Yc·­mk^!ơ3ÖdÊlXƸf;#À†°È‚@¥lrU\Ó©’¸–ª-XơÍ6°?´a'e¼)Tüê¹̣­Ü(S³ ”Vf6Âáªt́K.µç–Q{<:Dó¶Đû‡+â–Ä7½Ï­l™²aQ5’”iẮgĽüAm.pO!‘” •V r̉Â` ‡"7µ&ÿœ(È]¤ ea¾)­H”÷5crËrL8ñËMÇMçlÀ÷…‹s.¸ ÊZnºœ’`Ư»a£Ä° üÆÍ²̀|`ÑÓL“2À´î–̃#ú,{ ÍWÁË.ísIMr¥´¢mu©Zç[÷• ÙJKù!º½Y€̃,_ :{’º®0̉\d’Đͺ¯?ơÅ"¢ëµ„¶Ô—YfVÏG\l{ϵ–Ô’;µ*ÆDN“€‹ ¡w~®ó1Ÿëó·̣ícûøˆ—xùŒŸñê-ƯàRµµm-ëµ\g;Êa®̉tBEuhŸ©ÅÍå+H)8ÔÆLa9ÊY‡Ä÷%."Î))渤åĂ~¼û÷§ééyz~ OÏ₫ùGwôÆO<Ư1—¼¹í–oÚ(ÂÇ8ÑÊ¿—9RK\º­µÜÄ;K•́eˆ™ơW‡Ä ˆư#Ó³¶*™†”Ơ©"™”[ÎF₫©w“0k/Đ–âa>Î¥–Ïë'̉Ç·ukµAÄ̀¶¦´0¯‚ÔQ×í€ CÈ̃±̉¼´Âĉ̉Øz‹Â₫°̃y5ô³W„Yƒx»̃l’8Ö9ú?ˆ-ÔzˆÈ¤»z@j! Ô 4[ (¹Çùx‰_Ău½®q¥̃ºiÁ@.ï@¨‹‰+"»»ÄHz”0̣²ZaĐ,GC^i>YÙ!ø»MÇz”ă\ÚV7‰Íë­ÜÖmƯÖ-µtàC±{P·r̃¼÷!"º^¯Rr̀có+³eă oyË9K}BÚ’»wŸûí=~Ăæi~:µÖe[rÊ é÷®}e5ă‘à¬Ó Ä¾^ˆçwˆŸi<ăc*eH+­1F,¸ư>› ÷ {ëyà÷ªbjû£=o·wNü=ÍC€~T¦µÈËK®\ƒ Á‡‘¡¤ơŸHí|’ÖÙD­éºíΛ#ĂGa.à̃÷6¿vô‡<½ưÆî%éW9¯†¾)Ï¡‡[Ư "ûëÓ#Æ,É6XîĐ¿í---p•ÈÿÇGF:z.ä €Y°ßíç¡È‚ >¸›J)îoå ₫ÊĂ k°5í’–T“56P°Æ>ÏÏOáir“̃œ ưàÈJ€q•ä#¬¤bºßRáRMEÉľyÔ3`&X¶0äQĐôbÊ y.Ô™ê¥]X±†û¸µˆWœĂ|N§p:ø̀X-YªæŒ0;¿\&p³Ÿ&œdÚƒE \8ÛF®† ^‘\´Mº₫º(O4A=¹éàGDa8€¡ ¸cÔ¥”½÷ô¨V5Œè CT)ÑDr”[̃̀æÇ¹óäáÇ猃ÇZïbX^¹Q«\+×­n˜ÛŒ7Ë>&âüí‘Ü(Đ9SÎÉÎÍuÂÖƯŒ(4œtX¹±èR̀&ƒà¾—£ưPƒ6Y¨¹>–Éj­Û®áª¾Ä„z Ăú}íª¤{LZOü‹˜çắçuYă-rFsÏÔC!è¤3‘ˆô6±ñQlZ«­[w²\hUÀÎô»8q 9¾–V[å *¿́5•3çX¢+‚{°”íD©¡Å€»Æ‘+TÀ†*­@*0öÚ̃Té̉ b¡߉(û̃܅ڤɽ±j«ôGjAF̣DjÜÍ6TÛŪS¤O¬oé Z¼ë́Éœ^§×JơÏ?ÎÛù¯ÛÇy;ÆÏíăs¾~­Eơ5^ƒ sAôÇ̉ˆŒ’xwz‰V{v5ïü‘,ÍÎ%ç’C$¶Ê´.ṇ̃Çís8¿̀//óËëôú<=ŸÜ ÷æS{B5‹5 6Ä·rC%C ½Èqñ³a6́ÇÔ%渥m+bl/YúPH^yÈ!„yHFÇ •Y²@¢˜È;e%³w tjjÜ_ŸÏÏçTÓ¯æWZ)×\·z[oR«ôQsábªIœ”I¯©̉¹ç½9*Âuß$Ú+¢}_P­®BX{AÅÁYÆ˜àƒ ÆÆ-LÔMyƒl­¢XD#±–ÁÂûăóÄ5éL&f¾”Ëÿû¿ư¯­´¿₫̣×ßÿø]Ü„zˆ5²Ü5»Zw7!ưX²†Jû̃DèƠă8&/9ÂB̉‚‘§QüI=NK™±ædOÇvÄâ¤̃où—¼¯¶Bx(̀‡¯×ÁÊœˆ´s÷‡cÿ¢Ùư…ˆÈ’E ¤(\){D»i?ợåîÆƯ{‘s} 0Öă¨×Á8UØË¯nACö[e°ù-̉Qn´÷¿»ƠƯØïW9£®û<u}j¬tyư(Ju(F|úuỎÏơ ªØC¨¨xΦ¡ư $™âï¯}H•#¦R˜ás½*öÆd¯%„^Rkª©Ö*)]-ơ´‹Ç 8»VZT@BêKØ7o,mă!""ôeʨ* j4™i63(›ÖX]~ÏιĐÂOÓO’ *êÄ“¡é«Øº×8¿6Ø“@ø9ºăÁæh mj–¸ÏÖ’U(́œÓ4?¡Ë(6ZnXÁ1” Á¸êA`D#9\¦Ç¯ăæ´¥-•ÔZ3d<{VÚKNå9âv«©Wk€>½¶U2(n}}σƯr”<ºÈlryëq‚ä¹ ~YƘ]ÀĂøpûặ¶dđ‚ 8úăä'®́ÙC€Ör®Ùgo‹• ÉUµÔÇưZö%ºv¶ÓÉ´t‡G`µµ¹–9¯eơä…s̉û;MˆAl­%¢\r-Uñ«öS°˜ˆ¯N¿äÎ]t¤Hî93h«¸ÈT!ưƒ #r#°DÙ©ưiyÎ̀]ù,*dí¡>af-BÆv& οµç‡ Ç©ƯƯ&v‹ê¡ŒĐ)"æ*+¤vLjÏQÚa¯Îª0.H,ÔĐ8xè;Fk^%N¶‰6à:±ÆNëTZ±Îâ <¤®ÀÏơó¯·|K¥/°µ®y%̃̉möóÁ°*ÊÎÛDkN='KÜó´AfDí†C‡~Ödk,è…¹äF-ƠTSƯâsû| oÏÓóËô‚2@c¶Ná”JB P×%_„œƯ6ǹrkMœîl3l0dk­myC}~+7ơ³BĂI¢°"±«Æ’;S dļ ¢MV„{¶RZA€¦ĐGsôÉsåŸ^Ă«*‘ÔWÇtw›JôÍ ­¶%£CÉW ¹ƒCÆ̃«̃DÊ>^¾–½0dŒ5̃z×ÜL³–Ü{ÈWM*#ÆÙÁôXlp› ¦êï}đxk-¥ô₫Ÿÿ¥˜RJJ‡sÖéSÚo^c1Ư Æ44ƯÍs͵tsáγÀ%SäNˆµÖJà:YÈÍîÅÖ Lód"hîâP̀!¸đÔPįùª&æ±Ä[¹å×uÅm₫C¾¾¥”®×+åœ:̃|?¬¨I=ûܲăÖ$ ˜÷)I_ Zkjª¨ë âƯQFđÀº!ÚÁâΪ7;kÿ®µ¯; ©;éƒXe»=ÎFæ¡ư[úÈûPLƒ¯d×.—аpXÇÖ~_¹TQ±r¿|k9¸wkÛIöCήØr«$¼ê`µ}, º.¹ûfª™ ¼¨hSV1½³˜ÔB‹~Äï§AS»„Á“Tϲrî~¦qSáí3“‡Áµq}QÙ€¦óhe5Üư´wMz³ÿAÓ¬Vưº/RϰĐZÿܧxư‚₫”[ÔTªÀ1{À*\Đz5‘xJ€ #ĂD–öíDS¨Áï¼³l_Î/Çñ•öÇïh†vr%qo”ă–Ñ|Í5sáĐ+ú—À̀ø86̃ÆKnW ! @wr̃AD «ö×5­K^.ñrË7sÍ@-Ú̉I1Z­*Eí–ú‰9,¸¡´f€2SÖ¶œ1Æ[|˜ư| ÇS8æÓ9œ‘8[ÀÉN¦p;‘n¥̣>k©UgPÁ,ĐßÊÀ—ºk€,íILÆ̀ư5đÍ@%,¥eøÀ{È«\Ÿ½ÄU+Œư*m; I&ă9ʧJ<¶+Ç.¸•à⥤pó&lrđ@”d¨R2ec‹ˆ»²×óë÷çïÁ…ËÛ– Äàé e´0¦%¦ Ơ‹ dªIæ`,tœn1Ù×&°w–mÉ%/ës‚Í€HöV‚évÈ™¸¢W’[Ƥ[©2ăǶbP"’ƧÆÑ†ecntaÄ₫€æqô'ÏÇ0z`Ừ³»iÿ諱’€äaI¬¾÷v¨ÆG Öqt‡œº‰°Êäˆïê*QD¥‰Pè ÷ƒî†ú°€ă‹YPlek¡Yc·²ƠV-Ûà‘lÙ#̃íÎù̓¬ßºÇ1̉WPüÇ5¢UOzßi©¶ÊeŸFÊúß¡‚¼(¸—Ú@èJ’Ñ'KD¯gÍë—K¼|lg~ O§p:ØXÂÑÏ引 ÆÄđ*¸å8Bbu¹v­•+’†Ùđä'kí¡Ö¼æœckZ ^v0•×¥ä:î́ ₫ÓÓÎMI[­%ë›Ïf¡¡Q̀[#á’öÅ?‡çÚ*[®\SNk\Ga·&)`IL«…©C‰ev¯ÂQè¹oyµ“;ëA;†º5ªFQɽ£•çh=̉q«ˆßg!äœôœA½ă'ưÀFSh´¨µ~||<à`ĂÆf;î,ûÆd­â „*Ơj«́¡₫'Đ"¢TÉjV•L Ø BV¼•@Ré‘.qĢ·ˆ K\ _½µ6ל}VÇ–·LBÛöΫˆîkPk]×U—VcÉt×£Ơª ²a“k~»¼±ăœóu»®yU“€Qv+hÀW ĐW®Î^ô2€4hïñĂ„NÁCFé#™G㨷ƠyŸ'fبü$̀ŒI9*;m»4“zƠ«Gª©*¨íú„ë“Q©ơhÚeƠfçǗƯ}¥Ÿâ«ăéÙáqÂP¬(VëNdow$iµbo®û®m~kl8cÍr]J.#ÆƠg+×hߥÑ%ê¡}†¨W’ü$ßûœ6R³ }XùÄ́sƒư"éaœêÆ-›·&'v5!^—Ô9¥¤–J)Â/(₫ûĐC±ÂÀIÚKáa”„צĐMg XP\^ ©qóÁ&;9ă`kSjMºñˆ‘TB¥^àư¯ÿâû÷ïÛ¶åKn¦8¦eΙs¡‚‘ñÖ6ÓLË Î6¦ÈïÙOfÚg÷đú$2qmu§/›ưrƈS4OV¢( ™–›XYgqDˆï-ƯpƒF>ú=»m‚È艒 ¸Ú‡jj·îu¾!´ÿ£@0ùéà‡ùp §s8Ÿ¦ÓÓôtôǃ•Æ¿gZù—œr̀éñ)'\µûBªRJDoÆ‚[¿;uÖ.(I;ñ•«±Äh.p@¥–3â&:Æ, …`̉ü>`,IF`¢ëº‰”ëM&¢;44'túç0#\“èÉO>@D¹d\¯‰’ÚVî†?ÆbŒđ|~₫óÏvạ̈5‹{&­˜bi5Wqo5sÆÙÔÛXµ‹)™³Ñ°ºGpÖ°)µüöñ›3.­‰+ç’±Gî$û®}½l©j:„5:rW…ănŒñäM÷uƹâ0Ú©SÜ%’JŒQn'‘í dzêqº‚Ơ«xa ›h cI·¯ÉÑ“Éfn¦)ËjåbµƠ₫½”UMäd²§î:]̉ú¨ï…ÆÜÙđ2j­Á—]À}-4úC¼ÿSËQI'hIË­̃¼ñµTlĐ̉H2nv3Y@1 -¹eËVeQ¥–5­z ̀~̀´w™qä5øR·‰‘ä‰u¹öœ5Ô«øëhhwÎyÍëe»ưñÎçé|öçc8 Ç̉ºÉL̃ùC;œË„́±€8¢¢”ƒÇ8H}&7a=\iN]Ë $€P°ƒÄûˆ‡ĂfOœ„hÄ4c-­Xc]sÙd¨đ —JÈ̀­5n<û¹µọ̣̈bƒ½-·ß̃~S­đE?˜‚èæ+²ò…h¯cEÔ+é»ë:®XÜDÊÆ&¢&„Bp7µ‹uyRwQáÍ[/lCk<û̃V«†Jêyè©d¡T»ÅP½ ÊƯ ă8´VQûA5!DƯ2*(ZORÛjÆn.’$̉ơHúEA¥Éw˜C:|>œ½ó`¥îôrÇK…­[7nè1ùæ|Ê~ÑdWJ5my“ Àq¶ÜƒƯéo¿í`l$́p½đ¯¿ÿz½]µÏå³”̣¨×Å?++G €¯JÜ»»/̉ȹO₫z ̣ßưJÿEÄ1.½ñ<̣¨•;UªßˆÅIÓ¬†#¢Å1wâ¾@ÿ^W¨xâî¹ƯK„¹#Ïg§µ=_M Ck†̀x©íÄZFܯnb¸peĐ(7l;ø̃Ûÿ̃=¿>[kcuƯ«{K^C¢Â‰GµïơRí ă >×é³i‡H O—Ưè ¹ÏO˜¹1È0̉t%gö!ù o)5ë®}<°dÉëÿéV®†‚in3<á§ééûñûóü|̣§Ü2@g-ă`k­î [ïï̀Å̃ôä¸ïó÷—đr«·oçoͶÊ5s†ß%Œ¥\Å…áenªñƠ[gUº‡½œT‘Ÿ¶ 2ƒ\f÷Ë´ 4»/2’%K…RK0{̃Êuï5]¯é´ÎZ«¨âº[3œ(‘¸]vô¥,%—œ32¹;2äI–6å'@‹F/0¼Øæ0ŸÂ úă§ùéäOâAdçÉL`LQ#̀(b·í¶åmËbkvå~s1±m]̉Ø4ƒ³Ú¥c³Ùê¶Öuk[¡Â†‘dJđJA})Ë$ÆöP‚2ËøK¶ÉFÆƯ›ekû;Ro ™Ê•›L«g7ŸüéèÇéx‡)LÁï<>qÎYk™×*×R¥÷ß °…£¢–X#8ÎxKâ"kmƠ4#ÊQ*¹e2̃¿dèö%Î÷¹fÛ:½¸÷¡•ơ¤[2ÏfÚ/ưEaA¶ÙU)v213#×F[†¥×ëÉĂ:içX³(-YWÅüj`¬ä‡½Èï=Ü •*˜ic§i\6E‹̣̀¹68ƠD(c,Yï=[̃â&bè!Bv´di§DQ; ¥½;÷>H¼Owé(lk¤¤c rñ`j„Åsœ<́{SŸª ˜h<ú:¿å‰¯Ûơ}yg$›I¨Y­6“›tû0lnñ–YlôzH%íPGD„v‰aSkuÆj·ÚÔ™`€P×ÅéÀDpg7½m]–jj¹!\yIËÛö¶ÛÑáxôGơ!́ä?¶ăV613(·­n¢ÎƯŸí¸xù÷søÙùÜ>?·ÏơcI Zza`Í—•ßH³@:>´A"‚cµU×\iÅ5'ö÷,³Sf₫ûñ÷Ï/Ï¿ÿöûízÛuh ªŒOµ6x ÜVª¸*¸ËEôQ³KAYdK£^w×ïa¼7ơú#+ÔÆ]Á²ä– ±?ܾ€À®£̣P̃à×¼å AËj1¤ ö;¾¢^¥Û‚tó#qÔŸ4zU=‰kbI¢¨¹”²+ÈûØ3•iÀ}ÖêüÏæç#[n%Y+lOB4â( XPMæêèˆl8P6PñÎê¢"ʱ́ùÿÿMaưúǯôÇ]apGƯ7-₫¡èÉ|¼çñëϬ's¯ÙÙYgب¼r|úzXäúZ†µƒ“)=ĹÙKa6°wFįC¦ư9"]aïô¤ñ‘«£X¿©?ô¾©èŸh7¿×:^9£‹–‚±F ƒdµ¥]”¬Ổ&V7¤K)ÅÁ£ÎÁ2Oê ëak¤¶t?ÊĐ£±Ol98HcçuoBØabÓÏăPCïI@å#‘¤æбéC…¦ëÑ~ª₫œ²¤T… ©tVjáÆÎ¸ÉMÏÓó9œŸ§çÙÏ¥f6Ơ 4₫উܔP]æ´å 8Ø5BGfbĂ-·ÏÏÏXc8†bJ¢Ô¨!fR”R-TZe1ä á~C}®…¦́eÈ”—ix¤Ç#E"Ê%#ÉK|3̉ ¶¹eÅXÄg;ă#èF˜}£öEñ€" ơÎ8ê ĸ‰ 05ٙ͌đx́œ§3„Ȱø˜ƯŒáz*úP&\o×%.kZ!2é_fm'­f„åÉB‘ÄIǤBS<3e[g­µÖ ú‡' Đ¦¯<8I₫ñ>ĂK•‡Á»I/6GÉÚXe‚eÓÉN₫ô4?Ăqsđ!„༠!8çœs€hßfêƒ5 y •O7< ZËeùµüŒ— ¾̣ÚI€1Î9Ó ̀2ºÎ^{E¹åçççă|ܶ ăø¹‹ykŒ¤ËfJæ¬å}"§ư­Œ1ƠÔVqÍ6×ÜÎĂ!¹µUèå×äfiy²Øºï­ú₫J˜ÙXA`r­¸G£NH‚ )µD8˜©%@¼ơđ†o­¶ÊsÔÂE`}é{Ae¢‘ê©#”Êul^HñC;+rßO«È´¶†PŒh‘VQí6Çu7LßđȹåÈQ{a}R+¥»h j5l¼ơs›©H Ù¹ÿ?Î₫mI’É™€ˆª¹GdFVVvwQỜ>.ơ,ÍÿÿÆ6ÑổNƠvWfåµ2.îfªr˜÷á0P‹́¦Ùơ022÷p7S̀‡ÏEµq;ëéw PÔE–ÆØ̃ÏSÏ“ªZÛơÀ|°íO₫l3å)ªlz@´ưÜß̣Ûº¯K^ ™–f¯¼J–U׋^zlŵøÀy| ¢ËÈ®ËơÓåÓ~îïÇ»“$Ï{lø̃ ¤¥pY“b&đtÙa‡È”EƠ¼°4jû¬†<—‘‡—ÈMlsÊ1f‰ô²z¼ù°üÑ´9*¤̃Á‚'UÁ¨RˆT¼ÎùÀhÀ}~ƯWGÚ4níÔüÑF'à]t¯J)Ù2nw(Ư‡»hí2ân‹7ÈBí.@L·₫fK€ïFwg¡hHfH"sÎ)S"Í }0₫-z€L¡(,=íüº}Ưu?ś`ÅHN !ψÆ@ÙÂqÜDơÔ#(Óđ/ù‚z«›‹Èµ}@—₫ÿn lè4.đ@ Í<È©®¿#Ä₫•?zŸƠNTÇÁçé–gÓưôưü#Ó¦÷¬ÜÅXÑ×>µ%ÛAüùàƒNÎ<µ‰7 ¼¨³è°1³˜`kvȹRc²ÙĂc§î~mAí ư–yŸíêÇ”a±0ѦÈ%¥K¾Ä|×Đ₫Bµ69Ö`F§âñp«̣.+A)3#ư¾´¤kd¢N™ÏâYÇLÅœ×ú]<4›x†‚MX0oªĂ^ÿăĐ8P¦̀›„Ôåb7̀ï_–—K¾€g/"•{°9ùIæÖ̉AⰻϻnØ#~Eà±zĐqæó¤ó £rm̉5gÛ·zè‡Ù ¸cŸ”áeÛt4Æ^ñôùÁûÙû´fÚqŒ8!@µôx,LĂëƒE¼ ‘vË7wĂ%(T\Ø”«U4“‰'Fn”¯§°*7mÖ D†ÚoÍ^ưûÿ|û|+7L6²d 7j­g=Çc;¶G}<Çư¸?‡ÏFƠ3Ô¸/ VA¡¢¦, h twé¦z蘙…Ưÿ!—¨₫à¹j™Ă:º₫S5nLJ•*6h’©Ó°@HIXÀ¿ÉœoùvË·k¾¾ä—[¾½,/ë²æœ—²ä%×Ú±‰Ë–ĐA9ÖN®(Æß4‚ápĐZ³s?8ĐPÔĐΜ1‘$IS¡̉¨aû‚æ̉·ˆæ^ÀLŒÓè<Î=ZmÜ•QFđ“p(N5oÿØËÓ¿€§gc~ Θt7iè$3gü8_ăÊ’DU‘€pf̀răÔ8‰Qø‰®â1‚°uçVl°U*È-µ"%̉ôˆ ÑÂ^Ơ‘(k|ö·ÅÄ́mŒª ±gïé,Ó¡¥ö>G¦~̃zƯÀª*₫›ụ†ÎÉ'VSKÈ–̣₫"Pÿ‰¯ª6UFľ·OqN="çfÉ\P¡â`(Uê^̀­¶*œk2*Â)“h¦‚ôV=²§V²C©5§¡„¹¯¯#ïÈmjư'„8lwÈô8ëéͼäœ}Cèë²̣%SrÀEMơ¢—C]»V¸#r>"˜J.(Èđ=¶º11@ß¡@Ü,(<ơ±a<Ȱ ­Y–jUاøá‡¯_¿¾=̃Tt<¢ÜO@ˆv¬Gk¡‹6λQá!|ƒ¹ió‡G]'đsl. ¤˜üjƒ. M˜ÄtêÀœ»Á+ta˜á@.ø-`2·¢%z¿¶Æ !#ö):/ Jq§w~TôxÈ…%åDDg=A° ûÔÀJœÛÆ₫ÊsÊ~luBT !èơ°¾ƯßdU=Óǰ½₫Á$r2ôÎ-¤+* Áñ6¾G”bG¥äÊLØ›¶•Öx‘Ö]ă£¸úÿ¡ ø $˜̉r‰‘5}ä₫NQQz™{Đ:q?j5?Ÿ&MIĐx:D';Ö( 'ƒ&‡Êøq3”¦¡%˜̣\‚j­™Ơ£C¼ơáǦ³FÅ8ëú ëæ6&Ëx*UØA€Ñ?à8Ñ=J£u™à́Ư9 …2oæp~ÏBÆ®ç»n²T8ËÎưĂ ê˜àæR< àRÉèëbÎ.̉Ë’0TNI$IN",R$÷CăĐñntØ)Xd ư­mtöØ"á™@ÏùvsS7N¬1ù7ê>ĐcÚÔ4SÆ®t)—×̣úiưôZ^/ù|ƒŒ¸1<=Ăk ơ±Û ôä”’:A\RĐPˆ›X¥Z¥‚´}¶ó ă û-™$©Vá|çJE£l=@.c¹u] vw=ïO&`!t54ñÖ4̉́‘To&­8É̀̀C1%/²\ó(O¯rÅ1&$=?ÚùäPÑAl®') á$ƒˆkÿ¨₫¯ËơeyÇ巯߮iµfZ•Œj«G=¶c{÷íưm{?ßÇiµUœœ t´  Q¢™)²f—jZÏ:÷Ba»2d )¡DÛƒ’ĂÁ&ØŸcó !(<6Đ›ƒ "ÀåÑ@F˜̉đ;²:O8G·ÿ¹%ˆ̉Úí#kŸynb@9³É}vđœW:Ü[%[§;ùïÙeTáÏfùñ,'m®—_̉]zúl+^sGQØ\Ă„‡Ëm“¤/PîÙÀØÙ8¦œôlX4_÷0¦ /pG"›{ƒHđê¿›ØÄu˜¿ˆ³–z–‚÷Q=(>FZ8xbOQà üÄ»³IØ^0hG)Óû¨$EDḲƠ’r*È‘¥nÊpôLJÖÚaÔL̓ ºm°;´BÖĺU,wÿÊ™˜± gwà4ñ¦BQ d‹6„­EÊẹ̈ú‹Ë/¾½|ûÍ娫“‘UCåú]”₫±hñ:‚ø¥¡w•]èSÉ‹₫Ͷ½í'»í`øÀ¹QËK^̣·UE¾Œ‡{Fsïi:Ÿ'â]Qàe£ÈF lôWs÷ˆêßsjº/ÍÙNZ°ñä”Á£ưT>­i½¦ëE.—ä.Cfvêù¨‡zé›oÍî+"cđÙ®µœ²°@5u]®®ú]®—rYË 00tƒÛ¾ƯûÛööuûúuÿú¶¿…!ª ·{. /¨kUƠ’©©ˆvhso%rﺓ’†̀—§”ÖÅI«` ø#G=6ăîtpÎøkÑdz¬½²+§€@°.$œE`æ ÿVÔư“ i;…=¢Ä†ä½V(4ªÍÂÂAư_a¿ÓY`£T%/1SJ "8J=Ä”ˆEç–r¶qtĐÁƉ6öf§±w-ƒÅ¿­NíB$‚‘Ï)đƯ3e€ßî‡Ó7@ëÚ LjèLt ;NVÈyC †MÆ?ÓPñÀfj•êÓöB^©2ÿküóÔø²¥¬́ơ=– 7ffñ¨à,ÀöåĐƠ$æ‰Ëó®¡đ‘a²„í&'A­FèDæ¼·=Y:ù<Û éKܵ ÷bÏT́U?Éâ ̣&½È².,|¶öØK-f¬æí‚² s"ÔJLYPé²×}×ă ¿íí8Ûqhå>äÄO¢®ÚVƠÓÎÿôëÿô¿₫ăÿ­íơ¿₫?ÿkmZ ¬$É“"ȵÖÜéɯv !…KÉe¥ơf·@ÁùA}|QÜÓ—ËKât?îđ­Í•ÄøXÓºÔ%DN±ê¾X̉íéŒLL0é­\cfƠ¬¥%å’́ÇŸ~|‚ ñ¼IRâÄPCí3>Há!ØàÊæ0Á¹ˆjØaÝkl¼óÄéC-, ëFoøƒq-‚ˆCѦÅ÷X̉å' &qZiơM¦k`ƯæiơØÛÉ*ó”À?ôÈK^/+ ?û#m€ˆˆ<ƒ%½Ñ–HvËÚĨO|&Чmz’ÖYBT ü½C=ư@́a½ZóùC·0 gH_˜ưy.ÉñD´+æåÖ<âû¿₫+Ă#ëçc•?a€E‘á~À@I¥›3ÄÙé…îÄM̉¥I½Á́&¬w–đúÁ)#aw°cúut_—”XXUÛĂgg:ÖI0àcˆj °¥ pW3c2ËÄ€…ÂpÍ-ºĂévâöxnvǼCxúaqÚ³ofŒ5Âä+rƯ£d÷“´;IÇÛF%¤4±G°Q:÷WºÔ¬tö-5÷s('‘$eI…E’ïtÉ­óú0̀Öaد­ºÈ©UmƠ> ú́`rÇcư›ßüæ—ß}wœû?ÿŸÿŒ[?̃~ß>b¼ ß›zS0lÖ̃VEjœ,­yëúeyy)/nâyßkÈ…½_uÚbJ>7L"ˆ;#X‰JêêL;vƯwÛá̉X¹‚Ùߨ¡øîï¾»̃®_ß¾₫đăÚ”+‹ )A0àL0e$kz½Näï±¹\$DK?/¿ÀTq›Ñæă&çϰˆÈ5_üĂvó¥¼,²¬¼.²À™Ñ} t?ô8élÔTôéöôÆ ûƒu= ”  ×#|$­àJÙûönfÇq<Çăx|}|}Ûß¾l_¾l_̃7—üvß[Täˆ äD’‘WùªF]‚rB–[“÷²¹Ä@2ª«,_OM¥pA3ƒ>GI“¥¤‰a½-Àº54™9å£1¢†êv®yÅa#,·—Ûë§WUỪ'Ь vum.@¯µ"×fñä́XÊÆ×²ŒÉ ‚ŤpiÚ&œÄQ€ ₫QómVM9q́9I¾ uçÙà Ï˜…đX§óÈ¥×Ó}Tå5·Y„o f¸qkÜ‚[FEœÀpi ´È‡̉ÆØZsÎDíDèṆ“»o’a 6Rư½«7 v 6Ûù͆$H­̃w<33ŸƠÿ¯Ă[ mƒº̉¿(1™x'́¸€xHmô<]÷H'u.µtOª8z¦²E°ˆzơ©ƯĂÇÍ¢aèănf₫¿ù¿øî—_¿|ùçù—£dƠ‘k¢Fª|̉FR̀ZO[CƠeÄÜ”Ơä%­‰́ ‚•VS'7MÈ ươ¯=ƒ”̃Ï÷D)_rYË U²fđ@?‰‰ßAG`(Đçsu88çâדsÊiIË5]rÀ~':T¢¸tỈçëgw’ÑqÖç#”Ăó×àâ %–’t[ó¹båÄ M²Ô¨•Ṛ’z»Ù`²¸Q¡QP§Àë>T ŸÀ‰Ká !{hZ¨ÈfBo  b¯À+ô ›v$Q‡KiÔ3è—ü¢†ÓDªä³÷]ưÊñFYf«MWÓ *…Ê¢‹ÂnBg/÷«¶sƒÅĐ^w[́(Ǧ”¿‰…7mÊZµnmcÁ»“Ç !H§cZ—Jƒ¸1Ä(Đ[*í.uw:°_Ͳ„'¬\<¨WJö¡úđ2'€éÈT‘,‹-iIè·ñÄÆ(cؾưOl[zÉ”ƒD5<¡`;],"q9MÊ]̀”É„&Áó±îíàlÎ)d`Æơẹé±ó́»Ư~xkâ1ÍKN’Îṽ{L3C`ûô ₫àXw%»O±qR“ó#ƯèW+¨ºsPW0Ơ†̉Üj¼e÷7̃ 7Ă ]Ö=éüÔéêˆQ=÷XzN‚–œ3J4U"sª4\¡—œ‰(¥\RÆÈ…ˆ À‹Ÿ|Z¡ ˜¬úÏvœ­Vđ|êYíđ‰P|¼FÜø¶ÜTu)K)%qBZf¦35z°CŒ‰\KƯí ưùVcâ[ºạxÍWˆ/±/{¬}LüŒ ÁBå>öF©³€M?qk›×ưºG­ Ă{Dœ(L)§_üâ¿úîW¿ûƯï₫̣‡¿ÀË>nÖ Æ„ỒÿnăèuuseçÄ÷'lvH fÊLi ßü’/?€đ³̣ºÊ ÆEÓƯ‡ÁÎf^úă9­b{9h³¸œƯ7÷‘¨‚Bó¬çn{ƯêQÇñêÿÓă§¯û×íÜçä(·ÓjfpâĂ!íQ»Ô;‚+ c{ŒÚđ̃Ö„».%ÈXAVqJUw¾s‘€¸¨+ªêøËˆ•-TN=Ñê”T 6M’Püap¡âR~4!^I3+iZ̉rYzÔ­"錣pơN¯ˆ bw3gKFêü+găE¦“9ˆ@,˜`È”U•…Ñ ¡ ·°ß6nÙ²ĂW]Í…|¨ lp2Ùd!đ2:•₫+Äc±ûø— /*‚¢ØØư„$Ỵ ¤,¤ûbÂà›«²ë­ç–L©…±K"ÀÉD^XCÊ5%¹r×cÚăÎSG¡́›3M̀ #ƒI"J´¼ ¤(6FĐ_l”D$[Æ_Xh‰&ÿ Ç»UU=êqÔܹµ®p¿Ùë5»’Ä\ e TÈ$IJ Ü@ˆM©ºÜÍOñ`\¯×ÏŸ¿!µ,ÉDSkªUI”j%r泸Œ™3‘,bƯ=³0Ic¦ăÔ¦¡“î–ÓLüx<êY1¦PÖƯö¤ †¶gCŒ‡åŸ9‡t§j¦èyàèâ‹h´I’$]åH¹ÊôíWO@K!YD¹†Œt”ĂwÖ²đư€ …%gËQÛøwàŒ½¥”̣ùÛÏiIïÛû}»săE–Ê,˜cđ˜‡o¾ˆ@‹ï¬Ѿ×uZîÓĂ¯®ëă³„̉G,D=Óɿ覱‘èç¨n|ê;¯¬g¹†°gybø]ȃ<‚¿ă,…ʧô©iÛë~~;pƒâóa‡ç _iKÛxtªAx›H/DÔ¬|î´Øê }Ê £ÆĂ¿ĐBià (å½̃âNVP8q§ŸE1„>›zörà¾qÏâƯ¨Âê9ë!kN)µÖ¶cóÙYg{;>Û/t°?(_&û¹¡î=×Ó­»meX ³?ÜfâwCü(¾ç¾'°Ÿ9ê₫™± ±è²Qªó@đ!‘|b‡Oqq&à –ÛơöÍçoÖ²~}{oU…%§A)˜8uÑ–©± €¦V«¶0î<[­í<µ­ªµ¦UÉ]öƒ:EDu«_¾ÿÉÔnåFF×Ëu½¬‰Ó~́ơ¨ÁMN+̉9#̀*F]˜v,¼H–Âå¯×r…¿¤Ó •LB‹ 5“—û}¶í·Æ‹éæ| g¶´x°}ÜaƼ‚ Kơ&J—rùöơ›ÏÑSÛÙđp~hBÍơ^WÉ­QkƯÎm«ä°a…¥ê!lÏxDO=µZ=@^¢H-꿦ơ"”₫@ûNz2cöÈ!ö³3_o×µ¬ơ¬ílÑ;¿¢{/‚æB¨â(d…=œ©íuû~ÿ²}ùº}};̃¾>¾̃ëƯ›«̃b¹½ g^¸—>̀ƾÆ,G;5ÁOYA@ră ư}^„Ë oQæ̀¶t/çêˆD€ÿÆ”rÊIœƯܤmÓ ˆăº§5˜±"~¨µÖ¤aÍ¢<Ơ¦ˆ+€9ÑÏ`Z2ƠlËí#¬₫–©ü`ÙU%r8̃¯€†×;‰(ß*ƒ@ƒ«ê·‰úèdTÎPåŒ́Œ | Wq+'µÆm̀`1h̉.°mÅÍN_tλä`̀QY˜-Ùè™ÇÄ@wÍ_ddÅ¡ĐfHíµûu•¤›u£ï¦d b7T "KƯm°Ÿå¡sÊû́7©†̃‘ÉÔ](P9cÁØ̀Ö¼z®çz©—µ®k]ïç}“-·œ5ïâ»Á%à83‚ÎAI“¦£¢r´eâ©ghÄÁYz¿¿ÿôÓ÷÷wRÂ!ă×)Rs(Ä<@1ml( 7đD6!f&Pø`øC̃&pÓf§á>*é^w3;øH–\ê…ô… ™‹,oÅÊĂL¼é­ƯV·Ö!•/¹‘å%_0«ÄRJ)ÉÓrC• 2zHTk«xN`Ú6ÎzU3;É]k>–đ jPxtR÷µĂ[×ơŸ₫Ó?½~zưï¿ûï¿{ûW¾äK³æEEhü¤Qê>Í(@"ÿ§Óe£àÓÆÿ™smÜÍ!§\ÅB~ƒ’ƯöU¬¾'©@¨»›"u¦(–˜œ§ K„¢¸ "ôQưdY_VfÎ[Î)»Æ¯U0Eƒ)´×}?÷kº̃ư[‚ñ$™g¢ütXXrËaL?ó-‡¢•3ças€ú@T&Á䘙0( ½â=%Ê¿°!FÎøqÔ+Éÿú˜®‹â₫C ^gXƒ₫:§`?ëƒO–_Ëk¤‡"®^í²#Ï@ă¢úgrO ÓCfÚ[É`{Ñc¾ÿ_“úˆÔS•ßÉRó!äukKI^@ˆ« û{âYNµ7ͱïO!‹˜g9̉oçQ0đÁS§à“p~bÅ…& _”äFxÔ‚ùƒK4µ³¬g’¬Å_p ™ÆÑ]̃”蟣₫pr bøå/~ùOÿøO˲üö·¿½¿ß —SŸ3ª©©Mby«jm«è7#eC›Q#†®-›%éN ăW’—åÅ·›æêÉ”SX‘ηÍnÄD§WrQÖœ3- ú8]áPîRÚyĉ´, W,r¬818VX6¾€«Ö1[÷¤ÉöØÚvÚ©®³<́̃ )%"úéßúöơÛ};óhµIO½ˆ¬u‡o1C̃V=÷s¿÷ûyßN c…EË.G¬×ÙÖpVa¾uEÊ­Ü.r¹æ+ÂÅ2gŸ̉"›°íđ]v–0³$ÁÉøó§Ï/——·¯oïơ}œôÖ¨Û$û{é;¸Ưî[×ܲc;·÷ă¨ÿ§ưƒÁ»Rm•‰¯år‚$ÉØà胵θƒCJí$iI ¹(…}A©4;/¡LAƠKÉ-tÑF=m!ŒMƒ‹(‘K%wÇ D¶™1ïü~Öđ1üëOưº}Å«*\·Læ•ØL‘ˆ”,™ÁÿU°ăc§Á1 :# lä6(+á",M ñF-Jód‰³£à£OîºóÀM¬Kßé, '̀˜çƠ˜D7"ƯÍL`Å:ûdlĐáy@®>§îG%~l€ Q…b|ààÇQâ;¤ñ ‚ÎÄé₫3›’'ù|`äb(Oưw£Ơ~Zm½P ˜̀g>g…éø˜K‡Í'aq Yñ¨¯›Çă{dÙ–%/k[—sYëZR)µ¤3å–…%i:øˆÎÍlṿ’µæEm‘’[̃ÛÎÄ̉ÂEÖSÿûoÿûoÿí·¤Tkuëq`;8Tàï ‹?(÷I^w3œ̀,̀•w̃©MnÑƯ(Đ«,™º¯1x›‘ƒ† ö,YT^”ơ—ĂK¹<ÚăÎ÷‡>{‚³›™sË{Ư|AÏ]®×|½” ¢Ó×´jö¤kR«SÏqªÊÂp˜Hœܪ²v|`€ïæÑ.R*û¥ó@̉u¹₫æW¿ùî»_|ùá§?ÙŸ”4§\µ.^{ذÉF²˜ZaÓøóC]ƠcĂ—|°ï&ơ u¿ª„Û„_£^êIyØØC ¥3 … mW4$ÏåJ”‹Ak9ø9]ºíBá½cëåº̣SVQ:*Ụ̀b *?Dê‰>m?÷ưÜă~Å-óÏơÀ‰ó7 Bj&Ú̉u;Pw ¾PÊ0Á5Ü™â6¼‘£¡Üų]µ6nĐjψ°7©¯,2=ñä åçà ª@“~À—ÏŸ˜̀ƒ‹Cü¿ụ̈‰#¯&©Á¶Œºßº$ }üơ±@áâ›` Œg”Ă1f²qâ’îô±£Đïî1Í ¡z̃~~(³qlO‘‹1ư^LîX̉”Î;EóÎ5è°˜´æÂE46±M°Ÿ³WWS °l̀:æ(m0ÊDÓ2pGgƠ ߘ/rÉ=%§üÍí›Ûz[–ååú¬P#öË2_`h„8Æ3Væ")Ï#ˆ¸ăñ9₫ÜÑ cPtđ}ü’6·æ₫_ê=£Q^ó Wfwdªîơr­scHưz¦S —›́8-AíhÇïÿđû£_¿|M”Ü®®c9»‘(Ê”₫ăñ~¼Cđ„­ £gîªtxN{©'¬¬Á= ́¥pIå’. ¡/²@Ñ5uØÑ´ «ePøÉ0q;[•Új354qQsô¾ÔŒ +ʹ¯Û×/û—/Û—ưÜÁö%”ÏXúÙyÚY¸¼,®ÜXó‹ ¸BUŸˆvÀ0ÈBẃ[´¸Q³ZO‘›kǛYE93¼ÔA> P-¼ †EMTIPç©£±ØLd ₫£æ¹HÜÚÙN;aüÜbơ'”á Éoa·ÖMæU¯ $C¥€z …Rñ'*åCƒ‹oÛ¤ÁOÓ‰x²dÍ] ;b†»B»­pđÜ}RƯÉ@W֌ߩr§ñ”́>ˆXC¼50#ăq ø–Œ¿+&fb¸b¡ơ D©yZ˜$U®çDDÍ%hŒœBƯẃH2#ÓIØ0z•ç+ôH}ÀƯ¥eâĐØq™*Vjª«®MÛ̃vlzJw₫Á„ÚCk»†§V  S÷œI’%Î*œ8I’¤XXª°0tGï o°B¶\´,º,u‰ä&_¡VơT°><)R0GBÑïÔ©È %ç¦ă›G@áV—lª B h±|§F ëÚGjd;íĐưŸt®¼.¶.p2XiÍœWZ¯éz“ÛCw¾¯´̃Óư^ïN%?Nçä±Ó{ƯïéÊĂm¹aq%IKYnr;Î#¬,0’ i®†µ,¨B9­ñÀ /â¡"©¦Û¶ưéZrÑS“%<çØ£ªÖ,¹Q;ù¬̉ÍÄ­ R;æxÚ9ĂØO3́l&˜#;‘6 `pŒÈäAâŸIOk—³WwÜaÜájÏù¾Ññ PUk«§œ®ÖÈ.̀[̣²lË—Ç—œś¡a€T´¤’-—RV]Ư^¼guñQ·:2„f ¯+~F‘w*?UQáÊ®!™‹,³ÉOÉ8±™»f=¹ÀOÂîC9§™X«Z>¤J>º³{ă1ü¦Ä­«±í‘¦nkIN{ƒeˆKb&jÄ1(̣5)å_Ü~‘¤gßô¢Ÿẓ.$ka_8„`âPíûƯ\›ZƠ¤yø;‰tP™Èë %räïú «ăLXZ8¾.÷ê–Z€ư`VùcŸê$ŸøĂp˜‰­~bbXOƒËŒ°~¦×3ÏC®ëú„qØY<êié^Lc¶̃m[ŸˆÚ"a‚KD9»PÖ(€ÿA|̀)ßï÷c?ˆ(—́S—î,æSƯ°₫đ́ö‰u¿đÈ©¥Ù1é™S]è3V²D µ,â·P@Ăñ³L:%mÜpƒæœˆÛP,x³W}˜ø¨­n¨û÷¶Ÿv‗nÀêÈk7¨‰øØ˜záï?îïỵ̈½ª^—ë üt̉6ˆ%Úô¨ÇvnÆ¢úGÿC0Á$ÿ‰1½!&€LlŒ !Đsj€Ùàđí µđTö}_®5CƒB­ÙûÛû¾íû±3óívSƠÇñ=g—„‚Đ©ùZA^z?̃ß¶··ăí~̃çĂë~­¡÷Û­¦KZ®Ëơuy½-·5­‰Ü¢Bí=ô6Ñv2C.¼¦ơ’/ Ä’A¡`]p^dѤ•̀£Q€ÖĂZkkTªXxùÎ&" Úă·>ö…9Àä€W°ƒqw#ŸÉ«²J’Đq7¿÷ ËÈfăµ$#× cđaÀ§Âi@Ü1Å₫w2,\hp#q—ƒö(%MINǬyl Ôb‚7ỡqE];7¨ÈƒRY(Ú­ëÑW5j°Ă±^v²„!˜¿TîßS¼È«ÔÚjå ̣+«((@`¢zw˜O„Ó=ñ(âäú¿ o7X~`4ø‡ˆä+†H®[ƠÆaªBLNb9ø¨Zéq+·k¾ù8Úk©UW·âÀ€Ue51Øæ Y5ÄL8¸.Ă\†¹D‘}̉”,%I‹.KZ¶º¡hÆ>Œúœ‰+Wj#5Öơ'äª\P¯`֙ǰ¥Nđ {VơÏNƯf¥æs*¤ê"-Ña2b‚ [¡²Đ‚p‰îBØßÓưîïơưq>¶¶9ÜÛ™‡‰`¯;2Ñ/år)—5­×r]Ó9•CÎØˆ:éW{h£WjØi?̣S®™̣Ig±.°L;ưá £¯_̃H)™7̃¨g²æF-§ m:€’SNhbóŒG1°í¹óÛ†˜p´fùù³Ñ¥ó¸e0³Jœ¤W¯gú1‹‘Ûí&"Û¶ç³¾(-¢¼2,j đÙN¯ơ“ä”—mq“Í<́3zÊ=è=k^m­Z/ơ2OÓu2è " HÎv0Ç£M” µÀ8ưÓ“!Ûàñ“7’3˜BÔÛ€VçÊ µÖh¬Á ÁÛ©¦pƒŒ`"´‘3¾êÙz]̉íM„IGÓç ̃`¾”Kˆä‡†g¢@Ô«T₫€̃ƒªûT¤F—9ÓWÔ5®¼_‹®§₫yĂÀ̃º9î΅Áé)Înïwœ¨›ñ”ÇsJ×L  eÔ Ó‘"ÂnGÅø¢“·8£Fô\ÇNB4¦ôÔ€ö¢_è镃  Ï<¹&"Ôú!| œXdlaü₫%d=oïoÇ q̣ư¸8=½x °¬… 3§”À âæûm¨ư1ÉcnÖç8ó¥%EkNè8D¤ ù±vđ1Èf='!`§Đ̣"DÖ_-ab`dµVÇ êr?ª×Ư{äx’#9Ä…âÅ.…ËQ zjIår¹”T",Pß©§VƯê¶ÛÛ₫¶Û^wϾUĂHa ÖâxÁ®Çcb‰ˆ(SÆñï~ä ²Í][ªno±DÆB„lt) ;@™ñb·i€̣ ƒNJ9&o¦Q’_ΙsDƒ£üuxˆÅ} Dö¶ç”÷¶?̉ăZ®×zEp=¯˜…VàƒÚ̉jTÛa[„ª£'P±KŒÙ3§”ªÖœs:S®9·́+·ƠƽRé2èøi_5·xRR´è̉Băèăzat""­+z¶'UkØ5Âgö¯DtĐœÅÀ1‹9e üÄ.r¹Êơ’.<êăQÀDN=½Kùc;·œ̣%_®ËơÚ®¯úz)<À¹Xqh,f˜³̀ºđ{ Ñ‡ºa±×|T›5o87kù₫/ÇqœÇYk eK¬5Íœ›´jU“ïÿm,̣Œj_àSSî?{.²“8‚ƒCN<¢âµG£szzhêú”oMëíå¶”…‰k­Q fÊOå₫¬GŸOñ¿#è\YDö´c₫àÉ')¹©N΃s *=¡Dư‚Ÿ Ô^sC×q{Ûa³qªÏ¥ƯGÑ_Uø¸¨×Ÿ™sJĂ<u¹Kg{Th-Q\YwSˆ‚*P¼(~ĂpR0ÁA3à 9ùsMëZÖbÅÅc<œI@y”%Á¨ŸYî¸9Y‚Ô µ¾> ½ûcA'D €ñ9 ư™ø5¸’Aæ1?A稅'C%ƠˆvçÖ sS’Å,ëSæ‰Êé'MÜ¿“4_w·́Ô3v·¹­A곋1/\Ï ïöù.|:3âäxªøÙ§.Oô˜gNm ¦Ưœ«£Và˜°@…kP̃ÜÏŒ0 Öˆ½T»m<Ă(ºs|áÆ/>~‡ ‚dÂd."4—7HăađËB‚^˜,0ôG=úê-÷sÖâg›ÛƠƒP‘-£RlvhkçĂ³¨ê¸G}lmĂ©€Ă8»ÁÿsZ¸É0!¸ª³œ̉ØàLJ¨³§j}ßßïûưq>ó8ë©M¹q̉DF‰|ü ØäƠê{}‡#2.‚t½ëû.<CjU…ÍÏmzÆPœú¾:˜?üÚÁÄ•·scâj5q¶̃,~–Ơă|ÜÏûÛ₫öv¼yí₫L]˜[küö¶Ü>¯Ÿ_—×%/̀Ǜÿ‹êø>uà­KárI—[¾!x„l È‚™y;xˈ„SÓ$©¦¸&~¡ú²‡k/ưQÿ«†“/çipê[„‰[Fª)kâT¬ ̀ u¨ĂpƠ¿ª`ââ€IDAT’Z6ïazyƠÏ6*6°Q!<Àw@»hfM†¤¿̣˜.‚£Œq¦1”àI‘…Í3YJ– ¼ô²̀RjiKƯ€?z<ö!,v ¾Ïêvæ•jÈgÇ]ÖO͘L‚ñ?ÓÄÇ5L=%siµƠ,ù'N`{Q€o#Ru°Må¾R¸ ĐD`À&;̃˜ ÷W>oMX—çg0ajxT`¸€ê'$§`®ßÎÛ­Ü.ù²Èr-×H™€Çÿ…)Đ⣠@.r%·˜D¹­”uO'l>˜ç÷ºc—p!–41¼S›4 ¦\kḲH“È—Ä7ŸÙÏÅÊ®{hZFb&¬Ïaª¶ÔªÖSÎ'é ‰’îº?è‘Ù³+­…JÀ(P ”TV^¯r½¦ë{z/R°çCa?̉¦£÷ó¾lË}½c,鉒Ưg|æ|OSëhđ•—åëăq¯÷÷ă}¯;æ·@O%€û¹{ƯÖµ^xÔ|áXRRt Ø4\Èg•áB́å¨^pÅY Ä;1˜̀ÆDk)6:y_ ÆL\É#\D'|‘PY ’¼ƒï’uH7°vz2êÁĂé1ƠÈ^t¯Âîî¼”]à׉©ÄµP³¶è̉Z»êÀYOX!MƇoTíÉUƯÙ’Ó/,Rêy±¾px°> ä•‘̉gMÀj=@÷`w"Đà¡:ôÀ΋ÅlÿÑ%àĂˆ ˆ¶Q^c°àitiƒrø¾÷½̃54ä(¬œ,zJ³;ó@mâhđ¿̀#N1TO¾·cB2G;…$â gøtµ̀@*à!ÿö> û-̀—€Å&IµƠÄ©J·iÖ:P.îløÎ\ơ+Đwi`@3ZéL$zúàĐwªç…ó>ƒB&’-£=P4 ̀Uü(4ÁfØ´Ưëư®k^×su.táyÁvçL0Rt9åÅsoü£ÿ@²̉¤ïêB`ºÜ¢kɘ¹¶êhj•*Đœ(F‹81`d¥zØ`IË($Ä—3D/Ơ§eƯ5¿NU­äÇ4?p#ñ~O;…Å›*H˜?«,ùB8äfʹÜÛưÎwl₫÷zO-å”KơP[d-ßûËụ́R^^—W4] /‹,`¬ÉÔM`Ôi9Jç—ËË‹½üưíïĂÆ₫QèmÛƒV€WµDüsêS)éÙđàÅeΛ5mZ©Âz«Ö5Â}ă±DvÄÀ;Q¡}CÈ¥`Ø%j‹_A#™yá₫pöº_XB¯í |ư(×Ö´^Ê¥HIÚï~®*Ú€@Óc‡ñ`LÉ#´‡¦eLçu d^Á%RZÁJÄ$&N êô¹zl²ùÖà&ÀتÖhbz>†Ï™kQp€§ä“vÙ¥Ùû¨c‡ŒƯ>v€y# ™D$èá5h̉¤ ˜Ä©R­\=„¥jOÀUï¸fĂbس÷2Ùü` ¦‹áwç˜z'D m•¹Œ-Đ–`:%N*½¯́ £Ơa¡«r=ơdæ³¹åEO;I8̃b’dP^ÑHÖ¬±Yóy₫!FWĂ<_\ñ 9I54¯̀p W“ºH©Rƒâí_NùÓçÏZÛă₫8ê2 ́3ɺHZK³VóäL-ªh¼ăa3u×]LđØø¤s¨È%›_Çz\y¥Dn̉ÏŒ Rrëg:rsUÀ̃ör–­ṇxœ—å%<¦”°¬<#ˆơr:ø–É̉²,/ú/à£à â_%JÑ%Ǽb°̀qtÄeà/€U¹z %7xª6k•+4xUO2'råï¨:zñ¡æq°%À¡)ƯẃQH₫BZ9y6|Ö|êy₫t.ï‹U»®×åe’ÇñØë“ ́Æ̃ÓN%Ó¨6§3Ư,̉hˆF±ÇŸJuq|¹°c ó&ñ€‚ª:DƠêqà¡ 8ê!Ê×p›¤i3pVó¬âœ¾ÁÔw7Ø\œºÑŸœĂx£P–„¶+]gC§ASw`3²¥,×Ûơr½æ’+UkvĐá<¥‰:9fÎ1…vûר₫G[8ÉĂA¨£•µ¾yw­ƒÆî.qp.ˆŸ‚o?TüAû‘¨7ƠĐAbE¿U§XtBÿ\ú‡|~¶]f VÂq¸CWrXeÏ™ qX>A₫³y¹?”4VƯ<»đ­–»Ää+ÿ7Ê₫”D„“ÿ_çqb"‚ÅÍܶº_§TˆØU{R[¼¶A_}‚…¶ă[LDT"3ư¸û₫E>0‹âA ˜ú,âqƒæ?gᔓˆÇ¿Vr 0 5°aô$^¶ ¡9cÂ$˜:vëå?yYdi.8~. a^ŒC×ư¤K, mÎq:ÎíØûă±?öc?ÎăØÚª5£Ú×csNâD¸ÉaǦBmà&S]bÊœÚÁÎ`±®=E¼aˆÑ;TăUÏêW&~ó‡÷"œ.§0f¯ÔÍáöư܇W]«±Öf·ŸX•@‹13Ju·=XųV‰:ă–̣Qư#Û Ê`ùŒ™₫£>P9å”×´ÎÏ đôߪjk­q«ZMƘknàÓê?64¿zsªwÔÇ‘ÖI46ÿ—tÁÇ-ß²d©nxï›-wV^¯uÂ]¸ÁW ^J¿‡]ÂK”b<:v%IUdD·ëA‡[AŒà2Ô¨‰JƠ*&I“ʈZÇ‹ñyøx‘ïKäóöLv°Ÿ”B¡­ẓµ?{‰Æk‹N ?Q‚ R°„A$€¢QHªU1A5‚T;²0àÿ™&lÚ81xïÑơ ~tN:8¸=Ñ\…Å©í½ë0¬÷üˆ8Đ*M²äM6˜ˆc>Jđ~èÑj$X™™eƠrõŒÏ](*`£…ỚÑ<{g;±p|üÈn{•ª[—d‘oÿî›zÖ÷?¾ß÷ù˜Ă@Û•F­PdèØâđêë¯vŸªH]‚L…̉ôĐs;½g`sáA!—³äR˽̃÷¶cï•*覔­n÷ă~?î÷å₫X¯ơƠ“æ—— ]YÀéÀó‚`uÍ_5‰‰ÛLŸ@߈Ä$uR AǸèü‘£„Æ5sF |“VµVîúF®ÍZc·~ú™7ߨ6._¤¦f&ê;€w³ư œNӢƃ*F…,›±mºƯ;¢µÂÑ뺩ˆÍ3†„3m!ư Ïỷ]5;öé®ëA…®<‘©æÄ '§¼è̉¬å„#Ÿ;‡ÖÑ €0îƠÓ ̉æ+6ôuê9Ç}–æÎ°Áw(i“@YTrlèvªÖư@³–[>̃OjÄÊOÑ ® ƉᄡiÄfvs­›f¬¥á¤·˜?ÛAåwuíÈ®>•₫¾32Å$(0È9+²3£X‘É m†¢œ ̣ñ ̣k¦;˜Ç€œ{»bS~µ…UóÄƯNĐúCÑ;æÚ,Ø_æB4,!4¹â¬¥ÿ’½å3₫äFq?ăưø]ă*=醌½h ¼?N àÖkwPç0ñ ?œ¬ó7z~øA4jÔÎÓ}]P$ NÿôDơ [LlâeÄRŸÏÚ¨¥fH`-ëËç—e]¾ÿË÷ÈI½” V—;íÀ²+SAôwÂOơ|œ íFè†ç–đX̣́JXyB{·æu-«»GwºøúkÓÚêyÛ¾=öǶoû±ăă8ó¾“=áưLö!ƒÖ;I÷äaVS[ÇøVF±UÆóä/)f}vºñ‡æơî€ôÈ^æéíktêbC[2Œ)yú¢±{kw«‹€>—ÆÅ ́Ó7(}²fFÙ ¿Zơ’P°­bJ9œøúzw;̣|ê$]¯_Ås—‚^åNS½ Øyµ+Ư)ø’K*†zÀ^VâHr¿fö”èÑÄƠGa¸©©¥&Ígµ;Ù3Ÿ|R#ŒÔ|hFs¡ƒÂ# w‘å—¿ü\É₫üăŸß?´§dFm6&Ø=bůa?\f-}qY>œNcCA~Éß₫êÛ·/o_ỵ̈ơ<Ïp¹ÅO_eE _0NơFPTo›lóñ~¼¿oŸO¯ëë§óÓV·×åơ¦·K¾\ø‚ódt ¤)(CbR–r]¯·t«µ~Ù¿¼ï_÷¯AvơJªK“Ñ?Ep‡¯Jc´€~²d"MÜ«Ư±—ÚIç₫Ëó31f°Ǜ(Q ªêâ$₫g3f~ßßÿúơ¯Ậuÿú8‰S®F:>c¾ƒÓ1¥ÄÎGÿ¨ zߢ¦Qç€́JLÚ\»,,RŸŒ­ăơ¤#wˆ@ØVäiôT[ µº‚PGY«>ü&ủÍÀÈ– fK¹Ú”̀yöö;zXJxSµƠú¨ü—?à»È¥åK5ª>kd„ÑW5«₫¢U}bĐ¾œ½Œö¾=YyÄÑ?5Æ—£â`ÿséï9MÁOáƯ‰Ǻ†q]í! íœ9ư~Œf*p<µQ^8&ªv¢^™BÄ¢O•QŒX,/N—>°HN§Ÿ{:f{0:'úOµ~ô™…Øs‹)4=ZR‡L”f°ß¦́ŸÖG­0ÛúvÊD­|óí7·ÛíË×/ÿö»s¬·9á'´ƯQ3Í"wđḷ ¦YÔMư> }óüüéóüûÿøéöù»Ëwo?¾±1Â@ í@. Ë|Ï ™¾(ưQ¹Sj̀́zé_R B!–k0|Ö¼^Êe-kÉeÍkøú£b¡„ÔưÛ±mÛvœÇ~¸í€±}úüi¹,_̃¾<̃îIEơ´Ơꡇ i¨Ø€÷>̉$º¥)w³£đ Fbåp¡íûàxTzÅépcï̉£¢2Êï0mÀÊ‚U®ÓººqÓhlê&"|î{ÛCn4ÓiP‘D=„̣’/·r»eW@º±¹ä÷hÇÖ¶­mhĐcÄ’Œ=t¢H"+Ëi'ØSAÿx"ÚÓd´‡ÑwÖG XÔz!Ö„ÔáZ®˜]x.›åLÙ-³¬›°ñÓ³ñX’Îb­€½˜Ăç8>©ÛùQWÍ‹(¾•_mv²Q8…Ï›CaE°|!¬S5M–ÂW$°ƒS C`üÙĂÔó`<À³꯰ä""đøúdÈÓ[ó?oDBƠ*ê‰(ưÇÓƯBG@J@À#cĂeífYĐ9øƯSÚ†Iêæ{đ$ö]±Ïj¼UcŸQàŒ†É₫°Ys5m+¾•ơÁ(}¨e}ÄÔ[PJ,Øf]{<úÀ ¨–³œơ*̀Tös?ùŒêÖéÁƯVôôD)[æûÇß’¤÷Ç{¤¹ÏÜÎx©ç̉(ÙXXZÆ8#F-Kƒ€WÔ!’äóçÏ/Ÿ_Ó’ÇăÏÛŸ©#Ϙúy«¸Œ /EÊv[ƯN>“¤Ü2è…÷ă₫¾¿¿­̃ ¼.¯/åå¶Ü`ê°‘dÓäѡǘ YµZ}×w^×ơ²\¾{ùn;7ä¥<ü*4¬¥zâx|8î@ Ü'„‰N ¤(€_„ˆ±kN¬¢I€«¦p1åÉÄàÑñI¯+¢Öă©=&#¥ûvÿƯ~ÇĵVkæO˜%F•FÊSö­ ’êÀIŸ¼ÄûI!]-ĐES^|÷ù̃£¨ŒÊ§*ªÿ²¾I9eQ8KNÀà_u g;tÖ3Œ†₫G¢á¸JMÛÑ4¨̣Ç`‹É@H«£Ù–d)KÂäPTZÅ4Ó ¸„«é¡ÇX lq³0pÛL–ü81nŒí‰Ä?È3m`ÍĂß؉(æ,₫6DF¨2*́‰äEÿ|P¹`×N N=đÙiưÍט¿~r§ Ôb2ë»̀$…tuåhBæËƯK'ñÊ«µ;ñó₫2¾~ø½ăœ€(ëÇŸwÊÚŒ°›= UÑqơÿâĂú>uO-J\îñ¹WK¾Í|!è&›6k̀œrºƯ®À×óđĐö‡=Ùl¡a‰E˜ÁèÖPÅ#1t-’?¯Ÿ¿]¿ưööír”|d­ƒ@Œ¢ ₫xm û»̉wª₫¥§ùº^'ơŒ)v†ü/Ë%zwøÁ £ÿ¦€ö÷sß¶í8íØăØömÛ·ªƠ\̣/~ư‹Oß~Ú~»moÛ®{¥zê韻GíˆPé̀cˆO|ÂNC6„>ôÑ– - Sa 86Ó¹T¢áy=í`2¨F>F4uaèôsÂấ|½w¨n¢úü+Içç¶xơ¿Êh3Kà ¡832X¸·Ûfÿí¿I÷÷{•ºñ"ù™3̉Í>lÅø_>E.+Êhxà C̃¶ &›ĐJO#œ|0Å‚ Sô·‹,»îHZôƒ½îy<êăư|¿÷·ăíuy}]^_–—×ơM.O"7ûRÑÅ–;R‡ ĐY$‚gηt[–好Ø|ÖSI³dU­Gơ™,p‡E7ndĐ?TªÉR1ÁÀ­QSÖªUY«U•§i5öçbĂ₫#Eꂳ²U­ơQû¡Â¨*WÇæ»¨¦®a­1sÖ‡XV8LîGǤ:ÆkÑ̀G[œŸ0&̣¡÷R &7}QÄLlbˆ{/RjªªZs=ô€/œ‚­¢˜Û€p;I.h5æñxÏ̃n46¤n}‰*!ö%•hw>ÁUVÏÚSÛQ†ơÜx´T® xæ¯ûW´ƒ3wç]»9Øó½˜‹Ç%öL Ư¥g¢@ÍB^H48̀^dĐCƒŸ£=…'İÔ+l|†;x÷đ‰~4¶xms,×́ÖC€0á̉?(Ñ †R3¶]/’b»œ*₫ǿ˜<ÿø£ú—> ë!œâD„(́ûÇ@#â6úípë̉^Ä?-½ÎĂ₫>êIˈư¥>–5À]<`¶æ'¢·û—Tèm{{œă8>²üm‰Æ=aÑ€£Æ]›4p±VƒÁ‚r ̃Ÿóç¥-¹•…–k¾6vOpùuÔ¿n ~êÙ¨™7{ h?I.%NX́âŸ=ƒ³Çf;r‚ËâyQơ₫¸ß·û¾;áç±?`7†Ê^IMlưv}ưƠ«ư™îvßtÛ'µa³ƒË‰îóƠÓ¾°¿»̀ˆ'Èä‹Ï’uyÀ̀?~j:f̀˜k<`Ø °ß E£ö(½‰ø7›¸Æ:\nBÉ0íè™™{K—Û-ßnùv-וWO\6ƒ© ˆ"¸*Ɉ8ˆÖÅ1Îơáĩ²±Seîy"|#ˆ¥´Ÿ1=ïlÔK¾Ü–Û­Ü De°¦æ?‰JÏQè̃¯Î3©PêØ*“¤HuesGߦDü/ ưü %†ó²Óí~¾Q|lúس£ê~|ºf×HEÉœPä2¡pøéY.±Ï{™Ø)O₫…¹À=`ïø<»ơÏ<¶÷]‰Z6SÆÅ̀>5³–<EvĐo‚Ï0—₫cJ=Àỗ1xÀˆ?o,jÓ ¯eĐÜáÅ'N&kö kEL F̃µË±i»™•>¸{HÄ %̣|âĐ™I8ˆ£#é?ÜØ€7)MÛZ×3G;|,粧᥈Ơáj† ÉÙŸ¿ÿ‹ Ÿ'>ߌ} êd'dJ¹ä——œ²;¼Áb}s$¢0ÁŒfn÷¯÷¯åËQ}ß!0pNÁ´×gÈ‘9v¸ưÖz<ÎÇư¸ßöÛÛúöº¾¾,/ŸO/Ë‹/ùr»äKȲ¡röâlÎím@³vÚ™$¥”Ö²~¢O{Ưó8Ú‘Ö´–ơ±=~øáP\¼ăíÉÓ¤€MAÙ–F­Q=zoèàƠÔ¤ÉŲBSˆtl !Ü¢Îs¬ĐÉKä1!9äpĂ=.g ˆ~T¯‰ÄD+ ³]ÀÁ€·´)»CITƒ¬Ñµpl"!pjkÔZLØú´àñ5ó«çf :^?a›§ ÙyȲ$IKîÉ_áüÖÇ(4_uÅm=“§–ư€³ôƒ Ï-nw₫ññcL~®ÚôΦÅEÑ+gfødÉ(°Fˆ)¨üè-Ư₫Ûhp•ÂøÏÓ`Ϊ₫ùƒ¥à ŸÙ8``K̀₫Ôí·ûÓæ&»’ÆÁ@OlŸ¨øưO:ûßùîêú¡7:>ÚÊù·!ỜüưäĐ¾Wüâô´́ơO½íüŸ=è3à#̉Yg§ßxƯߺÙ6Pö7‡RđơYÏă<€ô¿ÿ·7b>Îă¾Ư$¾6 acx=̃Ú̉SủĐq®²^óT5»̀7§l»mô@˜±’ÂóJ_ÿnVq7đ Æ?tĂøCç÷wÿZÖµ¬ĂÙU59ÑÎ0çé[€$1¶íØ̃îoí±ûvnÛ±¹9ؙܪƠ·ÛWưqÿákư íÓ„¤wă?Ô÷°Ä×> èé¿î̉ÇÂo¨?¾yƠzØñûïp¯0©K#¼Éº9ÏÙνä£i·Ñ₫ÁåúhàœY&5ßî›9èÈÄD´æGéky½æë*+Ø;xε‡* fö7è"Æ@›VYqéâ›4jµUTĐZ ÜÊwÂáÜàJ†¸/;ª:öƠœü£úG÷‚ñÅ î^ƒksmPrằp¹EëA+LLan]§+&"ƒÎá¶Bb‚;ÿ+8Kß?_€Æÿ”'ÀeBÙáƠ9ödŸÇO—¦‘ =Q8b@*‡&zúl2¨8êµÈyĐÑÆ ơ4óƯ¾¬Q|ûÔ%j—Élt́°}ăơ‘ú4=–1á/úÑU¢–ÂÑÆ̀Üú6®‰ú\×Ư£ç €‰9®ŒM¾®T‘6ßPܸ“ΙÑÍ€‹̉…’"€  ›-“9Bd,%UƠ¬µÔ³G>.岟»WNOZD;î4"́ÏÑxû”Œ$s`́̀^©NOGè…¢fÉ \qˆçœ% §J#D¼óï¿üđ¥¶J.åâ% »ÿ8hîÀó†H@D0k]m=Ó9Ú­g=1X¾Ÿzø²¼¼-o`ƯÊíeyë/,ôpñ¨|è¤åpÀ2O”rηrû.}÷›ÿø›—O/₫ëŸÿË₫_Û$4ßÉ€ç±aX„%%1€Æ-¾œË> Œª pF3&VÖ}¢́îăJ<îf«O™wÑKA?ÚGgêAÑQg£<+©<ÑYg/–î 3±+z1ÙWœ7̀̉; vº ºñIÔuqbÎCiÏđaL¬EQ{’U§ÄGơï_w<ÔÏ›¤*@•PG(µwƠSb8&Bp‡7†Û ¥”)/´D·3†ó“ơ¥ĂXV#g ÿđ₫V‹;µwö¿ö$äØưtá Já< wÉ́¼™í¬V I†½ôÏË"KÉĂ¿MkPü—âTŸœGîLÔưfȈªªZkƯ¶í¨ÇËëË/¿ûŲ.'ü₫__AètjU+ªÿûă₫_₫ßÿE²|yû²×xÚ’óC9î¨?/µƒÈ›‘Má²”Ø"™Ư„w¡Z=íÜuŸíÆ£Ôó%“’·Êö*0H€G=B‡ă‹Q?6£ñĂöʼ¦ưs•àüùA%#¹æ+L÷^Ê xÿÁƯŸ8Û ;C&él9Ă{Ü›!rZ4/ÁIƒ́7= 1xj¨ ’ÆÔ¬Æ[dYózË7`®ư-—Kº¸&;Ê d8è(颫&Ü$á̀kÔ¨!Z8SÆ‚óë8ºĐû|Í?~®¼ñ®C}è @đmh Ü©§à̃I·“yư~ŬÏyÀØaGæ£T5&>¹buC@-At́Kïå8đ‚t2Ó Ë'bẉÆ&$ơ¡,́û̉(ư'åĂÇ(µ{v?oÇ÷Ÿ^ôDÁ!M*W†$·Ë p_ó§wdq„ ÍÛ¤̉n(¤å8÷dIéVú~p§œSÆq !á́V”ˆ3·Ö´èYN€AÛ¹áă¨Ç~Ư5e—†b(vc\¼/'ñ¶ô,âGça ̣ „¼–T¸z₫nÍ8Ư”´æ: pG P A[S̀@b~j,)‹.¼EΈñíxC 7ås€—å(:–%;4Ằ—å’s®T‘ ƒçÔÜZƒz$N•ëß_₫₫öéöÍùío¾ưÍ}»çqœÇ^w7ơA9«.À®‚AOôĂAÈFÍ̉aô ¡J̉˜6ÄĂ~~&̉X·îíL›¹<Ëơªs1‰å*&îÆëÙr05œà:id¼øÄ5ºVê”ÅX¶Î¦³´ˆ/¸³.mĐŸ¢§pߨ±$•#Ï–Ö¸ƠTƒÙÂÇƯ;m>Ö©₫,U ü¦íàƒOÆJŒa>ˆ XỈÖœF§ô¤è™QPƒd;=ê81q¨¬ªù§í§ ø*­ĂxGŒÍbhgeđû‡`‹††Ç-đ6mîjC·î©Gđ4Đ;}PJDJ±§.j̉°‡– ºÉ§ .Äî̀µ₫Çßv#¹xưÑÆQ*÷`]çêE€}ßÙbÆ&"đ§>%wÄ‘qâ™;ô=Ÿ¢s3¿¸»æÅ¬ đơ¹;_ÔÙ·SµéÀ!ZĂoàÆŸô"/ïºC³‡¡à;ĐÅ4Ĥ̀iÏ|èrpÚ¦å®×å Å¥\pH‘v̀™è?Óưvà1Ă b¬+Ëï•hyă€Ỵ²”¥d÷Ôs­§¤øƠBơÔ£ƠvÖsÛ¶ÚêåóeyY¯·Ẹ̈ºÜëưë₫ƠÍû©bŸu³6kÚôñÓĂ­£­\¼·—Ü£àQư;tƯs₫̣—₫dÁ¬pLÆQ¼’ 0N;‘$€Ê(†đ.±e¢Èƒ_7Ÿ—SÅ;KL6Ñ`; „,knÜU³ÿƒª0ªF J Î»åv¹A5‹XüÓñè:µk£‰ «MÑ׋\®ù ’wÛF̃Ö¢üuzIW Ê}Lü½ú×gd¿£@æØ>QưĂ2<¬`ëá0=¯ÁéÚ=:X.Ü=…}›2g˜ ôG?`dÉRTÛ`w ]¡‰»2´U‘bị V±xÆĂ¢˜· ¥÷;¯=  _øF’dY–¬ù¼ŸÔFØp£æ‰M<s®àp;蛼üQ堲ĻvYNçτ٥óxù₫’ú0gF=ă5ûœÚ˜Ÿç/pƒ0–Á\́x“u%bëuRNU¸±°°q°S<¥AÜvûL7÷nøíÂóz2  è ´açu±xa0Í’=Æ$åί2FpPsƒ’ iÖÚêYÎk½îç¾°tÀï‚3 ”ưo[~ ›wGL|è"SÛhË’sÍ1Å@øVn—r¹”Ë%_V]a+œRêF¿û¾ C‚æ¦.qѪԧUز*ᳩ¤§œ.ÓRW"m¶U«{Ư·²ƯÏûí¼Ưûµ\a¹0@<%æ—¯¿üÅ·ßó_~l?66N’’¦“OnŒ“K{ù¿ÿă}¿o÷­R•"kZ—e¹µŒ)[mg;½u1ĂHmh»aö¨? g¿àưQׯ2Ä6…2~ëWƠ™j¬}cI?wdú¾»ơ=m´]6Íy„ h¯V±:æ¸Uï̉°–¥qR#ªÿ̀G.°˜(̉bkÅ|ûcæÑDØèCè „ă=Rr3’%-ÎO±n(oB©ó úk3ß÷{üøŸĂZÑfÍ<₫ f9Øß7î±êƒë‰¾O¸Æ"¬çàöLœ₫èQĐ•Fñ[̃|œŒatôJ †O₫^뻤l"ư;MÄ-`̀ƒº×¤{Ă'êµ>»Í‚—ơ±ÅŸÇdÀ«v†,ơ1ÖßDĐÆ,>₫ÉÄ‘}zĐûÙt=uÀsÍáG‘‡Ï=ñh2îTç–á¹D{æµ~û‹5'ü VĂdæÈ“8Ă*K†m‚C₫ù‚jiDÜçRr§íàåÛ­”ơálŸ®€Ac†‚xf”z‰ß™?øí¥\–´”Rœê“JØx…jæÊ&U}ß̃áæ ́8Úệ¾üû)[ùñ₫ăûù₫̃̃›6eEp¦’[e@^Çä±?Ơî0ü²Œ̉¿Û~‡œSB «Ü cªZzXŸ„°­"IJ9ÅÁ?;‡ø4=!áñ53Év÷K†ôYQ©TQ^£9ü›Å0â™–5¯®«+/¨Ư3g ƯOlǼøÆJ·YÀƒ_¿P©8 n+¡·Hߣb#s°ÄΨ₫qû¢äêÛô’<Ă×åê?å8¥[EơÅÀŒÏOú­uë¹Nt́ü"‡I<3È  äöɈ’+taÇÛ<;O=tAqxSj=å k]ZŒj|Oë’ÙØÉsÎ/¯/Æö¾¿Ç¥˜"ÙX#P=l5Lܤ%ówƠ¿°°öèC¦¸\x¡h>Øn¢Ey<™/̀癈a¬ồ›÷èèfguÙ"@%h?>L¤ W®¬Œ÷E]8ÑŸ§ä{ơí&î\•«²o×çyÆHÖËÄÎ#Å›J’RM9eøü¬em­µÜ4wJ”‘—XƯP˜™Z-µÖz–óXưØ·ºmǦ«ơÚé>¡,>± ư™Lœ²e$7gɹå÷™yúP¢´¥­¤rÏ÷°ÖE›f`•u±%¶¿øHÖơ6Àæ’B§jD̉Ÿ*0/‡ƠÔMMŒL“ªiÏØÁ¦đ]¡JG;vƯ÷¶_ëơ~̃¿¯Îe*ëwù»—O¯%ç³?üđºwp…ä䓯Újû·?ÿÛùdDJƒeM¹Ô‚×|ÔcàvMƒ¦¢°4íD “f>ẹ^´7Ï8µ!ŒAPh&Z±W)Ø Ï®'™³w_ÁºSÇ©ç{Y 8Ø7œf„²•…“N¡L”<£m ̀¶9°ï\P‡đ»JÓûÿ>nuùø_ctÆ£3N°K ¨Î”Uü6Tqâ±W¶ṃ̀lĂ1_»­êLáö—¤;`qøṚRŒÅ¼]+¡́:K¶È‚‚ £”åîÍCÉ̀[â.dØóaẃÀ)„ktZ,? ˃ÍY¼öt°Åômfơ¸Ájo‚.6o¯ó´hnâ3ĂÓC̉‘L‰§¡₫¢?X@=l/æ&qẾ ¤ Ăÿ£/¤¥ÇÏoÖ1V†Ađk£ E¿¯çæd¥¸“§c’åíSçÉΓ¸ó›ÿ₫,¶ê.₫mt‡j:Œ}lbˆÁû£ç½îa/ÿªYW×eÎ(¾ËG#åKLuƯS_²çY"+ê₫z|°÷̀̃vàF¸6EJÜÄ$Éw̃´®eƯ_{3—¥LÉÁÆÖZó{-vGkíz»2ñăÇÇc{ ú?Ïs?÷ă<¾ÿoßÿÿŸÿ/ï¾ßQñ£Ô@OP â₫̉öÔÊ)kZAø´ÉĐN¾äKè}ư<†'yµfí°c·}·ưĐƠÿ˜û§^ú÷w ß"{£NgmƠº¼LÁ·a!¢”R´ú(«VªÔ´aôwêù?¢…ÎÚ]̣åÓúéµ¼¾,/×t]e…ßPs (Ví©_ ¦D„…9û¶_= up O)„q3§‘&Àđó¶mÔ> ƒÅ“́£ÿ2X óO%9Gg„‡̣H\™­ó¦ă‘•œ2B¸²d·ăHS¶.cî†HxđđÆç匲=ó̀Öđ€jÀ`stW/î' } *ÇÆÄ× >đ~)Éív“"₫럃#œ7xpE×™†×Pµ G85j®sP‚H1q ö9…u&éôÔ”₫³5Ù áǃ,ơP̀¦Ă;öäqTu.Aæl]±-樿·"ISj ÙjñƯ h2ƠÈ)/eI)…̀épµF°̃V)̣8_¾~ùú₫£H6%f¼`#"r‹̃&…KIå¨Ç×Zj͵¶ªM[n´¥œ(Q’$YØxµU³"(ă( pà2Ø¥#Ai0N­—}f¸eñX-+­—tÙÛ¾µm“ Ñ~ØC‚ơtÔă‘ië:ûå#Î`ܹ—x›Â™3æđ´Yk©U«µ¸¹ˆK ›‡ ©!K.”r¾k±-´€4ö<Ä]Ä$Yˆé8VN”ZmïÇ;̀/Åá­}Ùm¯|æ”(ñq­6`éÀÑçØJ¾ù„{rµºëNFEʲ,¯é5„yÛ¹!_rfXW +;iPeŒ¤:÷Qè̀Œ&kK2J— Ơ`}y·̉P—“‡ ‚K¾;Œ;8&ÏÛ],| Jc¾gÊʘW01†fáƯ’Îá{Áƒ"/‘â*L‡}ËàKKÏèàÁS˜©˜€wlró$óª)øYr³fÉ6$u6“ø¬ªhŒçÔ,_ ?³ùê^w—Ú¦®8´¤%׌faR:Û9‡¯ K2ËỪ2³CÂŒ÷G0¸̣Ï­^óơÛÉ`Ư¹·nôˆÈ¯~ư«e]îûïÿûƠÿ „‡×@”¡ öóqÜní/=[mXDđ1&Ê}rÀ¾Ó_;Sa[á?5Qwæ¢ß¿x®o¼sP›ÿïLÜÿpvr?æïs,°*éLPL»fÖPÇU¦3U--`ùG 2j‘æ~JOđ½UYA¶ÑÇÚŒtgªÀ̀A\¨º¦5~§H&/Á½Q7‚(nVG;p°Á‰y«¬ßaÑ€e<»Ö0qJ ?+> ưxpor_¯€SÉê%ZŒ­̀l¡……÷¶·Ö²å”̉ă|¼ïïơ¬ Øp<áÄ£öô·Fçµ?åøk±‹ùUâœơAơéi²È'vBK‡«Ưÿ›n¨₫«UcáLR¿€ü£úwÔÄmu=wkƒ`#$™rÔ ƒUl}Ônk÷>'Bóÿ7)ê$l¬·åöº¼¾–×[¹¡ú_xÉÖmû{ûă/¼÷"Åß§œ²ËÓ‚\ˆA¼é ÈXL£ẹ́}ÏDEqkÂ= C‡ÿ;» ÚK—'–‹Óư£•Mnå›Iÿ¬®MqéƒIƠÓ^¢Ón@-Ø¢›5tnj,eËc@Ú j¢©ă_ơ¡|èĂ|=OVă²×¢Ü… C˜[¾ø:ø3c{6ïßZ{{çÂ'à³ ¼>ù¬pÎE ‰¿!¿ƒă¤73¶0¿̣¶ª™Ø¬¸Nù6̣ F‡ø{̃®ƒ#ÄƯ}̀Ă[ hæ ø{S§éÔSX’&t€1ă –‰”T₫ñ?ưă§OŸ¿~ưúïÿ₫—Y‡®Ö´$)R¸´½µ£U­Ujẹ̀£Ïœ15mÚ¸zÇf»–u©K­uÍk«­–Z—z)Kô,JÔ´]̣å¬ç^ö³.®ûV7́.&jµÇ1ø{)aĂ·º¶ë¡=»½m` „—53±­nÍÚV·7y».×̃^Ëơ’œy?ö7qLK-µªµ¥:ĂØĂ!ߌ@¨¢®gˆƒ{@ŬZ^̣r]$Ë?ưøéó§×××zÖ¿₫å¯ÈL¼´Ë–·Kºlçö_ÿå¿₫î¿[̉¢U·ûæ[Y÷ ˹̉˜ÅÏ<ë̉t„Ä 1|—§Y„·˜́®U®-ë˜z¸́¢3CŒ3E{Tóuªû[{ú¿˜ Xđ$ÈÅŸÍf ÀŒöèéaç̀œ9#+§|IàeÊ,̀œ›!9Rø¤~y èkG#6®óÁ°±Äœ<=Ơ1ñFB•qèQ¹âQÄhèÿGÙÇÄ9çk¾‚ùsË·À₫ éÁ½~uÏc -nxφ!h5±áÈŸ‹³\ˆ,?¼`!C!àđL§ä‚Aî{Øâ”•üa‹÷MÎß n"é{f·ÓYp$µ›£ñQ¡ơ¸nÉœ7”4ÉSơEh—²Ó^»ßÚh¬E{`ÿáq;M‹™´ÇN7Wq"~¸ă<à7­µ÷÷wÓ¦±Ưb:úôƯnÚ%3¶,'ëàöÀ¢†³ª+:À}Âcƒœ;!÷rO€ßôM‚ÿ@<¶è ₫Î;6‡÷HxXuë¤Ö| àp›¹qĂ«R¥ÉÓđg2đÁ`æëåúéơ“5ûI~¤®×‚rÖÔ~Y^́baÓé;xj·c$çL¯jW˜`.yçÏq—år'z-M5̀(Ñ’—µ®xû¹ï§àj_.e¹,ÇqüôăOÇyhsKrôŸ₫Ù́ÉCL½î›zÊÇѳT9+UN ¢ïù¾æÆ»×r]Ëềûp——¡óI’T4kF «~\(W´á̉o°rCEO>ôFVR¹ä‹i¥}Z>½.¯‡ßÓ÷ªzÔƒŒªÖCgË—x­k))‚?yHɘœ7†«˜¸‘ûn!>BTI¹°$¹̉ơ²^–(Œ4w>@\ƒˆ@ùƒê¿iÁÍ`Éă™ÔËp4ê½€Äél“ßeq?§Nèg¡Ư¬ ˆÑ8Ñ´»;jÿZpÿ>‚́í¡®>B॑?`Ă“}êä‡N kbƯ “,&BÁq˜1 ëÚưqô#R€²ª30Vº«R„:¹íă ù6û­_;œ¹RO>Ư}§“ v¬û9“Qf§ESô!‰‹™óẸ̈‚æ8È?,\R,ZkPжf ØS₫œ,‡œ0ɶbÁ°qÓV­Ơîw₫ÔTñÀæĂƠgvBû*2bPô#ç\>ÄxQ·ä'©!›é'îlÁÉ½ÎæQ÷CCáxừṾÅcL:ƠưaÊfƒ—QvƒÑ(ô}9%7)w?i%i1­öç²O„ç̉ŸË¿#Dyz£^:²G{€mËÊ”\ôT"B‡p5Jÿ’‹7yïÏe8DiG̉S;"+œ4§ú€á“Ö€ù;æeO=*z˜`¡̉Aª LmÛ·‘ư¡ƒ"I2å!=$÷T);6ë¨ø/äK4êû`öûÀdb³ÄX3.T‡:ñtÓ möqbB†NJ €´ÿ}A¡˜-lƯÖV536Μ•Ôu/6¼e‚Ubæµ²UcåDÂ×Â₫ü/"Ñđ3ñe¹|÷Íw¹dͪ¼<„ïƒt"œ9£WÇ­÷ OZ‡ơđ4óÅuO³X€x=‰’ăå, ̀€aÈƒÑ »§™ °’C/xx̀|¬$Ư–¤ß©`ë†!IèïcÔæB±aŒU¦ zKƒ$ĂmÔÓ {,‘ Ö@T445âH ÈȸâˆfW‰q,ư-®fỖ¶ơÔ3RÚw7¿ p‡øă¿Å¡Ẹ́èÏI›´l9Köj[³¦¢`½Ä» ûÂưC€-̀ûX³ø'ñäDư$¨¨̣]̣‹/âa{:»¯ö›è{‹}ôx EƯ»}<]z8£ƠÛăr¿×ăÄ÷ º3®RÍ/²đẹ̈,íçîxm0̣wFe;=N:‡÷”uµG=–¼ùÀN~ÔcÏûQ£çr^ËU‹Â§ßqÖœYTµåv”ă<ŸH›¯ß¼¾|zÙ=S₫̣ơKk Ơ¿‹E;mjÓ†lD4ç|âDˆÓĐ+‡j ÄgÉóá”›²Æa/Á^F¤@÷"¥¥Ö´­ymÚÜs¼N]z ẂAµ÷111%KK]Èè…_–ºĐN¢²Ê}₫ ˆ×V»̉#`ç̀Wî|ơ™•€mơ;e#cÿ\©Vª̀́jœÏz–V\$Đ¿ªU¨j²ÔZk̉D1ah†Uhw¤mÖ*Ơx’}.×Gp~€²‚K`ñèܾC<Û´C¯>Lî́5-VFé̉(bö~ 2Ë̀ÇB1́ºán”1çdzûëÿ5 Y£èÅÂá ²ÆÍÏôn0TçPØ@CbÙúx 6ÍbÍRÆĐ̀É?èàg=ê1«RCKƯ|cJåk¾×}膥€,!!&Æ_`æ|[oD>¾‘îs_r pܘ ÷¸O;âă³À1ÿ~‘ñ¡ÚêŸỵ̈çüÓ÷û¾ăÀW i=->|æ>Ñ{FơOCàë=qGÓ‡8rnUĂ"íéë̃ÎÀÿsm’ŸÎ¼Y46ö|›B'Ÿuî"é¸Ú@̉äß–0œºÜ.˺´Öö}?ś•}JnÏễ™Ơóñ‹tÇ®ü~ŒYHă©øz|}ÔÇ£>ç£Z\33²’Ëơơú«_üê§ï²j‹,p<\²çUƠåø°Öa¯†‡TW°mç†àl§zê13n#§2ªä ^ \†–₫ƒæ.ƯƠºƒ˜ê:£_„ÁÿQÔ©SƠ'Âpµñ’‹9§Ĺô¬0°îÑ1l¬&zƒ[ Ó—]É4*;˜í¶”X½Ü-ÉPT«‡àüàĂƯ~XM’`\EªÏ Á¤dúx_~¼™±q¢4æ]½-—*¤IÔ%èâđá̀>êñ7«ÿRÊq¸Ỉo¾ûÍÿ₫ÿß÷¯û÷ü>µt‘ ˜?™3ÓóóætȽM2gak B—_s£¨§ƒàá%):màmêÜ€!ê?`ö̀ * ÿ’KÎ^ú{÷C«ËoœYeÄófAăîö̀™T4D”8)M:5#+K‘$ªZ©:'ÉÔMè¬Eoj¦ŸÆ.+r̉ªa°?íN}Ô§îĂd|̃íăú¾%÷€Eëœ̉.‡m<$ÈÖƯÂÖ´!è·¤R¸T©™3$™»„´3€½ P‰÷> ₫|·¤gâoÿˆf)ôˆÖegGËÛœ0æå~ûz¸aºQñ¸ªLfæˆoP/:5îR߳©Fc8¿Íé§q‰|6 Ç %(¨0Ïq¦£øáùv¼;°¢ÖƠ‡º©œ˜dÉ™úṭÙÓ`ˆ%̉ H¹“©$ /¸wpøÙußtÛußu?ílܸû"§œü̉Ÿû–g)u´:Ưo†…4ëùỉÛ6ú̀̀ªAiđéÛO«­_ÿuoû^÷Ÿ“Dä¿øÅ₫ß₫·ßưö·øư¨̉­Ü>¯Ÿ?¯ŸMíȇ©­¼fÊ™2ÎÇë;Œ)L$p(âŒ̃2Æ#syªƯ`­Î\“1s²„±²£YÏå`r̃µö/`¼ qñuñ¡úǸh0$ƒ<„œ}çaisp3€sǵ…ï^*©,åÜÎÚªu˜”5iûUä¦ûOl­YĂOúRÓÔRøÁ'Nu¢„ea ˜,ö)ÂÈ̃Đ踠æá„ƒŒOå÷A‘Ÿd¤pŸtz­Ù—Ï)§ƒ©ÖÍ@“2G­Fà6À₫ø"ÀŸ&dƒézE¡a2h=U Æ× ‡ú™†±zpÿp$ù4IơkâŒ'mÛóăÚ{ÚmßôTT9TI%wpa"Ë1NzŸ+Ö&0—’gi§oû.;fw®xAPµ³›¸ºwÉËV¶5¯ăñX×åz;o×r½,=ḿ;J©¤%/­5°käÛŒ[¾½~ Åí8˜t4>Víx3'øqát•đ¹=ê#tƵỦ'xw¤jỬ†]"Ä`¾¯văl°.˜ăè®Å¯}É´>E¯u4ƒ³íÏYl#Atà2Á¥„2»YsakW3†-¡Sˆ;(É́$Ô¬U®3[Û«íPâ7j›m¨̣’—esè̃v ´³æÖZj)dITµ¤)iŸâÍ ªm<>Ví ü h{₫‡‡UèKgYiŒâAÔÄÆ₫¡̉%æíó€TM•{ Œơ©Ñ'cA`ÈØ6â'ˆÁ#Ă=›·OUMºtÁº€t̃ÀƯ‹¯W‰ØL†è´cIđ!@„‹÷<ŒªU“?`îº̃ÉÖyøÁ§ê;oüÔ T§£àéÅè)Ayp­ˆ$Y[ơ ïZ篩+₫y¶î̀á̃L$©±lÍƯ»ñ_è»E†a¿ëz»À—ˆ2å¡Q3'À3ØŸ¡`G:›Ÿ œHëXO§,₫d`Z}ô'hüåŸ×7óđ×ÙdL=[‘óöXsÊ¿₫ơß}₫üù§Ÿ¾|}û Ql"DDè ¨)Çc¯ûÀûûÓà‚p\œ=Çd@‡À7₫2!zÈÁ'ơU;O;€ˆ̉'Üôọ́Ë—_₫êó¯~ưͯó‘—s9̉v₫³ @Y,7¬è¾<GΘ3× `­¹R6/á1+%X[º™øqèˬK1́äƠ‡ŒÓ/Vçn¡P†íº†ˆÂ LD ¯L{¦UÏÑœ¼…ÑÓ’oIO @Œç"¤,MYư;¡ˆ©TÁóq1´‡•ª‰ë5%y‡æQ¿>4#gºƒöCđfC0Jiˆ×y4^–µRÓvè±Ơ­R½¤ á·íoY2ó§O¯ÿÿüŸñúm{´ưË~Í×U×÷O--¶S±¯ư4ñ‘7‰¯_`â¥èp†?=sî'),$û¹{"u6‚ÂL¼1 wmè&u”g̃£›ªzÿ;·ƒw̃Ô-é’‘ÖqË| ³ª©¨T©™üØ^d9å̀’‹•8J0gp”‘‡ƠO°8çö`>Ȇ˜3X&~¼=Ô4°§hfü›°—é¢ÑĐ˜áX—öÆEóQ ĐF¬˜˜•GgÅFD­¶SNc£äÉèÆM ï XäI.©́²Ă-NA§œµƠE—CC¥-¥`=È0q\)( Z÷º/mÙ궦ơQóq=®åq[ñä \•½ èÙØ̉¹r̉t•+ƯÈi6Ư#¨juFPèÊ:3-Êh6Ñó¤[ßđ‚;¶È!VUÔ*ÑN¨jJ 6X¦„•Cy²Cè©”b‡Gí;N„£³öqikZ3€QâYŸ½1¼ÿ%ó¾üxwh¯>§ s4ó¬ˆb‰P÷ô‘Œ-¿ÓZđ}À“á4’wHèF7-z´C›âI€ÎGp̉äÍ€&ï,¥–ªT²0˜…gè`"ḶZŃ؇* ·ú>¦ w™‰&©©É8²^©Op{ ic“ µ˜°P#çÆĐ“‰ĐˆƯ¥çN >tH‡yêT¢øÄÈÈz ˜¤—XÖáKơFÚ'í1´‰ËĐ=ù!l₫‡•ªï :d9HSàmó\–cïUƒú¤ócÖçíÜæ¡0đ~É™•ơ§ă§û~wÓ"Èà¬Û-÷Ío₫:¶ø°F‘hœÍÀø‡GM „{?'vEA€»;ûà÷ö¦?ú諬˺ç–` ơ\Œ¿íÊÇ ½Æ[̣8uL|@'ÅS3+ùơÓë7ß~s¶“„´ơñ1 1t­u¿ïPíœç9Ă=ˆdp§D ׬€Ä̉Åó*J}I‹~9¾_Ùu‡ư¹—)-²8×¢ j×¼~Z?-©¥Kº¼,/ -@›P$ èVk8 Đ˜#¹?nWƒ|(£D˜íƒÜî-· M™‰/H„1÷#Jüøc5¬‡bçëc­â•S·¿t¾»´€°ƒ7n₫èéȹ¤ưé».û¨ÊÏc´SLu₫:åÂT2Á]¼X@₫G;vÛO:7äÍ’´|ĂĐE! d}Å;— « çSđ¶Ç”6́{ … ±½í[Ưîçư°ă¸•ë½̃‡Năù—°\Êå×ß₫]ụ́û×ßƯ¿®²–Z~úÓO /0¦Èä¶?ÜiÑKÜăUºpPÿ?^¨h×uˆaÚdº<“®Ÿ‹Ö=æ¸>è „ 3‚Áö)© 1z)ËRĐqßz~Êư£ºo,¾¬h‘”9ĂϽe¥. ¶PÆ4†Üzâ±?̀L›ú5‡i.ËÜ ¾’)ûnÈäY¡zjø+8„=_,ο¤x¢A†ćÔ Ä›ú¹,xNÙØN=ÍÁ_“,·Û™¿~ùꢑ®ÿ«ÅúrU§VW©~¸Ø°₫öÂÀ†¢jŸØ:53_n2úúö•´ÏñºŸÄ8ÂĂ't~w]=Ù6t¤ y…Å™˜ ¬:Æ3±*–p„5jœ†»Ÿª©Ÿ­˜«ƒ X3ẹ̀§œE»â¨.îmÏ-ơĂ™èÏ ;)Oû&H¡—|¹Ÿ÷ÛqCî­Ü~µÏßHœ$I!gx ÉKyYdA9†Á.L XG1· óM4*{Ư·¶mÇæ1đǾŸ;0`ç2LÅE¬Rg̃Ô^d߃¢æÓc!đĐœ0Ù |µö@µƠÖª‡ôà| Cg⻄³AXUƠˆ1¿ ß¹đ˜ä(èÑ®´ÔĐB¸Ú5¸7  <”m‘…2¥–j«IÓY`.k^nµQ²ĐT­Ps«¢nq1*¥)̣Ùa©U;̣k§ÁÅÜàéÅ ,±™é0ÁñEŒ Æûf #(æ-À9ÿV$³n./“ù¤$"eǼà½wf`dù‹m=/Ơé|Ö'œÜ©̣=̃ÑwBv&!Æ@:PÂ9'¢Ăè7¢;²I0pd{zrđb°UúÆœzüQÚ öPûö»où«_æœÿú/½¿ß[kqwcÄ0{†Ă±}“à̀#̣ ̀qNS|ñÏiư3·'¶6‚ ẩºp1có›9Æ?†n8rxÚpÍÅ‹¨ê(LjI㸵CœùmeXÆ}ó\áƒ÷áC|×ùåư gz¼¹0ăs¯kW÷âóp´ ́Ÿ̀ƒè¢ƯË?F7‰ÓKyy-¯/ù¥¤~ÿơ‡­n¨û#5F\~<€d°êÇẸ́ăËă-¿ÛY¸”¥„D›ˆÜMÙZĐ(ÁđƠ(&öT́ơqñ'¨‡á́v[nk^ăÖU")%°APôÏp‹…˜&XtSHY ÜŸ s£½ôî¹ß)8ê`Í:PƠ8•£¼†UyXøN₫´GfvdkxÖw*a‡êŒ©NëÄ;ªæ\X t»î‡¹Ç¿Ä)%IÎGOÅQjYĐoø4ƒ~Ø×¶R¦UÖ•×\»—¹½/¼Ơ@Øăn-­.KŸÅà¯üĂÔ8äÚƒLÙ½Qz¨àĂz÷Î3Ëår–ÇưBó ừƠ¿órÆk‰­/î{Ưó8Î#€Ö“wăçÆC̃£c rn°0z6pÜÑœơÄÑE= ÜĐQóƠÑêѰỊ̈” NÉ’‹>{ÅûLXs¯:΋™‹¥¤§d”$aÇpăöy¯è)`ƒïô7…ƒ\WwøÙoŸ‚rø 3£J›]%EÔ+r` ™ÙÈ2gI•¬tÔJ́Eg:K*{ƯK-EỄö÷Ôª‚±üM«Ơƒ­nh̃Ï÷k¾̃—ûẸ̣̈R^öu¿•Ûm¹Í0 n‚!·SßÓ‹{àÎ â§HиNR°‘ơ^÷G}lçv?îÛ¹=Çqû±;M1‘Q$4Ç6("Rû8±¤oѽŒ`>¦“1…Dư@=kHœƒÑ§Ï8ƒÄË•I-è‰`Aè´Ö¬sÀc* Í·ˆ`9P^™,†ˆÙø¤; _ùº´ûäq5;Ó)µ”4eÍhđ4z3 ̃ xæ¦úŒúß0 ÂZĐ®ÿ‘AÓºÿCÎ́ 3h:ˆû w.ΘœÁöœ°đj•‰O>!uIjŸ–óPi~dÏê‘l`©B6àeúD¢Ón†9«°¨ÏˆpkƠÆ~‚!¡×3¢™rˆ‡¹[xA[<´ÓYö„Îw–»v %ÿé럵£ÑI0óß]ư‹_ựº^~ûûßÚO@₫|\ÍÚSql$I`!².k”û¸¬C¢aNô§Ń«°±¸Û¨?{µ)m§#ÇÄ6Ï”ú€"|@â*ÿoxÅÓdăÓ9G³ö€Ăµ3†¿=™2Æv ñ™́Ôó_ÿí_óỴ̈YÏ MÇ¥~bù›†xwÀÿñÅœï«ÓÈlª}Y>åOÈ%Ás¯÷z:‚™o£o„Ñø&OŒt/¼¸ï’–̃¿¼c;€ö×ÖV‘₫vÖ³‘70>ĐŒæ*P75íÚ’—[¾]ÊåeyAÆvg§ơÓhsG9¼{Ÿ!ÿy/à|[‘(ñÔ…æqĐ¢D÷ƯM›)?>””µµ&:"<üƒÜÏóÀØqÈí=vxH?ëñj½Íbó çh̉yă¥Đe‘Y3đ—0êlƯ³XŹÔ6% Ä×8DAu0óD­%W©₫ü[Ê–ƒÚ18NüÂoƒ¿‹·íÛ¿ÿơß±jˆH›bÁT Ô1ûoŸ#N8BÓº&x~;8̣•5v¨Ø`)[¹gx‘Å΀~̃÷:̣Èd2"¡đ]AË3_”0°í€#i&RÎ5—VJ-»́G;vÙk«`àxƯŒ$5Óf q]˜̃—ûư¼¿,/¯çëKqc₫Z*`£@R‹35~;8cÁ~H©tê ›*Ñ3¡#âÙđ÷ă¾Ûvlh¶A7a&"KV'%ä—7mRÙC …ΈsE.™YÖlÙ7<Ă5|ƒÜ=Km‚¨»¸¨µ^´ÁH°WxIđªÀ̀Ñ$¤Ö à³ÏÀU5I:åÄ('¸cyœbåbOó ¶qN9åΧg==¼¶Uw-k> È'â‘¿Çđ̣Ünñ— I`₫R ÎÍà€¸~/yë•9£Ï)¹ ¿URp„^¾y¹Ưn÷Çư§/?íç®ƯÑ$à­ 8¿ —¯îÆ RQñ‚§{‰†`́èđđMg jW¦lߨ÷ºd ³oT¨Ăˆ>>3è\’€p2âÿ*uWƒ)²`ffÎ' Ư¿Ê_ö/F6ñ̀¼íûưÈÎêJßy¦ÿ4êTœÜøŒ+f§·t4 ûæïÈ(PÉ ù„[Ü\û¡ÈO²­™0ÄR“k=Ÿzƒ₫^a1úºÏüăœx†ùQ>óêJzXL/¡üo†U܇LíËû—MMÛ¨_ûÀË€©̣©Î́‚=”™WY#×áUf/ăÚ~Ú b‰’2•‚Sˆy¢»èđ̀‡œ¥s;-ÙÛ’ØÍ½âHƒo¥-₫†²'+ƯÊÍÙ>ùô®Øü˜Êô}'€̃±9_đ4†È$̉u]l7¸ê…K%Ỏ‰³Ê(5°uƯ(¬B":‚¨#Ñ¢ïqs&̣¥{q)k̀£0yww= SV˜ đÏ>Ÿa·B’l™ dè½u?r/D¤“"&NÖ®C öºïmûyß̃ïÇ:è6Sàư©n`*LKösGQ̉Z?ulÓC©BO[AlH9gï‘–(á ÊÏw+µ@¦Ç }̃Rœ™ªC=N¼”Fă èá|×üO2ậ=y¢Å‰ơôÚ†)ïÇ₫ưß3K­^w÷dt€ídø)G(y!R¸$KÍ÷À"AÔ±NÈq¤I»8ßăÔ$}ñ„ ˆ@Feê%ă?ŸCw*ר₫§3̃Y¬1ëÙˉ]>4<è×ó³ƒMœ)Sºq” £Z®ÑÀ$ơ$PŸñ¶\jÉ-rÀư2-ạ̈¢‚qkÛ£>ùq?ïÛ¹=–‡§z×ë5_¡×2±œ3J™LYM‹”&-¼ƒGeÙ†>~0gú@—b̀ù’h­—Ęíܶc{Ç₫€B@'Đ|¸Ç…Eă›eg;§œsÖ j[¨u0‚‚̃­dfE‹+@©©#€lߨ)|cƠ*Ơ(H¨ a]uJŒêÊ“yđ4Pˆ‚è¶¥†i0ÈN4?u“ à.|&"VN-IÉ2 [Ë-Ï€[–ɨ₫Çùf‹ÙˆXÏö±CA·”åÛÏß–R¾~ùzÜƯûm}SZ—ơï₫₫ïưx{<€Z>]>}÷Ưwïïïç~’DDƒr£₫H˜úªöƯ•5nY Uªh¯`YBR=är~ ?Yøé‡;ÔFfÉ„†ïȇÁEÿ"¸Qy>Ơëä¦O^óSŒúLp˜”§æ¹?úø¾y×ư©¦7#£ü‘„.—ËÛư-Æ ƒÓÚ=́-´kª­3Ya$£Óè]ñˆ‰ØpåO“K)û¦o4 Üíeö´³ZEl`?Gpù y±Ó6L ÙE ùK-깸/<¢‘PúŸêæ{ÛïÇă±Ÿû̃ö³xbÁFÅÁVàÊ´®²^ä²̣JáâĂü4BIœüFm̉‹áH*t@+,V&«Í= å Oø₫øơT±ớm¼zVJTJÉ9?‘ʲ䥔n.̃Ḉ>Œê¶Ă.ØϱöL›I¬<êăç/@C©Ú¬9ü?u¼>¸€°P´µ6ÓÓCÛ0‚n€G‚k–HÁ±U,¾@[R<9˜?¦°6î.j^™L%₫Ø'™ơ¨êbăB`Rkưñ§ÇBîƠóY÷­’n© ;U 3lH×m<Lưađ̉½9o3^6M‚̃d©Ï ÙƯrG' 2ƒ÷s¹†£$ ^w®œ: ê‚à¨₫q¡ƠĂ+rʵÓܹÁ£ö!I×Sx˜Bă‘8½vK™n3¨07NœRKI’“ă[.­ŕm÷§wÊF9ª!Å¥G>gÙ¶s{Y^r帕ÛVRÊ)‹IɱÖÙ̉₫}ÚÙ¬Ebñ̀ ˆT̃q¦ÆX\ÓíÜûă±?Çc;¶Ç₫ÀÔÈgG$DÆæ̀2À=ªZÉHˆHV¯ö;´鉪”-¹à’rÇ᪶ڶê¡#³q•Xæp]ÓN<ß¡†⨠̀¸/+V—:´$IªTlS ¿)y·j]3s„-±¨RƠ[€\3́›FÅßjĐj­Ơjåyvn,®ôñQǺ»¾^/—Ëûă}ûº9ÍÔ –"øµä’—üÿøÛ}ûư¿ư₫íưMUqë³äËrçøàÇËĐdÍsÁ=Û̃Ij7j«T£.uˆP$li0®ÿ ±€s„̉à5á´ B°SĂvB₫:©ç‡1#û(KƠ×iÏ#lJ¡awÙ¥hrp™¹—ÔM&±đóL°£nƒóưßÿÓ÷p¸0¾³ ?‹K€ÏèøûŸ0₫ÄÉIÆ= -Êư1}ÙÉ—±F`;u’Sÿ́MO·Ă›÷è1"°ÑS*ؼ>Đ™ÆY`?3)a0ư¡îÂÏcä>‹; ÿ16OÎû†ùt^Ç“<₫́vøèt[uÑ7Ë7ß.ß~³~ó_A‡W h$Îçf€0 ‡5̣ 1‹4ânÀTŸ̉¶^uiă b5ÿq#'Àü—|ù|ù\¤Ü–Û¥\@ơYó rK̀y@§° sºè‘Æø cwá…êh@Δœ¡dÇ„đMÉ ̣>Ơ­6zÀL­µVơ¬§·ÖJ8V}×@éß³ÊùÙ×9LĐ|8Û¿đmWí'ªÿSO;Øö|(4Cé›$Á bngÔÏg kđÿX€0WđÀ$|ÿH:R§ü>ÎJÿíÜÀiñÚœ÷=Ú ¥ÿÖ…—UÖLy‘Å3;êïʪnµµxôQ`I÷ơ¹đÄuÔv ĘƯîGƠ?YjŒIƯÄë f,aĐÔyÿL?#ñ5´ïÍ3YA÷G-‚‹æ¾«Ï¤ÿy_'¡tBñÀGth˜¶»[ˆEßjzË@=æLûÈEto"<œÜ¸¶I’{ẉØLsîû\(;”3B:;ü€K´ÊđưÔ6äX3Ơ>€˜F /Ă96̃Ù5kÅ ®²Ă\eø4 ïF%.ÄeñÑ=ÍĐ{y­z R̀÷pưÇ k•ÿÖ+_k̃Mơ°aÀ½Ö9̃ŒØ Æ2Ơ¸áfáøÊ”1bcjäKÛ̀eîñœ›ç£Áöm@leÔ½ç‡ƯF¬̉́™x¨Ç2Æ«̣Ă >­ÚĐëb»€Vx[¶×åơ8—奶 mÀu½2±65²,YY‹”f­&w)$“VáNăÖéÓ3–sµ…‹uÊâQưº?oîÛưq<¶}ƒPØf½ [’„…‰p´¸ÊJJ»î"Å2ë°Ÿ*NȆ3³lfæ@ºû₫ÑÔZ›5n}ưNvø₫ÖØ2¥¯¸'J€÷½å†>-8>̀OÙ’ªT!w6Fz,Z0ƒPưăơsch‚ssepi%b’`™¦€§f€«ë µUª‘æÛµÖ̃̃ß ¬Đ-D;$”jJ’]–Kùơø•6{{¼ưë¿ư+%N?}ù %Y; ‹ƯȘܦsFƒ4úP‹Í[1Öo´Óá¦%M† Ók‹hÛÜĂC—˜Z€B:rßf{ü­Ù² yc,0Ù3•eˆ!ÖËúË_ü̉ؾÿ₫û÷÷÷̣ưĂ€j¦‰Ä€ »ƒµWÆƯ†º/¸Ÿ^"£t˜¢…q¿E$—̀ÄG=Üư£7£(܃ácS\41Vqض.iù”?½”——ü‚Đ̀¾Ö¯¨†á<Àk˳ïQñÇ{$- ¼Ÿ[JQw7†ëÜ™ÊRFb" ́?*’Ê5]áwÉ—ërEp]®Ị̂ḉ²Á24ï.ṭ¢ELäk² œ8å ,9̃̀9[æ;t†™đеë¾×Tmu¹,—Û%éë—¯Ö“ ăûøT„$2}hË#ˆđqÁ. ă£ô—áQJƒh`a]™ïÍ¢&½ 8êwjđÉ›Œu4ëê@vBĨbp؈à¨G­îƯ„Ư·,RÙ]Â!Ë" ’}ư p(û R¬½ØƯ¢!ªÿN&Ơÿ$Ή)³éÓj#бàmY_ß̃ŸªÿÉdÓÂxGUI9±$!£zÔ¨uâ@}ƠĂơȈ((à‘ ₫Z`GX˜Îd̀%/½Û8b’¤d)c ǛPú$KÀ˜kÄæÔ9µ> ¶KäA­ÑUFµE´g¨₫c₫†FÅ÷›09›QŒÇóK­4ŸÑ¸Å0Œ‡*ÆEM¼»,¹´r´#K)(0§ĐàURUx me'çµ¼ơ¸•Û™ÏK¾\.—%/f†83Œ—•4§Ü¤+Uêiç`›ô~À kCI‚hXs+:¿̃¿&NÚt€°äúÄØ‹xS)“×T³€˜…&¤Ö ¨¤ƯʯÑ$Irv _ʈ{¿ƒS}‚á±<œbí´Cˆ†¹“yLƯfЦf ́Úz^˜êÓđ-X9ÖC©cCöI&9“SXFU›çyw‹ƯÊ¡ÊÎgw•$-²`̣öÁÉÄ(>xöBî‰`Á¢øçO! AOï¶ó³ă¬µ‰ù`fF¼”ËËÅǾGÛÛînS‚óÄÚ¤§XÇ̉x°¢×Ÿm¶œ ƠQ@çüņ³Ă5&ÖSzZidCàIx]Ôk}>n“i=¾ ¢E–—ü²ÊzË7Ï:‘ÅÔ"Ư½QsߦÄNäơeÎV¼ư@‰L™Œq„ă†¢hyêM#µ^äơóëöØîÛƯ‰Îfj*"%´ÅđƠgÍëµ\ñ²—¼¸ ³kyD¡çê₫]w´5mT .oà̉ƯqL½‚=âQ`ÿnTŸ“Û˜xơß±˜u„A*æ6n₫¤˜nå–̃Óµ\¡³Đn‚é»™¦&ídoÀÈÇ–ÈÊ8ÅGL›ö¬:&÷ £́IÆår,ÇQûzßmÛ·íܶ}CPR’~{G„>ÓµƯD Ư³Cuh6₫ØY—•~lb¢DÂbÉĐư¦œRN©¤V›4I)I“Ô’TÏÅs‰Wh:I‰₫'ă|‘ù̃ÑZ‚a`lÍ«ˆ¤)µ¤ªˆ>µS)4s|ö>Z(‘§$Mª § Újn`P­µh€vGQ­’&*˜ă8"₫élØêVí}¿ÿó¿₫3 ÿ₫ßÿíë₫Ö=©¦ôE¶óØ&cƒbB$2§¤›3]{5ål̃ndb] Eă%̃by¨ L9Ÿf÷`ø™3w%G¤³d;|LÁ%aN”†²QG'0ƒ¡u+ƹ†Çæ…‡ 6™ÑÇÚ°Ï!ê¹Z¨Qđ‚â¥Øï|âÑED^g°cŸhŒ´)ÇA²́Áh;È9™…₫(úu*ưẰq:¢æ›í†.k#Oе­‡jzÔĂ{ư ̣Y¹E¸#?̃öÈæè«£DÔ¿Ó8œ‚å£ƯQ>i2²£ÇỳÅưÇt»A¿.*\Ö´¾ä——ürË·5­ÁÙˆâ¾ƯA"¤P€E$ •Ă»†»1ơY9 =} W§p^´‰Óíåfd÷ă;H¾¤‚è®ër½‹¹-7÷¾®ƒïáÓ¼"†EçèΉxôÜ+Tø%-(CÁùÁ ₫ơ¸k\U·hˆ.(yQ´Á¥ ¿É)QsàNV!gÇu3Î̃TÅ–Ư™â’“bçüđÓË÷JsÛ ÜM÷ô`vk¦n4ÿs颺Uq@væ¹—X‰j Èß§ºŸvnͯĂV·½ípÖÛÛ^«öx$€ .÷*Ÿ È? -˜ ÿ*ΪŸW(ø̃r‡µÀ”Ë6oî¶^Mc‡ô'&&,×ëUMÏótÚŒL~¸ÂËÑ¡!x}y½®W­`¦ÑÀ ¥́́#7׫^÷{ƪv£N"à‰íó„‹÷œ„¹sók˜äÓçOë²Ö£¾¿½·m°ª¹íøq‰ú(=£>ꆘ«àñpfˆNƠoX[ä\óØđă¥Æ3LF)§—×#ûÓ_₫4ÿùHîMˆa ` ư5Äó„å~Đ~đ„€K¡’̉È~è¯V„u„ûŒnS†+@\1øĂ rê$ê'Ă»‡Nwơư–&Ơ˜8uz÷A ^â^`ñt’WÄ8(˜´Ú#n0ÍIÚ‰₫’E•y¯Í¡ân ,Óâ{lŒ¾³ei’%-G=J*‡ÀM0Ụ́ój>qÏ1 0=| xÏû̃öf ª€ÂeÍëRú` ¨b÷D ̣̀Ä ëHT@Ú8WŸà8clIX¥²¦µ.ơR.û¹ï—m€k™Î=€Åˆ|ÆS䥽 ë·i«\ưô‘ä*a‘Úª®[u£wû\•\RKµVỉJ“SZkR%Ơ$M¸1+S£jƠ;øn²‰Ç5¤1pÊ»:1Fd1øÂfÖ¸U­™si¥¥Vr±f\Ø…\ôKüsŒÅU†Ó?µ€a¤ xG®9|2Đáºá®óu‡3>Ú<ưRÓíØ₫ëÿùÿ2³Ÿ~úé~̃½Đg) Å¡7ûçøEcO’|̃îoøÓTơëûWÔú…&›Ê}g€"ƒDNS¹?}ºß—J?ĂÈqL·7$u¯đI<Ö£‡ëŸg^vSÛ™ÆÄ¯åơÛơÛo–o¾Y¾ñGÁÚ½̃#Á•CƯJ›àÓ\¢W*x¹ÁÑô-ó§0¸[óS/,.5u₫¢{Qg6A£ƒG¿¤̣º¾^Êvk^A¡ ΗèAøîh!ĂE§sè‡ç=LZdñy/…Ká’)C¡Bo m+%íáơ.~ºº}¤›µÛq<¬…Âe^qvRh§LIẦœz2qbJú»ƠÏ4Ë̀­~¨³×+nø“¦,Ăn é{w/ưLö£QÆÚMÅềơ?ɽ¡vƯ#eëtkÛă|„ù,œ˜º Ç4vár‘ nGp"c››‹~´ôƒv9ÉèçÏ—ø ¯·¤¢^Í<™0Ê‹k8=3—R₫éŸ₫é8¿üù/ïïï4)Å£È)ḉNŸA₫¹^®ÿđÿp]oùăŸÏưŒy+H®!Ưù`'Êù?]ö:ïTs0 ú¨w…ƒù3Óº®ÿđÿđÍ7ß₫øư¿ư×½ßï4Ưg›ÄNó‹»Bÿ˜ĂP½0ƠîG²QÜW4;M¢SP€Å~hƆl¦¤Çqlû&IÆîmOÊ\˜„¥IƒÁ®°¸'‰ú˜~Xñ€ư§ƒÄ#ûÆÏBóWÉïL…r₫q¾;‘JO' ÉÚ|n™,. ¦ßưÍ»hÏù¾19 ö‘Óư¹#/&8)Pü®ˆ Âw|ƈ¨ jGT¡ÜÀÀ{æ >Í.̀sƒ„n{²˜u8p@Y2àÏ¢±bEÊ™Nä]xZÁ̃.>ÎôÁØ̃÷eGüK~y)/—ti¥©ê’_æiµ`«W®Ơ¼}¶3IBZ™7ư˜đ³X ?+üpv–ó¬ç¾îÛºíG8Î}?\î5Œuv“ψ‚Ldf§ÈáÎ’›´*5Iúéí§íØ` êÂÉgÏ1sNYTZmR¤Ö*§äSMr \2Q)FlQŒ¾Qzâø[tIơ`ÆÙ¦Îf 1·³î÷ªæ”)SN9YJ¹CÔ ev‡å¡K4„i€̉J|HA9~ héŸÚNvN/ù¿ùË̀ÎóüƯï~‡Ó/¦’—sηŸD7Ÿ.₫ˆA´¦®ÙcA‘ …gâä$œ½k÷Wt:Í4¡ÂëÇ (sS†›Ôờx4'Ÿ̉§²ay<Öl¼¼9X`R UCÔ)ư ÔĂ$ÿôuôóN5EÀ̀ùW/¿‚ØG8Æ̉“¹˜ØƠî$—åRr1µc;@ºÂª{½½~óí7)åăøƯ¾ï³ĂĂ`3“ n´{´Áˆf4.S₫b̀7ç#dÔú6!ưƯÿC=¯ûăøë›Xº‚˜@>½/ °ßYƯˆ Œ¿‰&Êư1È}0¢èÇ0Ugfv˜̣f J¯Åơhø–´|^>ß̣íµ¼.² wÜÛàPT-̃Ư‰Wü°uƒy: ˜zK$¯ơº?´ÚƒI"s’…‘ÖÔzµ³ưáH’ —ơº^×ëír»ä ºák¹‚'çtOƠÓ6P Â´Ó ĂºÑ(ƒ ơGÜ•34¤¬y]e]’—₫™²—é–đ.°°k«§n§J[·²n̉Ê‚ÅÑ -wøª—₫6å5†'m(RÅ“p_LL’X2*v0TµÖœđ£]å6—¤!hêKkzƠƠ´¡ô17:l3¢‘33÷ܰœŸM7LB6ơê«›Y¯kæ\ïÏ*‡H‹%Z—örágåu‘{_lj3óiAñØ›Â7ÉÈî/ oP†zA!â`ÁĂת—D±B©fh®×ë²,?–áq#ăÎi’<™´($ ^q>ag‹Ó1ôÇu›ËÉ{6x8O{WßëmbÑđ<ơH¦vÇ?₫¸–å₫₫~,6p„Ø|Ŭ¨ƒƒkù~\É8 ̃At/ ÖÄÉ̀¼~ Öéüƒf53¾x¿¿ïçNLçyz?£̃‹ ï‰K¨$Iª$ᜃ/§uQ^ªyÔ¾dkç7!ñÍ *Ưó±_×ñŸ?NÑyJB=ÀÓ,£g16&Ö#. Ÿl$ÛLS£¿ WƠ¡¨©gđïÖơࣄÔxË:ôë¾1ªÆéƒ…p·>ûEĂïÅz jƒh`'OåTS=ÚQRùÙà˜đ9Û£>±³{̃|zÜ̉ 'A{¦ừđ_È j¹t/éæïïĂë¾Óø×îê'F'a“…ÈGG*Ơ`eÊNDEÊ5]‹|à§î}!èx]Ñ7ʱÄB̉_F§×L£ơéØs@§ÀÜhí¢Æ§×<Ưêl¶œ³˜8 Ÿ—ër}¹¼xmĐÉé`Ø8ü£º‘¼›6v»6P÷/yÉ9»{7e¿ÈăƯ…—…—L@xtÉÈc´z"đøQ@ưÍC¬öº#’‹'h²Ôs*‘^ÔiJÁûr€„ûô{â[¨{Ạ̊uXºÇNyăd]ë£êắé‰ư@̉º6Nh|ṛ¾IƯ¿ÅÁÈÎ8w}E÷÷t“Ư ~Øt{ÔÇ^wÜ—l™’“°ƒ 0—₫ ưû¥¯K/8Ôÿ95 ÿy '<ê~ÿb&MNăizúf½“7¿5*̃ ÷bPŸgá¯Ñ×/_qM°ºG£"Ú¬?Ăøû²6ưúåkÛÛyÑzQW4 xF»ßß$ä‘ùUô.ÚÿPÇàÏ&₫că ÿo#bªgưë¿ÿơÜ÷ûûăñµGÀE1°P„a5!?PO”È(@á́‹ÀK„pû´;ØPX3M’jƠă<\–×ùÍCo`.ûe…«‘%ă’bô‡„×8N2hGjÙgÁªÇCÖ8l@XE‡3?Ÿ2åcÙQÁÍF¢ô„¬«ªK¨ÅÓÍPʃ8“‚ï„sÄ“:`ñÙ³ÆÇQ£Ưér*ƒx±32Füꑷظ¼ư˜ 6È`2¡̣ä¼-‡·Ä)%tƯè@9’³Ưªi¡Ñè´]ÀÆÍăṂq´ằç™O€8Miµ„E£œt‚¬uèѨ±r sí«_:È*¾‰a›‚B`ÍëYNÄuoç*Ư~Ø]ƒfEG°ˆ«Ud~Yåê²à°r’§ºV;Eß‹3v1n4œYN‘æ)ÅÜ8n¢e¾]ÅÜcà%gÉ-µH'zE‹KûíHílç)çƠ¦ lÜG ¾÷ºQz7îDm~ˆŸnt´£ƠvÖ³hq@s@BƯ7\_ûöơ¡ ÿÁ¯±(ŒP‚ ‹´§éq„ĐÅ$96ü8mƒ$CD™Ü¢ø© QP©(#A\¦DÔ¤A¤í€¥$IœtîmÏ)·³‰I”₫>p7Cnê@µM¼YL¶Å•ÍD4—ûÑ̀:ø 1J} S¾qÔ¿[˜;üĐ9‚Q ÙiµUxZÍ(ơÛ₫ÆoL‰̃Ï÷M·CíözǼ ¡OŸo°ö0ä±Y|0ñ´§d;ª4Êñ)·+6Ç™x0Ú)—¨®ˆâ0¤kHÄ×?uE…;LèĐ$̀Ă÷̃†×ÔzôæÏ§óóơÄë„ƠÔ-ß@ñ¿äË(ÇIưç8BêºK4´íx%µƠẠ̀ÇÀ׺ Dÿ¦ó $ :œÙQ· ăB^r‘K¹ $$øü$I¢BDÚà÷‡; Ø>.„ @àư’K.kYñ‘|IM¢è,Tœ O Fí…+PÛïơ~¯÷­z¥Œ£†85s§ü8#̀+x‡¸\±ug$Ơ¿¯RTüb, ÎM´é˜ù½ÏB<09|º‹_£ @Qâ å%y`4ʰ–¢nQb_ƯÁ€rBÔ¹S_Hr‘Yl¦‘¡E–¼O`íîr.Èc“xTÿ“¥ăđ$™óú‡œ{$°wY=4Đ¥º[ºÍ˜ÄÜ»Í÷ßODơ¬aß1:âpYu·Ÿ~ëÛѾüôå!S· Œ2w7:~wwç§If ôé çŸ~´<™Évü86¼ÖÚ?₫øÿ¥îßÚ$Y’ă@PỜÜ#2«NÓÜHó03»Ăÿÿ¾ó#f¿û0Äb .Ó§ûTeF„»ÛeDUL=ª à’̀®¯:«NVf„»¹™¨¨ˆè—Ï_̀5 û¹Q逕Ùù®DT{°QÊØGÇ›Ơ¡#<2t´dîÁ¾«(Ƹ3óx>m}Ă·Ó!ƒ3°Â^Ù: 4sÊ­5˜ ư‹»ó€ëƒ½ñˆ>Ơ-v5’™bE%uتóŒl:c©'–áÔáËçg}×T¤‘–:jMµåx¶¼\ÀcQT6Ùpú×\¡´DÖB]ê^÷—ürÍ×K¹´Ô`è2±´ ÉÑy„¥y~¥£]̀€IDATr$M‡(Ÿªz°ôÑ̀¨[©ØaLƒ±ä%-­´K»帮WKï=LÊ5/Ú!æx*›4@‚¬Ydö3EŒ1Vw|äÅØ‚J*T«¦äe@Kªz´{‚"@ú́º[‡¼Z'x›BͱIÓ aÍ`µƠ=í¹fksäy[—²”^J)6/諆q< €ư°6₫ZW‹?…3¸Z7£Đq÷ [¦PKFn÷ŸùAR˜·‰«:₫NÅî”ù$}t7­ĂèjÓ€ÿÂQ{‚#‹gV̉t´ă¾ß‘l₫\d³ @Üa‰dç,¾ỌQ'âCi¹)å”#T¦[`²Q­‘½B©CˇôÁzîF‚×}L.Ss—rô’}~ÿéư¯ük‰Ø„©ôưcºªqWdz’ç™Æ'j“·–¶àqbb́~K^u}6WéF»²¡P÷ø̣¸=Q>.aOđÔă~Ü₫ÙáaÿDÔ῾”—ï–ï>.?­ŸÈ¡Å “å’I¢—Ô˜ÈÑæ¨Z´·,ÖlÇ[ ₫í Ÿá7:d9§û M˜„º,f”s°æƠL0Z²5ØmÛ±×}kHmu;ê„₫0’Bnaâ¹TJ) ₫a¾”ËZÖk¹Îá².÷Ï’ÉúÛÙkë i6 ûoÇí^ïïÇ;`.xns2́éÖ'epÉĐ2ÜËnú1™¦ Û(óèÚg̀‚èÓ`†ëí l7ïḰ¼1Û¤»ÅœjP›fÁï³"5†é₫ĂĐ?¬Ïæ~îf½°Öa—£OÓ?@ü›̣ êÿ¼°Ù:·ÔsÖÖ<Ä2RXN[…ïÎñ©•œ3ĐΩèá:,»ƒO«±Åâ‘\:ƒ“·m3RÇ €|BŒF¼Œ1F=*Âsá— Øó̃¦K̃yè?ÑO»Gll £ñƒïÙö7?åL̀öN8â€Éă¨ß€nĐ*¥èóaÉw¬¬ĂØ]Mø~!u¼Èè^X9êA:ñư·ïă6NmR|ƨ:ÆZÔ^[jP!yPÜÓ»\̀af§^W(€c€³QŸŒ(ă–_â¾ 2—x½wM;ń˜®t.<‰Tâ°È/Ẹ̈̉SKDDj¯<éfûÂCÁ«TÈ–€E²f4p¢×SÀûK~G'́#ül̀‘dúiÉ%L] ¡‹‰æø•*ơѦ]†1´Ô£G9j®G>#‰Q0O­€¤³Jg?Ö*aùÎWQ(ʼn|÷9ÇéhJ)­yí©/y©¹^ÚGƠ±4ñccŒ!7óH«·Ñ,1ˆÍ°ö¨byÂ<‘ĐL2täœ%‹fµ&@ơ¨ñªuTŸølA›ä®«ÅÑ\–Ë%_€Ú-@‚j|Ơ FV sîƯCpÖÙi»\.å‚„’‹fĂI .&–G·á'úăQ«~ü¾´ G=j®$ñÉףĢkúϯê³ƠÉ¿1µ‹ ä,>ăoxZ ô(<¡c ”SÁ>,5[JkMƠæ T™œƒlØ™c|nc‹œMaªkoî“18RÉqô?§B€§,}™¾¨è SihŒ… ơù¹ưM°äS NÄOZˆ¥¿́kÄ?Ô±̃V¹[ABÑéFe°ƒ ¼æ¹âÂ6•¦̀™”˜s*sÓḍƒ 1½èƯsƒ‘—  gsÜø«¤̣º¼^óơuy½¤ öS; CJ̣¹&ơÔ‡;pđ¨zÔyø&3­EÎ0K|~©¿Y.8˜ƯvOơƒ?Y  ˜ÈBà ×¾môa‘>g¤Z­­½K¶½ˆ|?v 8‰_ÊË%_P\̉eMk&øaa†W•”ö­ƯnÇíVo·ăfêööÀ~§ï<ÛüÔG挹ûƯĂUw2¯kW₫ØJªª=Y#Đ iç4Ê Ú©g¼ 0ªGY;M3¥nÔ\û®îí3ܘ‚®¸ï(-]Êá e?[ßö±[ÔO{ $h£¡•Ôk§‚J Î+ç*¬Ù5?y)Ÿ¡gMNĐ¯ưG*:qèDGTLLĂï/¯/×ëµ¶úØû¾èL.¡¼Á“p ·Ñ4$uZ¶–+ÜèĂK"̣VOâfD#)øÖ¼8@~ê³íNè_Â7ôWN’‚¯0"Îá³́_ơÙr´Ï₫Ÿ* ̃ˆ!’ÄÔí>jP—ŒèFËN —bNÙ0÷°HM öÎÛ“F+îœóm’®æ<¦4Ă.U§# :.ñ”Ơ:B!¿Ø²“Aơ i>ÅĂ¾(+úñưŸ ±„ë,‘} £¾$DÚơô}Ơ\ ¾ˆGùtù½ÛXḉiVæ„¥!XĂŒ19́j`(äL’1âM} Á´²@_ÄñÏbíæ™Æá"[ü'Ük¼`SH̉FƒvÆ>ºº’-¼wÜ&mk¾ơ„ù8ÊQ{=̉Q{]Ó å´¥(æÄr›ƒ„F¯$çá©£4´Z­ƒ'È̀úy2¬6/2-KZj©µÖ½ïµZ0ë O“éæû"hßjƒáªë1Ùœáñ¬ºEïWUEhÑ"I¨:Ú¡ªÚ”ÆI2¤öº§=K¾·»Eá•u-«9Ssn©‰¸ÍN ‹ÎEĦŒ~´<Ưr,¤̃Ö²®ëj'u1~dÉ‹Éä¤K–”Ó~́·ư¶ûvlpÖƯ¶”B{Ưă8Ú±T+mºp;-h„̃Ù’K₫ >H„«ON°~‹Ÿ8bÜƯt¬aÁOËoôÓûDW6÷xĐđyA_””ốl#­¨™ø¤ÊÏŸc27́Î a[DhƒØ5À'¥"(z…Ç%5‹ưbL„‰’}\‚©ö{#ÁoÊ~üÑ¿ÀnG»‡‰]́p1ëp₫ á_|ο3 ̀ [WÆR{–haàùJ†E/ü“É%…P’ư§^_¨$÷å@Ö_SÜQ”'c´nTÊ!Ç̃öml[Ûö±cÖĐ?áTܬæ‘dqqRÖ²®ºñïƒBz’û{Ùc]8ơD†UÎ₫ R¥G$çüz}}ưđZk±Å’gº`áÙCÍO²GÀôl®DsÆv ¯µ „%ÛI3eÉS†Qªj8˜¡ùđ?Ÿzß³¦”?“±8ẹ́E¬Ÿ]ܦæă•ó"è&;̃ ₫̣úrå÷*Xäôù¬tHp&|Éc¸ræ¤9y~/âá$OĐ'I‘·»]Ñ‹/½´Ô|ÔZ{ï5›ùI:<<-g·b9•SĂ”÷1‹¾Pñ¬ü¢’‡ßÆ1ƒàâ›eI Áßûè‹ëï{VÏ^–¸y–^d¼5ôvæj¦¤"…"É¢‹ù­ÇÀµOhÂ4¬SO‹Fu‡2Ï\ ̃ô„brPɸG˜@rwj‘)SÄh­qH©Bb²Z[=̣qôă®5Ơµ­¶ẰL‰¡1́$#””$]_®iI÷ÇưóÛ繦ª0ìgo/ $(½ôÔ×¾åh½a& æ‘E{¥¡”0²ƒµ4¯pd@ø|Í«óâ°§v±<̀×”ÄEI»jWmfh±;>ú1ÔÓÖ¶¢e­+FųH)A›† ౑5¬]SG=êQRy”ÇÖ{¹¯e½×µ¬—å’®äRº¡RMs^/k]ê%_¶²Ơ‹E!¿^^1}«æÉXw¥VN–¤ưjó#Ïđ9ô«+ÿ/úˆè‡¾¨À>®î ô™Æ°¯¿OÜ ’OÏ€Icd¯ïºÜÙbÅ7¯©&äû–Íû¤̀ 4ÅƠ¦¸ḳÂ4{è\iPaÏ1*æ"—^=j˜`T‹MÛư¸î†û§ÂGLL̀¡î÷ËÓï|Ï¡Ió3–X§ÏuÚÇÏÖ^{iôŸø~ûz_̉œ(Äβ3/“°™ă~ {L`%ăƯX°‚nœ™¿¨fÊ)¹\óơ¥¼€Ơ¶™»àS¢ï0…aƯ&%—‰?K¯¼ AzLf-$Q·¬O¥ÀÖđ%´½ítåà’e’6bâBS²éƠúJPû‘?0CUkuT2ư£Ù”$ØLt˜ÖuY_—W »–ë$₫óƠX)P›|¸|hµmÛ¶­¶µÍ&×¶; ÿûñ~«7›cUïÑgŒÉ逧:Ṕ. ?(®ơ'îg€Ï¸à₫¤Băiå‘÷̉XJY|é‡nrC;•U44åyñ|>€̀´Ûô_üP<íóï–ßml{Û1ë•F©±\óÏ1f!k†sÎưæ•r –Ù_#?+È]¿Èđcăê’Y,ØXÊ¢ª½̉³©èÚă•HPYØ|¡ÉfŸ]A,rM*Ưµ'Ëj7Ư°½H¬D„âà Ạ̈*k„@-´Å3úï¶ë̉RÓh¸ß¹yz³p0‘Ï’Ù¹çPp}G³Bđo°¤éĂë‡Zë±mpëĂ"|bÇíà–ª©ª¦u:năW₫Ó§±°Pa…¤!3Ÿ¶ÆZ}€̉JMDCIè8ÛV '{Fè,Ô†ü(—|ză§ăF\ %1Ä£]OÓà́Ë'৉÷læ?Zñf‚BÉʃ¨Óùƒ" ·Ø ~p"ĂÓ]ñăà¨áÓ€‹¯ÉB`ñ¼̀çÈ×ư½ß& q§Æg–*R˜m@-5Ç|¸%H7L è̉¥JϽֲÈÖ´-KYŒûŒ₫7Că ‡“úN₫éơÓơĂơóÛçûû»7. ¬Ă}ôäó=m’” ÆJöÔË(¥«3¡Kñ±Ä€¤O¥âøÄŸÑ®’zêÚM2ä«àđ£‡!P'r3§¢7ÈtAƯæăV6µ6KkM»î²ïmÏ5/iYÊr-×¥,øœ^¸>fJ•E€xĐ̀I==ô±¦ º”Ëe¹P´–uY–9½§kº¦’Yºôºx² `³~Ä.Y[ p XPç(±ÖÚ’—­Ö¬!đ•&ä_üa™lăô¼ă-0’z›óÖeƠ₫ËË‹ªơØö­ơfipĂăuµá30S‰ŒX~6ÖÀíƯ§€2S†\Ï'9Û›|,L:ykËV7ªGh^¯¯e-£ÛO7À‚(̣1w¯ư£zr…çÀ±¯8&æïv‚›VBđ7>ñ€ä’¥”…­óôă'|2cÅîé>EV.z‰æû”±ÎS¼O5Ø|̃å‘5¯ʇ×åơăú‘£v³dX'!®À­ÍÙ"½ øé̉ÁúăF`4×|ïJ*pXâ]÷s>#{£<#˜éf?ÿ:qßKnÖɧîM KQæ3-”àœ•?>€™× cn_ăTP˜©‰Aèjz0 è6'aaü¶v¶ÑèßyY–%/£:ª±!ú|@MÏ`ëÙ÷ÛPÂV*1":~¼dÓ³©ëbÎ1Æ §óáØËN†Kºöº Jµ¦ ƠxMÁÏă5é±y”è”^ЧKU O¢Á˜?5ôÏ[¦>QhêUưÁ˜'¤ó¼bónAp"?¢ÓK'Wd”ẨÆ9C„<ú‰Â6@̉œ²SH0–KU“Ù‘‘eß5´ÎŒ̉ä‚!­H¡:Ü$Èâ “ ×^G}ô=lm4à~UëÖ>:¦®ZTb¶>;ù³»˜R5iª£Á—Q.ù‚½—rY:đF@‘¦1ơ{Đ{/£,}iyRâˆÚ䆫wT”]=5¦<Ñ‘%Ăÿë‚’dÅ j]à±{¨ª¦–’¤ÔÓÑ<̣¡‡4‰æ8F²æ\ó=Ưß!æÁDsL(F¢(ÅÆ`kMD=´j9¬]iîËâĂ=—uÍ+–ÅR–¤é’."‚üJ¸<ªG€Û^÷Û~Ûí¶ßÇă±?¬¨µ–éˆZ ü29VóÁ”ÿzvÍ1;°Ï d̉ÎçOÿäO×ËúóçŸÿ₫ïÿ̃Ôeâù§Đ裔²^×RÊív«µ{@ó3~ÈDA À^$‹Oææ”#'ΰ:†ñÊ{{¾©£iMÿæßü›Ÿ>~~ÿü׿ÿëG}ư˜©>ĂÇXʸ Ël7Ç^Û<>Ï¡`st‰ơ©Ù“î'ß?6 z¯éí ¬̉t)đư†€Ó²ÈbSœ0=Nˬç\đƒ D£9.\ËÁ3^E9Qk"~[Ïú^D6 JϽïøü HÊ.r´DG×́.ơú‘{ƯÅ›Ë×|Å{a úÁt#¹,yy]_±ƒ¼.¯`ư¯å Öÿ’.€›‹,Nç̣…Q¥̃öÛV··ăí­¾ƯÛZÿ÷ă‚B:̉æ’€ úŸùî‘BÑÅ£"[ÙhPLÚùç†lµID}.ªiåë‰zBN;ơǰèn"r’Á¶̉z€åÄ?>Ç$ŒW¾÷=]̉¯~ñ«ËëåÿüÿüŸu«Ë€D$OÂE{Î$,NDæYÆ¿Oøb<ÜÊ` ɶ]0`´1­ỜỶ¤×åúçJ.Û}ë­Óƒ ’²îvF–T@ßâ{b>”HζóA°L—âÛt¨bÚ¬^&øv¤#Ù¬Éî& ƒi½PØ¿"[†mOû,åơ€½2Í…ÏĐŸ lÔ¤pỡ×΢‰b5¼E¿/øơåóLä`É!®\ç®H€n[é Í•ÖäÎFl‡ +‚QcÄÇi»æ{Ÿ5°*KY#e¼ Đá ô¨ÄB9Mj¢µ¦ZµÖn¿ÛüÄ̃øV£=zĂ²nP¥ÏR|H<ææÉDˆé¯9y«Ø#ÑÂ6ưùđ÷ê,̀Û×$›Sfcưdg±`_£sÙ̀æèÇ8&1§©ßªÓ#)´¡üQÅkµY{M#™FEú́œø̣ƦŸhñ©è$ë€Çmy¦cÙc‚V§ö:êÖ7q2qn¿jÍ„(8̀=[×BmI·¹ØD“¦ú^ßoG=Ý%©é@¨‘‘AoîgW'Ö(% pE%ă}»²:)øCÖêÜ™2âW ơ|¹h©½–^tƯr´Ù3‚ ¸gn‡ªæœE™}Ù³‡jdÀ&‘­Û=ßÓwY.k^¡æ'Ơ8ƘÁ8ai5i2¤µ¶÷=Ơô8ë²¾ïÈå»”Ëu½^÷ëe¹\–‹!Ô\4)'Muélïàh₫®~ºđ±?Çă~Üïûư¾ßm´°÷făÅĐhỢN|6Ë₫Åʱ¶N(¹¼~|ưøƯÇ.ưï₫₫ḯ¡\̃ÿÏo₫GôGÿ÷ÿí{}}ư₫ÿÇú›ÿd³Ñ€âp±\rơ@l̀JÀăªQ̉Ă6c$%ă™-oímȨRk¯CGªé‘×ơZ÷zë·Gư ÙO>)¢ü)ó¡âå\L6=à)E¢åtj¹B%&Ơ€°¶#'GÆùê2ÛsÏeVæ¶±#_áÓ›-¶æù^đö™l=d°}sÉØ%¯åjÓ[Å:r€Å ”µƯ¡û¸ÖiáíiêE:»–tR“æëU₫æôíuȨZíí;*²³ÄQ]–> sônñơØë¾÷ư¨xn@4{́‹åĂ0wÙ²eû¼®¯×r5\Ë× ?kZYɈóñUj­ơưö₫¨·ưívÜ̃ëû­̃̃÷÷ÛnN_ÄŒúwO˱SÍ ₫a´P·ƒ3Ü›&”?öËó₫'5x¿`ÂÙaÛ¥¸G|RDgm€:1mià­uª‹Œ#n°¬‰aùâvæ!><ÀA÷+ơăËÇ?úÓ?zùø̣W÷Wcó8 ¥åÔ0Éç’0Œ¬ä‚ñœÔa BâÅÇAà"ó "å¯Á‰nGøWáªø{-© Q Lp₫DB#́bœ -ÆM¨Ö¹«øªN>l…#Øưà =ïuOåÙ³eêô“†gx‹+^æØf ĐíL“s…L¢w¿[KW\•d{Âđ=í[‡à©ßåF v4Is 2¾Î¬llJˆ\"Ú²¨@úª3ÁßƯÓ+™ ø=ùç&—˜é¯à¬å@¨²f$QöÑ[jă ½Óưå?ØïÔâP®v¤ÎÖ^ßøçºzº_§+ ó]ŸVÔ׷Ƀ(À›K ·ÎJ@Dđ¼‹Hëí,<~₫À«£Î$ Ÿ¾x€Zsc̀ihµWó6Î[ü'ÿ’ŸÑ,±T”¶yö9++ 4K‚ms—”¢íTÚYỗ[jE :S§$Êi¸àÛÑúÑUt•ßÚùÍ©gvDËBM#Œ½¢hÁÂmß9÷c|côIR¼¯Ù 9%¼æè<ä‘K/¥—̉a8M»îvy«Àu9)!5úC“r‹#$€ˆ@Ô‚‚û[̉²ƠÍ~èȉTWû́UÊà¶Sµî²/}¹·,AfÛ[¯æ.«M'(SÛ¼ÊÚs¯9 JóÇ₫¸×ûm»Aô8ú89Zđ`CÀƆ^k=¥°üHƒ¾~|"Imk5‰̃·´$ĈÏÜ̃ç¯₫öGJéåååW¿úƠ÷Ÿ>ưåüQœƒån¤Ap`’ơÖe·#V²¹ ÜMÇJ;RyëoÓE*]†üíOû¥}¹m··ú†wuÚøü÷…¿ư¼d³fqoqă‹Ÿ'Ÿ‹>Ÿáo}tê ¸4çn§s±&?ƒ)y¾pÑOo­Ï?J̉â?’ŒÛ½9·Ô„̣–VY® À¡óa‚)µŒ'àHUË Đ$è¯â*1gL´…*& ~p$s_:é£CÓß§¥4Hí>|ÊΪi^@W€Zë­[îođÔÖ^ ’%ÅI+ø¿C5ø²¼¼.¯¯ë+zˆ/Ù¸ø¡‘(>7P ơû1{½?¶‡ÉưËù¹ï÷ÇñØŒZÆhˆöwªÑ+6ǧ©¹̃Ѳ$ú·æ•»HQ¤ÍD&Ah(AúÿTB‹/k;L:ªpe ̣+£“r'†ï™|Tr €Gçe‡Î@’”R®/×—/©$ỎM““&Ÿ¤>{ÚĐ5Ñ­Lhá{1Ăî4L¿QñKb¥:ûøù]÷ûnŒ́ßTgUŒ‹lS“Fס­7‹Đ¥-f„h©ÙOĐÏ&@ l) §³Æ­Ïâ,¹E›́ƯNú¸ö 3€ăr*‚¾̃Ÿµ#ă´•Y°ă·FäÈBÄqÚ‘æ®H_Gœ{(^CzO€m!0æ¶?[”́ëLƠ@+ăƒæÏׄ2-àY6Ÿóyh‰à…×p’Ô´¡ hÚj¯̉‰3Ëç!rJ(W¸Ï?ƠuƯgƠŸØ+9Ÿ2óV ^v“æÖçw7O¥ó[¶*$À²L"«ur>ÀW×ăp±>.ƯÛâ3d&›’% ÿ¸®†ă¦ÚÔxШs)^a{j@½'́ưúzƠ¤÷Çưíí­7Ÿl5œ:‹2Ă5ï©Ó|ص/}Á₫Vz!k¦IG) K±7ÀÙ ªØÙ°¢°Öº»̣̃5¾Ï'U6aùeɘèbæÉ̃K. ¼£ECàà‰ë„÷‹¹Hi©•~UKѲ§=I’&»́0¾£ôµ…ß§"ŸÎ¹%Á½‰èđü‰ÖÛ®;Ô8̃d·x9?ÇOÙV­×Qu(æ#ÑäR. öøË¦¡Ơ )g›$cùúÅ£Gêq\­ô¿í·÷ưư}{ߟÚvDˆb¬Đ/ƯZ©2p/oî×bY"̣‡† ÿ‹>``­­₫øÓo·7 b71áx¶ư¡”̉~¿ÿƯïFïÛ¶€±»L…c†Ua³.u¢ó xI°ä¥hሢ‡ §r`EË—ö%ªâ†ÿđ—ÿ!åÔGß]Πú³J̣© ˆ ÿ´9.x̉›đ:)O 'â ñŸ½’”÷đoh- ̉G¢<½̣Ó›:{̣fÏ]¾q`ÇïÉïỤ́¯–¯Ëë’ü¼¤E—¤́$Îɤ¾÷<<ư*P₫æmR«đĐFˆX*ÚƯ°+¡ă†Èă₫‡Ù|£¦e®ÚØ“êŒ&:q–éÙ,G#Î…5‰¿.œéˆOP\–ˇơÇơƒi‹±₫HY®?3%Å@ 6åcH°ÁÀZú×ûû₫ª"†üđQçnk0Ô÷Ǩơ·– |bj+Kû¡$@Ç̀¸wƒ50¶2GH%4W—‘´2t ôs—uiµíû.´œÁzü uø}¸fZ‘„3†ˆ˜5V:Í÷í₫Ûßưv,SĂm ¸Ăéÿy~x)k3Î3q­ơ+5É9r…cÔ†‹₫9QA‚5EŸIÙÛûEH ÿf'Ư4Ă ‰=É@QíCjo¿ToSèÿq‹³Î7¥ÜçÖÑí9×o!@VĐ̣8ÂÇ”è„UÁ­kc®–ëư;Ø÷§5Ê~È@™ü&Í+Èôƒ¶4XçÿˆG‰đ¦èÈC™&)~Fö̀×Ç“XÎæ<ü X®›y8cv~́*¡ÈÎU÷Ô´iÓ¤©µ†@F^^k5Ä#†4GlœÈ, 7k –v‘u¦½ñYtó˜ˆÊ«ṣ̣éÎ>ÿă ”!*%•xnBéÇÿa¡bM •´TU‰1àvCn£% ¸3gÆ¢i¤®¾̃Ö[ÓÖSÏ-7mU-L#$k6§:.v¤"wí~ùG˺üüùç¶7h<ú裹pN4Kâ`©ºö̃{•zIƯ¥‘ƠB?í¡H¢>Đ?>Ij̉¸Ù±”üVzË7 Ñåh£ñÓª>ÏÁ†âơ™¡7³Ư†_™qRIđ&b)©Î‘"¥©Éœj®K3³\©¥¤’cO¶ºµÖ Î`»•Ạ̀HlăµWÆÓê9¬ Àé_S-½́ußÊvÉ—Ër¹.×¥,ÈúƒÈsÀxƒyyĂÚSöMZ}ÔZơP¨—‘2àeyyY^^Vó `”'$–)¢E’X:M±?ƯÚö¾½¿oÏoÛÛí¸÷Ă$PkÅk¨½Ö\₫—²0ê)¥\.U½Ưnÿ*5€ˆ´Ö~ûÛßb10GáŸßy¨µ₫ĂßÿưÛ—/ëº~ụ̀F‹¯?@0‰H•ªª‡ÆĐ¥“O ç ½.‡WÎdvö¼«¿Üú[[ïêCøĐÍZzÁ́ƒLè?Ná„Ô2Ø÷ä…jŸ(ë-cătBOœäæ=‚ƒ*ô>OƠöSFpk}̣¿ùîoƒ±íËĂ₫IÖ¼–ơ’/ú¬iÅ€$NJ“Mƒ¯É'\Ø€ôÜ¡£©¥ú0^ Î’|\8Ax$ü°ƯWLÍ}Ưl7fvJ`ÛT8‰.O¬3b£Û3f©‘uç9zI'_—ë/?ưrIKÛÛ¨ƒ€ ~ÖëKy1Ê¿XÈÏKyÁ@ß5­—|A!ÁÆ´•C°Bëïí₫¨8}M5xÜQ“p€‘7¾đL¨&!Lѳºà'4[â° ̉E"&ñ7á{20Ê3˜â1ñ\]B= @3®X“ƒS‰»êơzƯöí₫¸Ÿpc÷́Ôa <¤i¤1†Q¹bÙÿN{M¸3t<¶ÇßưĂßưôå§ûă>˜‰é>¡À9?(m,5-Qwh—ÎåÿÖ+À¬ NNˆæ èS½(Z̀f''6‚E ûûQj U{ŒA„U÷ƠW×̃RK=`\¶j|̃<¨ÁG2û/ƠÿܧÅ!m6¬QDÅs÷‰]ö¹“ÊĤŸSO–Fï=!;d[b®(¸ưªNk7^ơpÏ'i ®RD®©ä^ {€«˜:ª#ßpÓJ¬<Ơ$̣ßözÔ› ̃{¤ÁcÂx2½£¨áî^ªy—xĐÚË«ç5øSǃ7‚œ—ưĂä>onرâö¢Åx;Î.Ê™/ă?$%•¬¨`“+–µï2çµójÛỬ£±AÈC!ư…Åơ˜:7Æ€² ¯!Œ>@ïRø–®Jí>ö¶oÇöưwßÿéûO?ưöÇßÖZ‚zÉ$g~ÜơÑ1Wđ]UÇgæ [%€2`½"ÜÏRDS)©Ø(wMÖFHªƒ>,¶Ëö«ö«÷ưư~Üß·÷·ưím{ÛÛ̃{‡:¨µÆ‰¢K[j«­´Ökƒ̃ûŸưÉŸự׿,KùƯï~÷×ư×ÇC₫5>˜lûŸ÷qÇÛÛ[J©ÖÖ¼3[N:pä%„GK€é‚Ñ-`¯Tµ́}—a1´‚ö˜‰3¨$̉ÎmĐo–>z:iÏ@~Çs˘ÿ„ÿđ›ø)¢( ñgíáÛ®©&¾¥b'¥ÿ"¹ÓÙƯÉ¡\± $.i₫È´ñi©bnW|±Y³=…¸ŸÛ5æ\£Ió8™S)ø™²ơ`kSîÂp´©/,˜„M ½#|Đăt©ö¸Îs9ú1ùË̃Mâ¯%’ưß]¿ûó?₫ó%-_~ÿe»m¸–èï[ÀkyñÍđ¿¦b!ôL¹Ă£̀™µ·jßÛq³¸¡cƒÖ?êqĂdî_θ_\²/bn£â—)g8ÁÚQ&·é̀»‚z ®@ñ¡ $†ít9[ˆfÖ˜b=%›ŒèV'«¼3n#q»»E>Ó́¡‚@dZ\ź_öÏ·ÏG=" lK~¯PaB¾ù$₫±;^G\(R̀Y!Å*®‘øÅ4ûÆÉtXºtÚ±óđDÿS BĐƒE‚,ëE$ƒr=ơ,9u»×ˆu㕱«ô­ưê$AOCB¼Ñÿî®f*×găLuAT Û]̉`ï(ènjdƒèĂHuâ:ùàGRĂ^ÿÓ; ¼·aĐÓÙbÿ –û0ÛƒS̃æXđÄÓ!“C‡WȱƯnß8v ±9cö:†HT’v”$KrĂ@ß$©j…"¿ªV+ïûI¨9÷vü@t'‹pÜϯ)Ws˜>ÉƯoEÅ·)vû»qî¨ë鵡äKVăÏ)]EJü²yv÷Á´₫yÙÇÙ¹áÍáÚ«)=Tfå¦3pI†@еCyˆÈHÜôéÍu[0ÏwâSMĐ…ƒâ(—¬I·}ëGo¹i×5­ZÔ¤êÚk¯½ùø”î²%ơ­5yŒ¸vY¥½H)RàH7¬îÀ0lר-“OuèaÆ¥bSèøb˜½–ÇLáÀ–<²5}‡Å…wçXƒ©”(•F&kî©/}©¹Âu©—K½lu[uMk½Tg÷cs²xÍÅMM̉…£EM£nkÄ«Uj ̉°–ú©|ú₫×ßÿđé‡ßüø›Ç₫©l{²(‡£L#ú‡1ÆÖ¶t$Đ–Z.ˆú¸®Wfưá?1í>ù´Ó’Jï½åÖF«K­­~·~·×ư₫r¿í··ưí¶ß ́Úë̉–Úkιơ¶ïûvlư³…P]/××ëë².ûc/¥|cçùÏúø/́$ỗăø}Ÿ¨ÎÀ]K==·Đ2Ê¡$p“xdÈ΋•×_¡y¢[(2kpù OŸ~tä“¿ÿŹx₫R;UÇWư©,á _9<̉!̣+ñ_q¢äi ë@=Ư‰4ÿ”]¡:"«7¹̉ơR.¦óÆA?]°°ǹ0đđÇ@¦!@Eü,” ¦̣‡«C2å°₫K~:!‡@ ””ÖĐgŸ,Âyú†5i±nÂÓë ×MfK”oŸêé́y’èđƠ‰9'¡<ˆeCÜ)æ\UnÊĂ ’~₫Oó?ÎDÅX$đơ  {¾²₫‹2$Cÿ¡ <ßơ±©½ôD<¢d£À}$ê¢Ë öÑ”S‰4­!Ô><Ô×FJ•ñ &¯×BMETûàm2̃kï{×₫¨­mÄưG?đ_-¯`T&–”đ!a±™rÚ!>́“ ¬¶ÑÚ=J0úk^?,P}X>Œe¬y}]_̣c¿–+¼Ñ—|4ˆ³·T»­M9uoûÖ7à~$úß÷ûư¸#5l?vÚ|9ˆ †¾‘I……mèjt´G̀)Ơ§&*R•â#ä Áûˆ#…ù́ƒ{ ÜS]-ç(̀§lŒ1Ʊ·ÇmŒaèÿº…fƒ!èÎ#%€—HW¢_–&cH —f*®3 |„§(zÑt† Ï–T₫6HAÎêØ7Ă¼‹n(³Û ®MèßFà¥P¹ùNĐ”Rë l%zШӠ÷5sóHü‰¼ÜvæơñüfÀó~á₫ôa¹G¢ôfq Bc è“íù˦ZÎgp&×¼ŒÓvª‚SShÿí˜Hödp\öCÚ‚Du#G?(ëX^gn2†QX‹„¢†fˆ‹åNO ³Í›ƠÄ<ÅÊ€E–1FÑbjhH—¤ €GsI‚¦Ë£Ië­c¯0q‹¯dº„­ÈQWü‹ó°ƒWƠl-± ơÈÇÑ£[Ư¾ûá»G}üôóOe¤gnºa®‹ánVă)&`K0—‹Ó*7í2¤6êørụ̂Ó矮¯×Ûqụ̂øb:çrÁàR̀RÛbôb¯ƯWºz°>ú1¼)€Q¤|Y_¾»~w]®´€L¤xäœ2ä—÷̉^¾»|÷«—_ƠVß÷ßßÿûí÷ŸÏ₫₫úáơÿñïïw @+`»oû ©¤̣zy=uhÿsG ÿ÷ó1Ü7Œ)§?·Än€ª–ÙÏuwˆ³%Ço¦^)ü›9Á3U€ø#IfDµ”«™0¬¯ bü>³üư0PUH~-Ơ«M¡“¶×€µózÅ'D†WQæ6jÛó@~ˆHT˜™ƠØƠ>x§(pM¾{ùîợ UÓưç»\dË×.Ë奼p\ˆÙ$ÊJèoˆJf ´̃q´Ñ¶¾Ád|¯÷G5•?Â0dD”÷M¤ÂçL¡¸ VEÁß 9kGl’© ØKDÄn đ%F>Q-àÏ‚qüçIÏ<üle±6îóŸ3¿ï ëĐEÊ¿ŸưO\À”âh̉’ˇFN¶/”¹ªgtù§ÑûÎsè`–²eiaRzJ úûÿú—¦YÁæZŒ&fÎfG¦á˜̀ư0… drPă@$`6‰8£NœëIp»â,‚fû壂ñ¥¦3©5â6Ш”ÉY*nÛ­ïó€áä yBË<₫¹V#™2‚ƠÈÅ̃Qđ˜mL^Ÿ|AjÜ÷ă Ù8†±Ï8̣ĐˆÅíi·Ç M”I$M@Eü…ưœ/l:e‚ïÓÃđÉwÑƯz+6~Áj¼¯XXR§¾ºZorVæ2fU3mÜêf'îĂsj¯_ç4V¼ÙÓP¯!eˆÆ–†éÜ?!¾–—Ú i³ t øéđ¢ G'ß§‰́ñ-m3–»Î|©G¡oŒF"¦MM½S¨‡ñ2²æËz‘$µÖmÛöcO4´ơĐm±aA½3!4>J½ö£(¥Ä'«[ÏU¬„Ă×´©ÑB˜Të΄–|ºôe,MÚ2›4Bî`Xå-̃5övvm•&§H’!P dͨ0A‚]b£W|åÇ9åÙ©àd¤ó¨>qmáÜiFÿBưjÊ]{Ѳæµöº–ơ2.)¥~ẹ́*ăq+·ûqÔÇvl<Í»ÏR8ơTq7Ơ¹×>dT©¿ûü»ÿøWÿñó—Ï?}₫évÜ’¤¥-P-eA°ä%¥`́séÅE;́˜6³̣‡TÙußê–RZóºnëZÖŸï?£ đ²¾¼®¯P aLÁ’ÿ́e ¨e,kZ[n—|y-¯¿~ươÖ¶®?ôÔ·eûpư€.:”̀­5îĂ*ªÅF:̀1Ơ­2Çé¿mCà_ë܇«gŸ@ÎpŸ{ß̃£°|¹G<}.!?¡<±¾LËự\ù÷OƯ€øSN »®áÀPzû¾Y„Ë`Ø\å{µ'ÏóÉư­®̉BCè?ÜTÄÜ:©VƯ"Ơ'üÀƯ"}(ơ±û*®ÏñI^{·XϽíüKPăø{VçS¦<|º̃p­m̉É×rH(?—t™Ù>iư¸||]_eH?úØÆqM×åj“¡ùLÈH¥ŒÆÈQƠ ?4?x/ö@'v´Çn¹₫ 0²¡[»Ó$°̃ÄđÎ2¹|¥!JÙä₫‚Jé¾U’9?NiÚ“Ù›úÀô¼đ¦JY×qêø¹ 0yCú}í÷çïyóóóá‰ug`Dîo!« 0±ÿK' ¯ªOüUKâ×™2ƘS/¸MéÉw4U¿ga>h}: Xí,6Ó́Il{í9Ts´¶Ç„ṣ¡ÿ1½%_oßd^ºô¼äï¿û₫ăëÇÇûc»oÈPwOæ¬3‰ûïÓ߀Ư#àëü¬ä=+1–ư&*ᯧ¶íSÏ6>,Ü PX«’˜Ă›ƯÛi(ÓĐk@U2¡¿ °ZĐG¢E1¯ÙUÖÍϼ)x: ₫Í}ÿ™„jÜf‘ç' ºÛâP]×j¼u`Öæ+–4-¡öˆû^öĐ¡Mkª xˆ<6[°µÔLf†XXqb›9B*¥”ï?}¯IăxÓ·̃:æy×Q) Ê=·Ñ x™Ç:Nád@Đ,ûIùú§Fmư8́¡OjÿMlFD`á™[L*)¶e,CGî™$μ¾ÚÏ…GáXº˜á>ÙîSæ"«ư¹óÓTUX7ø2Ñ(₫~)ûñ>ùºêĂø¢—u¬”úYê?Rä‹9°ÑŸ´ƠG7Ërß·ºA„`ŸûqÇÀpübc̃£°<Ĺä A¼4Å̃¬_G=Æa³l<¥¡fhOĂSá+áttñe¬(́ûƠɧ‡ÊW!ÚǗøîwß…eÅÈpjé¤I³Z‚Áí‘×uÅñ¦ÑB”-O2˜rx­â ƒEHü/i1̣À](³ ĐÄEY&ĂNs,eñªÛâ­’qèOÔ#‰Ôƒ…¦…a 1>ûS˜ûÄIà-ê3ư¹†3àu;JQAâ5RPظ!ú§dĐŸè’p½U™³üâj‰7åë}lȸ\.ü'üë_₫êÇßüö7÷›ºW¼X&á̀/‚øư£d™ïƯT Û·&¸ù§b J–çFMaƒ˜"hªƯDùœÆm÷¡éó&†4çQÇĂYOv>`Đđ¹É]$IN6ö5ƯDVŒ>ÆHƯz&‘¹Ï9˜ÎcÈ_¶I";‹bèT1ƒtñvPiSÂ1ɲđALOwƯÅe)ü]}W²Iö¡Á<²ơ“Ÿ̃ÅpsѼ…|^âb}³„zÎ̃tˆ”\®×—”t)ëqÇ_ ñOƠ ù¾EÍỗF›å¥GöÅ—Á•)|̉´™4@{“–FjÚ̀lÚ…è™f-  Zdaüú˜%$sbq8Ö ‚à§w6ˆpkÄGù²ñE]Pç0±^kôà̉XL}V£5Ô: ' ®SŸç-h8›0+F³.×e«ÛKyÙêö(×úú8·ă¶ÛÖ6³tëu÷8y}‘áF¬¡ hµ½Ơ··ÛO4ˆö´/mÙ½dṢ ăö€œM±ƒ/n©U­IvB̀f™ØzŒ½í*úä€1àu}½®×ëN`¨ ‰«râ)£ô£—Q~.?\̃·ÏÛ矷Ÿ¿́_í±×ưQ65¬wÊ"î´àïÜ:DÎÑÿhĂƠATvxÿL>Í>{\ ø̀æÉ®ø·)]ï¹äeÑ%ơt]®×‹S₫Ëe¶đœơ›¡ËĂu8>› éfêÙ>ïcá^ÆDÆvLq°—áóä¡À¦ÂZƠL`4Îdô§àyµ–Ñ,>¹\£Ơ$0@Oç+¡gÊér¹û±ï{4^[v$ߣÜ}ËêvSPr\{@ö·ÛÓâ(ó˜'œ3yqÜñVÚȾ>Óü{k‹¥2ă>ơ¹O µ“zäéykèÍ8Y~“%ÁÍJÀ‡ ?M· ÎgxxW¼ơs‡fæ‹@‹wpR ĂÍâOú́`ß•x7ûÀOû<[Á,°i‘Œ%µÑHh†'…¼Ô;ĂXóêRøX`¤‘àèƯH¼`; 4»?̉”\çR$å$j“•ûèFw/{’èĐ– ÏvY·&ø¦–Ă}œ§éá܉»-=âÚª'æ ÑX–®äá®}”ÄX¶½È,̉?R¬éå·À@¶'ºÂ©‚›kÁ‘^a&Ÿđ]’!YË’KÈẹ́!›Æà‚bûÜWÍצjf́è¢Å¤ ¥&Î ·¨ >©ÍµÄ£lüó"e‘%\¤ 6S?.4̀W¶ÙAcp¾»!rtZïÚ-I³øºe@Ü`í–AÙ¨¥áÖj¥¼ `Ÿ+*¨>-V1åS%ky *ç’/G9öºïË„P¸“³·')N[°V¬úœ¥X" —o°̉÷÷Đ£¤’k^Ú²ËZÖơX×¼®Ëº–ƠÊ€d U‹.Dª ¢Đ{?úØ‚§Ëb9ëơu}}Y_8L±™>-+N¹–Kù°|øơơ×G;̃÷ßm¿ûéñÓo¿}?̃K+}ô) êÖ¡­­.ei­Ùd±Üº>ê>äQ₫Çÿ>BDJt;I8uµ1~xÄ…r"oÎ)=qă¶µ‡iJ,|9g‘v́ ¨x:!đl¨ûtgëÿ¤q—¤éø TçTùo‡á₫§pO²§O 7¤÷N ÆûPùƒk;u:u>ê1A„ŒsܦiOtæÔö„ED|@¸ü–eÉ÷cGDqư¨ÓjG]7͉Åç‰S}ËÙdbe@JcŒÛưf¤ '́5‡zH½nÁ;¾2 ÷IÿǪÀ¾̉ èÄxơl„«q¾æ§ưĐŸ$$LưÏ 'YWAØÍsW̉pbWđɆÈ*‘; ÿF˜W‰¹±#@7óÛÑb…¥wlæăYw¬g+Ň·ªëm¯IÄuƒø¶sÀOÎ ƒPÏĐô₫çúv¦£ÊüAœ„@c€â®À®£.eùôư§œ̣ív»Ưo}LÓú±ô[ÉỖ„"ĂĂ}ụ̀EUd²áỤ{ä‡w­UªVíVTX¶M䨠®:̀`£,¾{…ÉÈyÙDDĂô6h´E—.½Œ̉GG€̃đØqNlÀSh^víñ€½µûw@v@Ơ‘,j¢‹ 5Cǘ%ĐROŸƯD®À́ú4ñ± ~¸`ÑÔ¯½ÂA.êksi—k¾îu)/ÅÔ³Ö¨ÓA®®]úc{¼ß̃¹ Øn2ưƠĐ&-<́è·$I{ß—¼lm[ê²æu9„ÙÄ_WE-X¨8kjrr³¼WV¼µÖ]÷Ụ̈ăx,yY+lÁˆ B%`ÅÊ2 «@ƺ;X×ί—ååW×_ưyưó·ưíçưçŸ÷Ÿ¿l_€”z79Đ̉—)Ê>ê®wˆ¥Ñ>Gù¿$ûÿ¿Ÿ’S_)gØù 1§_=•øâ§]~Vê₫ùÓÁlĐ¿Ïx¶ưcEÊ—SÏÏÚÖ)ă!e81°U$œ—Á¸Ă´ ”‘ég'¾Ø”sŒ[ñ˜T«ˆûĂ8Ơ™æé© S9-™tQ|¿†Ă$¯£Nµ)₫ûNï»)ưÓ¹hf‹ˆOEỴ̉ë_üú/₫üzY¯÷·ûßsû|#÷ÿ4Ü€‚{ê²]7´í€?Ç7†ăÖ9è˜/Hêñ¨đÛ±M¡?¦ùÖZGm­5™²¼)Ö‡Û“© :ß)̃5®@g̣)‡•r©LR\O:â˜ơ”œ'üVöÇøḾ̀,—̃Acr¡Eéu{ ́äî2täaªÊ·O2€¨ÔV… âË Ÿœ₫“’.†ïCFØ“*5>2ˆ₫‘XµrY|×q‰ŸLô2°f¬¼.¥È%ó^O5XJ=@ˆp%â$»|¢'B‘0™ZÊ‚5b*†‘¾ëe=êQ÷J§ïă5ắgÅ › —D¼J'¥¸̀µ„ʤ~Ü₫ö₫₫úóï¥Êvlưzhïđß~]éñ?Ç (Ăô¾6ÁP9́lŒÙ™A'fåZº”Ièx°àé(‘à́bO´o[l5ÇO/¡É€Ư¬$ÚÛA@¤%C̀)ôÄIAîÀ@ạǤ{́DrÁÏü}¹|ÎJ‚øÅá]ë›âüܳ5–Îö ÿ₫¨XÀÏ£Mf»€@É]» ÎU®-ơd•É÷Ÿ¾_ÖETn÷›₫ΔW>ÏNU§x̀‡_XẴH· z«*» ®°Et¢-6ù 3uÉG=øu3+¶˜a×Ṛ’íùÆÄs†¸Ce§f @7` ºX·yØ™;û{:Ă|ÀâQ „~& <ët ÷£«pÀY[-́ ˜lL§&‚Ï»Ư ÿAFÆăO¬J’rɽöZ+Nº1æ&†{ÁbÖ)́á-5Èn/ợR_¶²AUûº¿¢»÷ÓÇO#Ÿ¿ü\µJeÚícrM[Ü*!kjIkuT°™{̃ Öº.y¡(q“ÀK‹.©¤’Jíµ¦º§=¥&@[Iíu—Ư8©R–¼\– èÄnÀ¬$¦1ª×¬y‘奼|l?­Ÿ¾¯ßßöÛÛñ†_·ăö¨)êíëO@Ơů±f»ṣ?æG1èóƠi1aMà₫…A¶Ơ“ !ù’éy—ÉôO织0FNh¶Ï₫I ö©­U¦‹L̃Ǫ³ŒQ9ÙŸW ØW2ÔcïgD‰ºĐƯMÍ̀g9AAµôdú5Í5¤>B|6„j£đûœäE‹¡üƯ“FÚq²´=ÿÔûơŒaÍø\?₫̣ă/¯ụ̀A>¾]ß̉-ÁÖ<ѶÈ#û¤,Ö-ÉË’Lö¾,ÔdưQúSíCèߥC¹ Ó^wdzndž2€“°SD‹ÂIñïL?CxXpR̃¡¿å ëx²'C™æ´û&¡…e#¡Æ©uT®êsëÿiÑö̃÷}§g”¦ØYHu”?ŒƯ¤8>J€ÈÎBEj§Ë8ë|¼%`3R̀Ơ‚gT0v‹‹»˜ÖjC-ÀưûË,ƠÉ£K·8§E ‰ĐÇ ôŸ§ô?rÿÓ×KO‘œ̃A¡ui}„vĂơ¦ó̃íÜ£&½Í§CÔA(¼!o‹atU}ưđY3'×M›Ư¹óo"4íỤ1$ŒQ=‡‘Jîmßă'³ ûÊ-đ4QÑaüWÛ;™2,5ƠTơbAÖoI₫-0‰*N¯ăÀÂ¥˜Ô UÇÜƠIvÆ¿Œ[Óđx"ê^º'¾µ£Î‡Ë u¯;o% ;@ÿ¶{ø̀&kzôÑÅhÚX'[ênj¢æKMN{û?y2rdêÙê#®¿®ñx})ïñJeV!8T §{à’“z:́ ’­M¤:t,e¹®×eYb)>8ÅܧÀD5Àz˜ù§|œ­ïçùQÄ‹x§è¢k£™ñ·+@»R”pơ5TƠú-³°Ñ±VM97AƒÓ¶&­JÅ'(VY»t”I†û~Ññ¯¢đ± x;§&-ăQÂÑà¸eô”›?+6Y»ĂRóƒA\¿€}Û2I¥£\—µ¦*b̀߬í jaP¨"&öĐ„‡5¯µÔK» —¾• ­äj|wù®§>Ö±-æµÖ*:j€¤2g-çSđ„b846½̉JÖŒ̉ dø”\J)8‹ŒÑ¹SS­¹ÖVµê!®#°ÓHZ5§¼l +¼€2àº^¯ùJ½ñ’z,iüĐái+¹¼.¯ửv|̃?[7`ÿB"̉Á=ð~ë$éfºhø»²̣?ÎG„ñ‰] cñÇN\¨ Éëcơh;Cÿ'Ác₫iÄÿÍqăÎ-˜'«K}¸ùÜÑ2µ+Tøäg²?FÛ/±]ÊÉ&rz¢:îw¥P̉´¦•^aª&ܽœSÓGj7‚¿îă₫„û¨êtœ ¤y† F9[ Hi·ööă—i²´å»å»,Ù”?e¸?/—åÂ6ÈRxó- ôNBµ°û°-ăJÛqôc‚~÷øâ-jç̀TˆwÏ"1ÂqÍ2q¿é|zƯÚ6Üf0dîÑ‚°6G̀¦ªç˜¶đ1ÜvÂåư¤Z™"uƯˆêÓyOú/µƠ†˜N¼w†×^½ư;J˜~C¾’ñ¹œV¦7.øT́ ©̃|=T€¨*{è³ú¥ ˆâÓüx B\7?ƠFCøG{#¾ù†€Nµư41§àjđ6ÙD¢»–Ău_ gOX$i¬]ẫ¹ÿàdÍOŒM]yÑØÇåưôư§mß>ß>lj|îLư/›XLJA4ÄØ»8 X|âôC` 4•3sÇ;-ô˜?.FÁÆƠ‡‘覃R¥€,¯½¤®ŒÂ4Ȩƒqu³#*yüNQp̣Ô%æùÂå¡î¥nC†µ÷>²•m&Ê’Ñ{Ï9/Ë’s>CÚLn ²ñ»ÄÄcÄÑS̉ăâ Äé΄1]y'’9ˆ¤ă}4 ăùWÜ"øN,›ß>h¹rÉNœ³ê5ÍsƯ:mZ !æ è2dÜ̃nÇql/Ït&¸2Ẵ–+°Vw  (ñ2Æü:´ëH^‹4lb œ»ªj^U±aXu8ưÙêŸ}|™weM¯…®ûàúvmOƒN›ÔªÔUWSi…@¨ŒR¤4iEJ>O‘'Ư—Ÿá„UƠÑtÿÖ(IŸFó§&¢É"Â⨲i^÷FÇéQÅ£äắ⤮ªˆÛŸƯc F7ÿĐsϲs†,gỴ²´¥ơVKƯË~´κûq×®{Û_åơûơ{đvƯ÷¾₫â{¡…’¦‰µ†f#´₫°EàhØÛnø 5@Yàî]̣Â2À†HÂsØË‘œrna\CFuôQG•&G;6ÙrÊe/%—5¯—årY.& Z_l¨đrÜ%áóCU½¬Uó4ÿ:ÿú—×_1¾́_~ûøíOÛO?>~|ԇŠOôOç…Ă”wË<ú'E´X¯̀ÜŒXĂđyµMCNø€|£ ˆßçé4úg~L¾ߌb¸øÄg^Ls „=¹DÜÏVÀIVqΤÎg¶‰ưIÎ5¹íưLù·:,J¾$Ç.âQÍ̀éôˆß(äù€b„́GjƠrrêNr—µægGï|pÁñåø±₫x-×E—|äùCTûX‡$O•ĂVÜç¼ ư‘DQ¥ÚÆ@n;Ø»ÀÜêvßî–˜^§c†›¹œB8é©}j³Û2̃²<]̀Nkä)“& 1‘ÖZ2yIMØèJ 5êl.¥¹Æ¾Fÿ'ªÏÍ*§‚́ç°Øhÿ5œ}|̀´c+GuzH,’ßG¦óQ2́¥?I¨̃Y>1,o'8 8)Đ³KaĐ¯z¬Û}^^ '°·BêYEM đŒ4eÊ8¾•ÛB—„Mqf¨+Æ̃ù¤ ûåồtéy¶Œ¸"â~¶Où¡2µƠÛív´ëö)zË )=|>÷Sg̉©épO>¦ Hn-k^r…ÎGØâƠˆÈl@YFA‘«wNb›0œÎ°ơ)%^ƒböV` XƠiZ/ÀP«4å·…û÷ ?% oûø Åósđ̣L78:í¬,¸}$’¯£zTjcúÄßhÚ©́©7kZ‰Ú?G¹•Sf K6ç$?³ÑÆ!÷?µ…̀¿bV‰¤¸¼c“T´½$vI†ø˜̃áÑâ¸ÿUå`‘§Fvßn·qû¾ójà`IÀí—#¨Å™ÔÄ`M¢V|5÷n#ùfưà> K$ÙƠSE;Åz#tŸ¼†ÄßSÙeùư,b(¤°€éƯô?Uë1KºT©( ` î̉‹Ưèdι¸êÜ?Ê₫nQüDUăh@đÓ‚÷R™d›:Ÿ¼ï¦SÂÄÍÿ)¡ÁƯ_9åÑGʉ¶K²̣Ä{jøøe Á•ÜmöSkíR.Çr¼/8‚sÉå¥Üëä·U}§kë–ͽ'-.wȘRhɶ,u±¼ ´¢`3^x’¦Ù⮩ÖVkªö †üt³bíÈ5?̣£e-ëûönAëơu}eđd¦́ˆ+**í×åuÉ˯®¿úwÿƯçư3:_ö/Só3ZõdîVôáVæ5@9 çưßñGá:³»2'Us¶đb:=₫f6܇ ”=©}Hù8}̣ à?ï#¦ N©¤‚ëK}?¤œ´›úCƠđ4ÜtÙÏĦ1»Óo-ŸôĐiZ{Mëï*ÓIr+£Kg('#}f¤`=øe!ÿđư‡/oÛí÷÷û[½í}'k΋† ë̃^–%/«®Óă;ÖôHR$¥dß́‚Ÿ¼ä”×´â¡5¸ŸÊZÖR|²4̉Ûå +2hº,Å¿m´½îưAèoY¼\B4Äù)®Ü¤›sÍÆL5…ØÚNtux—B‚‡J)¥”´ư@ăv6d̉‡³¿”ü  «N)0ó`Y¥ˆY§LĐê·z̀RadmÆ2àl; ư÷O•|̣¡¹:³|åñ“©\̣¿ùú;ÏÑ¿ùd€¡?[û}˜(ÿ4¦ÈË â~®va<¢x‡ư+èoM€ñƠ2³ ø°Ùóqè? ß2Ñ¿­=•ÓûÅ?ǺQ¨uA¹₫ăO?Ö^oÛí‰₫·uèèŸb$|÷'OAc’)nB˜Œ¯®/×Ûíööö&îÛ™ø~̀úÁ®¨œºRd„‰DKÆƯ¢à¥F6‹ClÙé6-Âă+u¨©kÔ\́êẶ¦o~„S Ä,RÖOÔ.Ôk±oÀP' ê­ïû¨€k Nü«ˆØô0<ç̉jîCEâJN¢˜7çÎ`›?-^eQó ƯS–èY¢ơ,™1{$zƠËé4¦†̃‹†ÀL nÂsĐDöC¤ag¬0jÏ{¡a&ð* `UĐ“HØ¡b©ƒN£'HN®¤«™^FĐE¢+.ÅÇ×ëåñ¸₫ü?Ư–†¯m"Z®.̃>€k“ëDo˜¸Ypư£j­R!j̉Y´¬₫`é>„$ „TuYÜåZë?ÿ«%óä Đ`+jxØj'åÿúi£µKÿó_Ÿí.n›°;—eYJ.û¶fÇØH#-¶æ’ÉÓ£¦¥¡I‰tÖS¾Á?°y Ç¡0Ç“ư¦§‘΅ï“ü"̃=wöÀ&"ijZ>æ̀óñÁ¡ă×ßÿú×̣ëÏïŸỵ̈ïỵ̈ÑG=æÚ B+Nt&{®y=y|=äç’/ ÙeÎ'fÍVDás ư¡Œ̣ŒªK.j‡|}&1sưñ`3Â’ø¬‡9ê¨<§ÀĂơÑ!úGQJ̃ŒƯWg̀ƒ_Ïœ‰’îØ”©­æ‰3ƒ°«¡H—2g[11Msæˆ̀…1Dÿ\¢ûq#l‚£.°ƒ“yöaĐ̉“ö]|û³́'̃t̉ÿø¯Içèßho bp6=¹ˆä.?‰L§Đ‚? ¨óÁ±wĐ'î§É›Ôû1„JY à@:œØAâ¢ïøÇ÷5CxÇ, ´Èîüîçß¡yÅ×Àßg̉?ưÇ´̉’¿ƯÅ© ÓU‚———ï>~×[¿ßk'™ÂB=q„wt”’]¶»C¸¬ÖcÁ₫×C̃½°Éăă‹| J²vPÈơ·&NS­ˆ×}ÈŒññN›eăø9Ơ{¯GmÚ,‹Ù·kqN«»wÙ"‚âV₫j+ úru›=O> R–Ùe…%“W>ªÅÑZO·‰¯pxR|Uó̉ùb¸‡‡Mó³*9e”„ªF?cèSkH<£èr íS>a®\*}½A3óTA„Vªˆ@CÂ{ưư÷ß÷Ưw?ùùË—/\”EQ†‡„U1SάGl‰XĂAZµjm½-º´Ñjªl4ie”E–¬¹HÁD3„Ỵ̈q˜Ç³Zù­€æX oƯđÙứbÍ+¶ÅÅ‘p̃£"ºy ­è Èó‰mFU¸MY-q¿µv”c_÷ưØ·jƒw,ƒ»m˜Ésôcë8;fgu4Äѽé[[̃Û¾¤%× 0¶”Å4¹0¼*ÜsN¹jµÔ ZQf1ZkµVQ)©ä#—½Ụ̈m]V@ÿ( 2]P^é j¤ÓRæ‰R¹–ëµ\Ñq\ÏÇçÏûç/Ç—÷ă}kÛV·½ï¦óécÊÆl LÜOQ¬\ ™4].—”̉¾ïÿ- €©‘ü&¸DºVw[oOè7₫›5ơ`ă©Îg>f@lΜY±(’S¾¬——ëËR–·öfBạ̀œ)̣v¥¨ &Ù¢‘€Cç3¯LAơ|7nmX£ÀÓäøgVº”©ï×I^RbW¬›Hưôưs“Ê´ •Z¸fÛ~ôC‹–—̣ñ—ë¥íc̣M§Đ?K^óZ´¬º"ßóô§ÅFüú˜̃Ù'q‚O,¤>qBkë?\_{5—$¸̣߀„̣¬*#ñ?< ÙZiîï$ô7°åVņkªV±½o¥ª)¥V›e„åLƒ‡1¿¾‰rm̀í)èÊÄ₫€ÅÉïw"÷÷‘¡cÀưØGXơ1¸,'ôg~q9~"ç€F=@bçeÄ­ÁEæ¤-> ”úÀơkº8=ÿ³¼‰‡ơôü¼±}Œy…̣À,OÛˆ‘ÿ³ˆơ•¸ô_Œ>9 «‚ă#ưa5‹³µ†GƒÇ$ŸDêíMI¢Oª>#ñî,Ô¿Ï8 dÚ½ăÙ6Û˜:ÿˆ7nÔ© €œr)S$ ™“J:ƠŸ2—¨rîŸç™ÄjÄ!ÚúQ­ªM­cXêe7aĂđ8 ¤pδ~5n^8×Öơ XSG:ùIïá©5ü ïJ®‘•@Ô³đJör1f́PÀ@Ä̀«“vŒô‚‡Ml\À9 ?Á7™ñ4‹Í±8Ï»5’f14f=Ë©˜Ư€¨•×é}·æÀWœkàÛáÓ4̉€ø/]Đɱ„0ô¯6†¼ơ59³rƠ>×›-°dvñ©rÁ–ܽœj3¶‡ˆ ́¡Đ›Í7ܳ E…‹×ºjÉ9$́ ‡ ơ$@ƠºèRµ.}AH(j€E–¦65,Kî̉-œĂă¤z…̀‡²;-ÔÓæ&aÔµÛ@1é$, Ù̉»€8ㆅïz2,¬ ÓLïÅäµ1&.#QÔʼĐ́Å3h>OµY¤`fÖ(c-ëµ_å8êñ¡}Øíq<`8úñÈ”¨rFĐÏ^«…®odä[£^tÙuÏ)om[t™¼@Gg¢ ”sÏYsîÅ@ná¡fR{Ÿ¥­ÅÆ’®×S%ÀéeË9¯™Â˜i2EË/̉/~±₫bȰIÛO¿Û~÷Їñ’L.ϧ€ø£[ ¶°³¡ đßV#TlëdËhN"3kg®ÉIêCĐ÷ôxÀ|óCU¯×+ ÇÓt¾$Œ“0ơ¤w‹’¦ëz}¹¼$MXIYá3ws.EËR&èGt‰¬t¢ÊL¨¡d’—ŒÄ¿bôá³]ØäÙqsôCÀAđjƒxG}Çk(°Ơ§a^ȬAcxº÷₫7¿ù›[¿Ưă8@háPJ°±eê¨Nï×uÉË%]NÁ>Ù#ṔŸÑÓ<ña9HyÔG—.´}C|?Æø³ûgZôÇŸ~üƯ?üîq<́­5KÿÅÛG ά̣Ä·¥'˜Xßáê%´4Y™Tès^X̣ƯQk®®́'Nb´ ?öR¹¢¾K9¡V ¥ÙÜ;z 0jƒơ·d÷<´fö Kfñ\®S´6'¤o 9“đz\Ătç‹Y`Ÿq,â°‹9œ.ÍĐÏhnæäQ-®%mÄP8u^Ûô\ñ¼·ó §­“^&»»?ö½ïö{ß-…ÓÑ?ÊS8dd?GăäJCâĐt«F”e\́$À&ôÇYø$`“>dØ"ñt)fL"L“àä -Ncßo÷$騣rŬ Ö ߨ,ßdVƒnä"Ÿ­!4\ƒdÛxÔ¹YখÉYxuxqN̉ a-µXđwöå„å‰H,'¨‚„HˆB  ôï©ë˜Öj<,„lsxÑ3GŸ¯„=́K‚w3kÆ52*]‡æœ‡ŒÖÚd»| g=yb"ø_å´k©ÏwóĂR "Ä[̃;›öXK½÷in©kOt•ăû¥¡]Ÿ{%€ a0°˜¬_<ä—Ô5b̃x°ukfÑ×—×å²́û € &E(Đñ₫å}Û·Ûí&>1:îió»¹±ï‘ă¬ùß=Wjd ¸{Ûhÿz¬i­ZW]Q,²¬²âDbäasÍíÇyÊvî¼ >*K₫rUKû1»pȰ‚"åµ·¨.2œWQX¡DO>T¼Zñƒ>,18‘§&-¸}â`ë7±ô”s^ʲÖơZ®/ë {Ưºç}ëÛ̃v´°ÍF¥¥ơ´1ố›¨VÚë®{éeMk®yÍk©…Ñ‚FvPs›—™¥{'§\Ûr*™æ”‚$Æeâ¼>6Ă¡@Ü ¯±À.„¤L‘ú¿53ï߆ơíO"/&.¯8÷'ßaơ¥->„bÅFÙÔâëÉ­8Ÿñ§¡•@Á÷Œ’sÆÄE$VÉü„wpjï4ỐFé|Çaë·_²ư¨bá vh^̣ˆ†‰ĂÆú!PÜdž‘SnGk‡=ÔÖ½©ÉŒ8öß%´¹ƯSÁmMÜâ)”†«ûq·Ú* §iRB¦pVˆÎFgGÛhE_â$1…=OÚ° <,"”4¶¡m—ߘÜüÄ+3T: X——Ø›åÿ†!fÚâ:O9•\´koÓ'`6±b€omêRÆ”ïŸx\~_ c˜ Êü¥¨gƠ;ưO÷'tYxïµƠ–©G @OO{|IõơQ;¶JÈÖ‹<ïÉß<‚é3áŒ3|Î2;ÁXªpG̣¦ºUf¹,///½Çí>߬:ÍŸD‡®ëúáơĂ£<Ǩv©ÁƯb·<²É~́±÷Åú'®Lyđà<7A0óÚhL«6iU+G:tă@%°È²ê QP~=‘NwĪw#đ‘ợÛ®^²à,3µăÔĂä„4«c"=oµ»Ăï(öˆÁ‡cê5µ–*yS››$:v’3T̀°@ˆ̃ûÚ×Zjm |«0= ï(°ßärÔ¢…N<6Èđƒu¡‘ªí(¹”Zb¦Añ¼>¦_`züÁ¦êU= -Ù¤é¨Ç^÷{¾/Ûb* à ¸”˵\×ee@ 7÷äøđ’̀Âky\ÊåặñûơûÛq»×û­̃îơ¾ơÍROœø/½Ø;Í •Ṛ­è6ü*iZóJ nßÿß²÷=ºx©Ê°à́ëgƘÂÖHWüóå>0b¶Ö¢`°ƒT:93ºè’G^e-k)AÇ̀q~76ÙĂÉ*ေ?è,`çt¤¯ ¾1Ù«„VÖqJ(ñ_µ§Ú âD ·{´Ç£>ˆ₫ñ_±;¿}~{{ÇY…$kFê(pÿë‡y‘ơ§́Û¤>®́¿ÏĐL5Á (¼f2²†kG2>ß>7i¿ÿù¶ƯuÿdŸ»aư³S¯®ÉIëßc„¶t ŒN¶;[Ùú?倓BˆO)mzZ9¶*̓ ̃ ®̣̉ÎdÜå©üñ¸O·5Đ́ÊX”¯^̣Y˜Íø yƠ‘1 vIbPÛ÷=fơ0Å?ô|S Dé?-7ê ßĂç]p‡ê. è½OÂ^<äJEE!Íç̀à‡Ó©©À'nµéTƯ :¼k¯‘ơ5ÀÑC¦₫‡t”u™Ü¿ £YÑéDÿ,ERJU«I èA·2@¼¬%¹î±|³́(NÙ£0Îvd¬êÑǾíâ® äøđy›\ÿCœ÷TÏîR²¹Q¬r:ÏÇ wu„DùSkˆØ4DÉñÛœJhë÷{åœËZF ư°È«F°5 é*­ Åî¾¢xrq÷àÅAÚŒ•Q¾¶ÀVb°™2À x¶5ôTÓ̀©§»<ư Ï£ø{¬Xˆ|Â1ü|&E> XPM–Bïºg÷3²eË·ÿ̉LªIdH¹”ß}¬{½½¿£ƯJ̣ÿÄÛz‰ÂQ|³Ü³U/]z5Âb‚æ» ?Ơ`·¡sMy˜"ˆÍ«™>â+ mͬuË1Cí×Vè $´hAyiíưñ|wâ6…}Xư®‚₫·‹ ‰Ñçö˜W¸'˜°~Vbbï€Å]Ô®åĂ¿5œªˆËípa™Rh$ÊéÄ̀â*äˆÉ凌Ö[¿´Ëu½ÖZQ &¯;ŒÂđ [%L‰¸Uă_<~훘Çwë ́₫Óˆ!b9́œ-hÙ^jªG3dEiÍ£i«½¦rÊúX¶e]Vä]–ËẸ̈r]¯×r…(ñDœÅ2àë.>Nè!|Z>ƠK}«ooûÛÛñö^ß9}uZ‚R¨Œå@&(í]Eó_=f₫×ù(ö0VèkSëÿ$́áæĂ½₫tüK> \iGÚ`ÇcŒrœ£Æ_æRR¹” ¥êËu!fJ!FĐ1…ÿ¿ß¼(™›£cy®Sm)™ÈRÜB>›ÚÔCØƯ¦Dø$bñO₫2B¤ˆf=êq¯wb¾lĂ+Ư^0(ûúÓækÆß ø±·–'LA¼Q₫yÊc"ëßG׬×ëuôQïơ^ïÏ”v¯]ú_ư§¿Úë₫åíË£>ˆ₫§¿ù¼tŒFbic¿z3¿,ë¥^{﬋ĐY‹k‰÷”H—öeÛJ̣i›s ᜳIÎúg=Sb§å»q ₫iW ăy«›ơ+é÷ô¿̉\{v+ƒ̀ŒB|ƠHâ`*°cν¿¤ä#„ͳ®Ó¶N迦ƠÊ$ÏƠ8@CtÎ<‹5~D‡…0ºRTÖu-¹Ô£öÚ£ß7M³áoA=N”À‘ôºÏd¡í±ơmjÆNK€ÈÔpGexäËôûJ7 $›xk}tíPdLxÚÑ84(O³…:Ọ*^j ­¸ Ü„aâ më\$;Bú'/iJĩb7€°RÅ<HÑîf·Y‡P¾JŒˆçÂ\çôÏY¸c>K¶!Aàø…¢ô'6ë‰₫5ѯϿQäÁ³;ÑCyó$­á”#o>P̀ͯøÉgÍ®­·•b g‹³̣g.0RT¢~…3úxm³Î‰j«N÷bøEvu Ơ;³MAÑ= Ămbon ñ‚¡®]{•…´)ÍÔÖđq_¾|é½áúcáU•TT´ö=)™V×qơœU[äû±7Ø”ơ‰j9¡0¦ïÿî̉:*Đê¡G͵ö .9ºĐ Ù7|(Ç7Ë^®Id¨ 3ƒ g÷ÙÊ€ è©Y¬wçÿIB#Q¾U( ôoèÏtr•à¶8i# RƠ”ÓÈcéËÚ×̃ûK}A|Ÿ‰‚˜eFáæŸô­¦ÚF;Ô˜bJ¡¿";_DvƯK+s@Süƒ:J²YÎ%•Ö[n9§\SÍ-íH>TZU!~èẮe½k0593C³å!ȃ>>ܾ[¾ûnùNEßëûï·ß>>ÿ₫ñû£TơĐ'0]cVV ä&"d G0›QF₫_©(·zë>©¾{́º=ùd|Qríˆüg6)T´”̣áơĂËåeßö¶·µ¬dÅL/Ø -©R°– ù₫<1@Ơc<æmÛ"?”Îlq đÈđ?¢H;;o‰ƯHÈ`ºƒ¼Qù;U@_ÿzj̀_í@`Âq«·[»ưîëÇ‹1"Đ[W@üLöŒRJŒôcȧ0{µä’̣ ?5~Â.à{)Ëw¿øn;¶·ưí^ï†ÔÛ©ÔÙÚv‡…¢°1=k€€ûIùÇ<€*ÖE~{=-*Ü»µ¬Ë²¬<é°ƒØÂđ9AD̉ ¨+©ˆHJsD.aqä\‰0)}ŒAÍ’M^lÛÑœ}~đB™¼Ácy¾Îà§ëW•+r ¦8Ť†)›CŸ#¼€³¤“ûÄÿdưƒv-–„ư>Æ)ß̀Ơ;m­5€†©û§ëw’dĐÿSKÍ$U.‡{ô à₫iÖ /¬âƯ “øk(†·$¢D!÷¾T¶cCꔂĂÇÄ+¡±qÆúøªçî)‹Sê‚XJl`¦•lÂÖZT9á¸5ÅsTt‚0"̣¸A£CB(ox«‘,íÄT@œ¤ëÁo4ư ú{€₫1”r[ª}B;–œö.ư±?zíđÉ̀ ³Aƒ@⛄ÔIÂ$³'p_M¡?RDj­£ÍṢDÛû‹ŸPÁåX~sfQÍ>@b€˜̀z#^K€&-FŒ‚Aă=¥#h: 6c8™œ ~€8Ây¸Đ|CN®ˆḤùís=*$=yä¡Ăæjib¿¨µV[œ́ÊSJÄ2Ú&à=@<ƒt8Dkn^¼>Ïjc!²·ÑcHh%%D9át^t©£é8ô8̉QS-RÖ±¢@7êíÓ»ó#€O=³ :¯°Ú&ƒ;J_“ùUµ‘×ÉxLP˜̣gû0¯Â áÈ|´©g‹²Ÿ'đơ?Q£OÿReb#âx۾ܿ 6$Á°„àNG4l8>™g1J›́Ưùc`>,Ổl¸®Æë‹”́~¨ä …Y€E0‡"€<¾¹•gO\?x`4B4ñÍ,ÏB1 ̣â)0f »0_èăáéƒ}> T¥öÔS·&DS`OÚưQ½~ZỆà{¬pb¼º¡W¢sQ©0W$RøW bK”1̉³Đ?ùâ•ÓéäoÙBu)gf4©ç̣$è+N¹#Äœ¡À•Äơ± 3=´ĐđcCmÔÄĐ∶B{ăÚÅ•ëàtÈXŸN_b,=!Å̃;¬đ†ûƒ‡JKÆŸ°oH\'–Gà ²ä9₫*^́sC ₫O±ŒÓ ?—÷%MÄưBặW$>ÿúÏb8ĐI@u\-€ÎóË‚ÂĐϧùÅü2ê:Øt"C‘<ưÆ øS–?a±`~£'8BÿÈ\ÚTålT̉´‰§FÚå  L´­ÍâPÛĂfSˆËtqÅgv~ûđªÎÉŒ]$IYDrÏ¢’5CÈ>̉˜~€ØßY ±Çă~¨9³‰³Qá5Û›J2̉8Ʊơ #rá ̃u¿ŒË1*²ç×î†:YØ‚q‹mÁyéO¾zªÙÄ3‚l²o‰´¶̉mâ}eÅçxXáêŒzĐÅÓâ]b'Êl¤Ñ{OãY´ăÛî=BJÁyb‰Í%/}é¥_ûFá£Û±az¥All}úgv°MLI~~~=9Ổ̃ôÈ-³°ô|?Jq;¶rB„+ŒÂ¹çjî¹Ö0ÆÙ‡̃ºvƯë¾åm©Ë½Üax)/*Œ¹¨¾1+ÖƠn¤"fÆGÑRJI)Ơ^ß÷{»ßÛ£=¨ o©Yo3uMúñåăŸưé¿9ö]‡üüûŸOæO߉%Al `₫ŸVùÂơrÚsÏ™âs<;}ÿ92XfXµ[ÙFe5U–9M= đ²\Ơz)CciƠȈhØÍăxÚgĂv–h¦Ÿ¡¾_Mÿ.ÁiÔĐưÔ¾ùÚ¹;EÀm ¼€]†k„blTļÂ8{ok[ ïÙ>V¢|­ơ‡Ä?M›ïŒ÷ÉKÖ¼³¶0₫’<<Ú2d0]ÑHwªÂ†EpZsmï¿{ÿƯvlæî•<ăđäÁyHÓ¤ĂÙ™q¨£"2•3(p£gÖ‘‹Ă—¯K.z(:½øˆÄefô”ÇŸy.‰’¼­ĂL5‹w]Ql…±ØCcăă*ÅƯ™ÚÇd N¨Eí´vz•„–m߸-sù A©I¼V1î3Z\ôè‘È$ÚÇ7$×Ă_º€ÿßúÈQăœÛ½+"χª!á²EÖ>v£Ú†, üN±é,8C®(±äÁÿ–üóDɇÏƠ}ÀÓ2EVó‚ø;dđLŸđ‘•j¸­ €:ÂơQÄgHEDÿ,ê$θCjœ4Aÿ–ƯÈQ¨züôÓ”æï+aœ:D„jr 7ÇQ¸2æ}œKÈ¥)¤¥YÏÏ‹œüpeÿÜUb<¨NßKüúUŒæ·ÏÅ3[oí5bt–°AÊŸFBŸe˸jB¼N>Af?J¬á=Ù]\¿m–SÍ`>üAõ³”:=Jg'À|ÏÅÀlU8¦4£$% ïaHÔú >™CÄŒwÇ?Wåñ9S…;DÓ,“PŒ1ROÜq7đ²n€Ocˆ§< ˜tq÷ç Ï×·Ơr@ÍPtÔ£K7†1U=×T]t\̣Å´+b¶à:jK­ŒÂœĐ8åsâ{V›ḶJ±¡v\‰îVéá‚!®±ÀÀ® j¯9ALg ` Ơà“æÅŸơ¡WVUÔóæ̣¨V»ƒ>¯}ª"¶à¥’F’bóm.í‚Cè‚,/è˜ƯlÔˆB“6†5G"́ë1FµJƠ¦ÙYÙÊ’—¤)çLê=kn©•^L‹ÑÚ¡³¶í©̃ÓÑk?Ú‘k¾§û×[¹]—ëe»`‚’C×¼B>ưœÄfŒ†ÅV©Ơ®UD奼|X>ÈUí»đÛñQwOæê)©¤¡/——/.åy“ÈúOZ¹OVe~Á8JÿL ^¸ÍîÓùÏF₫ó fm¨zfª ¦ºƠ¿û›¿+¹́û~Y/œĐ†kU₫ªûĂ¼¼¸AO>Àå§O|?e‚Æ̣ê$ûă|<Ïü'SÚá~Æ}4Sª@<™o‚Î"iC·ơ‚ûw¶‚`€¤|Fy’±₫ɦWå¯Éâ}"¤[óS‰₫œăËäû<1±9 ÓÇ¿ÿñ§/?A¿̃Å\¹öI‹©51ôpPâ¯#¸S=ùƯ{R*^̉ˆ’§eÓ•cêăŕ!Lư1kל̣e¹`½M¦Ù;¡ønY²f%ñđü•˃ÅXÁ«Gù̃oÍ"“1ôÀêu×p˜Åg>~>„+†ñă¦k\ÏíùG’{Ь¦Ê~Ú¬mè.³,¾ưR=˜¢fÆÚÓĐ?QÂ<ĂØ`9‡₫̀Ú]úu–@+üzo£-ër]¯-µz«_̃¾X%¤Á̉g €₫Ù÷Çư‚dÅb™?÷§yÈ/Œ¥‡3̉€¯„˜ÊsŸºĂ"³·é)R¶²™Bèp­wS*úïl $&­ö­vÈ DRJ&kXă#@Œd¯Áqµ«ƠEI¨D5¶̀g–[S DɶHI‡¦œrÏKYzï×vE₫&tAHµ° 7 ?ÚĂ0z>¸ă„'˜T-¥€H50ÚÑ̀zÊ9£!À—ÁÓU«M èµ¥F\A>b‚½1Zo8Ä/år/÷ËrAj¦[7À Ïn€Î@^åØD5&hư¸||-¯¿º₫êVo¦jÛ£nơ¯₫̣¯Fï÷û}) ÏÓ.<<5(6˜D.r†ÏÀbđ ë¡øÿEM„˜ß™~ÆZ₫kÛ[Êé®Ëë²äå’/˜G‰ÿ‰¾Os ›̣„ ₫º'è×$"Tnåôđ51L)nḯ#ǶEÊÿ¤†(zØ„‹ÈŒb#‹‚}™–ß}øˆ_ÿÔÈ’æ"ƒM“¹₫&î5À´G»¤;çY< ư¡Z ­C °nÉƯo;ˆT8Ñ×k ŸaAX…›Đ€áÊËΉѰ´ÜJjs¦¿3ÙJ £Â} CVd‚ 'Ö¼ÎeÀ·)peç4BMy¯&ûÁï'IŒèäÜ Åườx‰Ÿ₫—q›Ë)Cn88–8è7È~â¶2‘èđ¹H̉ç´́431üe0U­|›UàT£º m\íF ơ)û 8y-¼ ªáëỏLÛà‡4~G–›¬²,KÎýẵîè´XÚÜfR]v>‡.]SfHÆMAàë‚ÄÅ÷ṇ̃0«§ƒVœƒ÷ăËV±÷xj5HhÿÁđÁág7+è§Ȧ¦ü¾€IDATÊW™Éø¹‘̉a™ë©îŸJÇÿ₫ßÿûÿđÿú˜Ó°hÛ¬̉øÄ7œ`à²́*@ºx̣ŸlVØ.lư«%軬V¤ÊÆB+6'’O ÿ†)mD±¶? ›ù8Ñvhw³6®m J¤̉ckGUt ‰ÎɽÂñTƠÔ{Ÿ4Ø$¾ùë—7ơ–_“w\½<Û¿úYÄ÷ œG ÉÉq€¹ơXo&A®yê ÉN Ñʺœ̣q‡º%`È@xƒÀ0Jʨ¢¢f™[ü2”9­YM—]µÊ;Ö]0)]RJ]zƠ5·Ñt,i©©^̉Å\RW]1«±ha7€ ¡Xö¬mđm1‹ư¡=ùQp·×O¯yŸE)'t‡ˆ°2Ơ¹6ơ¤¾ùP‡ö!Ị9• A FGƒÅl\!À€}Nø4L₫Ú=r@œp(ăkFe”K»€öFa(‚mëÛ£>¾i0uP¯Ñæ—Rúđ჈<ÇăÁ–#ä ISMµôr´#ºơxÖ˜­±đn5…”Ẫ£¯w›$Ưº}ÙV·ơXÁGs|˜9ÊejtµĐ³*aKD§_Ănœ¿*zI—ˇG{́u?Æñøbjê%/væ¦n¿Çé ô;‘jåӘͩÈ­×Ùưđ=³”R„₫(₫##ƒtâ©6?ú]-y™íôS*`OÅ8ơUă¾/̃´b7öd|¸t‰ÿŒôñF?b%fnk·ÁÎ'«n«uù=ƒ™\Mt¸4–́ằüA8®Qè‚û‘÷)SëÙ}›êb=±-Ă1[˜£‰Xr₫ZC&@hƒ2›:jo(œü™W3j «ÙY–ùu»)$ízŸP¬£"ôǺgC\29cĂưÉ)Ïœ‘k4G¿å’³ufK.Ø:-f+D=ơƠ¦Aÿh÷|$ơ m»»È-ÅE3ÅƯơqßïh€rå̀˜;YÅ]È´́Èë\¢qđ1B:X ½/'¥ÎÂ$M[—^´Â™ĂĐÅÛX(tɬW­È *G¹í7t^–˜L¨â±„¾¬Đ„ñqlIÔ#5IZóú^¯ưº—}kÛ£=̣ȘS¢…"¬#(J Ó{̣̀¾Aø‚X̀ªÀÌ—ëKáNưÄaüÊ‘¥:G¢2Ç3Ư¬FÄsÆ 6H¬.åbHËE>TÊÆ}œŒéˆsdÂkĐŸIílñ°‚TÎxS‹6@mkm?ö™×GÏî¶{ Ø´Ö !6 ưKLoÀ1*V@XN›ï0Ñ fxMµä₫.ñ§£×l¾yå'&×Gf)•,̉Kè¥Ö¨ÎN₫À¬†đLë‚«N‰ çÇ~îĐx åă_ùŸ­BÎ÷µêXơÏ–4~V[&ËøÇ›å \b S'öÄ×Z`"çàºÆŒó¦́'DÊ*âSD(aÂÛÁ+7èÜñ‹#EMSùăW2W–m•g?Çbgư™²5¯3ƒ¦fMï̉ˆ¨!1D:Åÿÿâû_üñ¯₫X»₫ưß₫=₫~JMÎDå³́és3Âÿ±ôå¹>0'‹E¸/?j‹HæRóé¡\÷ûư­¾ơÔßïïÇ;‰'Ñÿ\_g^0ÏÚéoKvëT+M˜rŒû¸ºXV“.eư_ÿoÿËÛíí¯₫¯¿zî*ḤæÚ3!Ç›¤o¢f́FH åƯœ¡dôc­Æ½7Ê«È̃éPŒ(BL;%ómUÑÿưÿñ¿Nÿ ô C9|:ˆI&ß§‡X³¶Ễº„ª/₫."µVÜ ̃2PÑC̀ 0dÔV/Ë…B>öy¾₫Å̉‹Å[óÙÆ?ʹ}-ñïésÜ5ÊK†ëj†kfX< fơ@íuk‚@£½E€ƠÅ5ÊƯù|Ÿ¬ˆø .û&̀`œy†>µ8Px?!Ö¦  ® êÿîăƠa6 0.́T̉ËëKÎùư₫{ ~’7̃$†“¦°´«&ÅïcL6„Íq“OIÅYIuè¬|¹††̀0ù;ƒùk¯%Ç8.éRS­¹V­KZ.é‚)‹,†₫‡ƠÛă')rü}Ø}·™ƒ´È”¨ĐS\sƯª'ö¨ÏâPÓ˜¢ MWΨñ%D¼Ä̃&Ư³ç¦&Át[ü"̉F³®éđ,–n <’œôI)KÆ%]ûÚº•ĐAtßïæ®Û£=̀!“@öOÚn½úœ¹ÿ<}€NÅIºô¥´SñgÑ"*]{¥¥VGm¹ƠVm₫Cˆ̃Ÿ}Œ‘F«m×=Ơ´ƠmÉæ6QĐr}Y^¬{Ÿ×hæ1/xàâN(*µWU½äË5_¡¿ØÚÆÑ©§Ùáw4Ÿ5Ă6бØ'Ê7–6(‚·f+ ¹.ÈOóï?~_₫™Ạ̈ˆ ËKq̣iNó“µärY/ª̣d-*'ü^Êœö<N¹Œn3 Ù#“uSS%>äˆî^júY$F7ú™7©z\«jPơ¨Gï}Οr)°¯¡1¯Îá›\‚Ă&̃=ZŲÆ,«dsFØh–Y©…"‰ơu™A₫é$÷7\^!M+©,e‰"c{»¾q ¸s஘»|º{½È±J ‡!Đ B–ưŸØ…̀‡Œ£Çk²K×úi¼W;埲G#£zÂ=Ă¾Ǽ /‹Ẻ“s:!M'A¥‹H‘¢ªXfE º³P›f ÊDøVå [x à0ơqÛoúØmù ‹Ç âcæ#Đ?G³e»Ë$‰Áȶ:³̉v+å]‰>5ˆèIzµ”Tnï·ßÔßpˆu$/ÇÙ7I Í́º’ø¡Ÿ~*M4Ëÿ₫<ÛÖÔrŒÀ6Åg§»r‘P(·v «¸¢è_\KÍ¢yçŒé£ØdgĐ6ÑIJÁ‰ëÊs‰· Óe]ơ€`˜2Øû×Kø+.¶¸êØÊgJ'~đnR7yÏ¢Û½—ÑFWh€\);¬}/ë>£42U,êÈa?Vp´–Ủ;̀ˆ“aẹ́õIæp…¤‘­€€Ư¡á* Rl’ôŒĐ€’œ^¤£U¿s./Ï8»­̃¿ŒƯÙÍ/Aˆ’$µÑŒóóÀ{ :ƒË¢×SMÅ9$hIQD.ï…½́` 7+‹©¹Ô'4³…2ërG·cïưË3ú™T<µ̃ƒØLàfhM¡Àbrv ¢àÈ#S$ÜÅư œiàª^R;ú›»@,>h‡̣?¼êV°̉I€₫Q´Ÿêœø ê½Í=÷·öÚso£µÔjªh,²´Ñ»Ư´µÔZmÜT-Xä‰₫ăƯÄ_vëCNƯ¿_j|½As¢_Tyi¾j¶¸QOÉ¢6¬]“J—Sæ²[º¹nÍ 2‹:”X46œ«,àÚRƒ1ø Ó€₫Í+\R)„ñ·—v±íxsG{05ö³xµ½J}ÿư{ư¾ßåŸünÃhéǺÂÉ€Bˆ­Ä ];--7BLxÜ»uzOàDßêV{5›ßñX‹%‡^̣å²\®ù "Ù!Oeoè<́I—Ë¥÷^[ -"}êŸ,V£„UÂÀM8:eBî ÍÏÏÑ¥‰ç8₫!îfI¥üWvèAÄoÂÓ€ø'÷ŸR’tY/?üđCI¥½·¾¦ơ²\.ËÅ̉èóÈú̀÷»Áè‰+ú6îw¡‘•_âA.R¦ÉiN>ö)%g7›ÍA›…ZR4ÂT”N÷z†oØli»́¨¢Ú§CZE]8uM€¢p™àø!ëg%đ$ŸcngŒá́›ÏÀr¯LưŸ¤>úÇ"’|?¯$”đ¿ûx¹^Çï~ÿ;qèoåV¶ÊÓKJ[¼–“PÔÍ’̉[{kZKyhZ4x́YÔF,DÿsFáÔÙK₫̉†ËÙÑÿ}¿ïmû¬ÿ4<¡ÿ²b!T@̀ŸÅă•BcLï£x.Ió=ù›/~j*sq¥xÊ£ăqŒ4đNçêƠÙúc{ÁÊă0Û˜>˜$ íhÄ¿ñAƒZWaf–3音&ºAÿé™9'äΤé³íÎ#ØÙ™6K£rèoẹ̀ZMŸ·Ă¯IÇRVëTkíw?ưnïû±ê¦#J&‚ôQ ¸Q4ƒD<hƒƠ^jIåz¹^—«téµ[ Pèmbå—T̀Bp.`´ØizǬӈûƠÓT Å§€æ¤s1’&€¨`Ÿ?ëÆ¬¦5MØƯ**i$(’'Ç<έ¬‰¯â鬟D"ö›ç°éOf—˜ÄfẤq…Ÿiß(5lc^aø£é¦ú0¨ç•@̀×̀ÿ÷—DMùÓ·墵ĐĐáÊ%¾ÅáµMÈö™ß'Hć̣áâfGØvÔ}/ê'˾¦'e´_ó¿ZXç…ăº½ÁÉ »"̃kV¶‰’9YÑ/µÆuhư‰Hë ÄY:{ăhB‹§ö ¥̀®µ¾\^̀5·›.èѼhde@ß~,²hÖ¯I´¸{­½â¬¯©–T¬à1Ñ¢E²ôÑ—´à|ÁPaD>‰́±n±£¶̃ZjG?J-̣XĐ?Ú¦.(4xăC?QÑR G£=lÍëKA("º"T—Œ>̀É~=œ̣èc(V-ÈüCûû££ ¿Ë.ó$G“uy î}?U^_^ÿô—º¦µîµm Y₫VeÇî|ŸK6”1ç M½ÍÜêð&Íï‚æÈ÷ăw.tC)'-Ú¤¡!e¹́PŸ{'˜x₫toâØ³:NA &`³íô]ríơăƒs¾€₫UuÉKîYºèPX{!Sù“'ưo妦Á‚?zÆ_±#e…)|¢@ÅiW|BÇ`´ vjë“÷—0û₫ûï¿ûôƯç/Ÿ₫ùg^GđïŸr~̣‰i }`›fĐDÅ?¼¹Àưø}&s’/§¨xÊ÷´I[>[„ø8…\v®™ÓÈ‚ˆÔÇăxÜö˜ ÿÑơÛZđ“„|¼Çµ¬×|öß´DbÅÆÜƯœ̉£Éoî¾wŸŸ[ÛÍ£Ûa&™>ăŒü¬ó®?ç~²&ëư›;­´\ü YT´–Á1'×§‡̉Q̃ă>±˜É~Q® R™¬?û¬vÔ­ưO>%‚u6"0zºÈ­·üqoû¶oÔ. {˜TÑ¿sµ=‘lâ₫t² ‹X¤zṆ̃ñåă‡ë‡c;ư·;vØ%ằÂĂ%*EÊQ¤ Y2œ–Ó‰UAD{‚Ô8”o·”ˆLŒÎŒÚĐR…YÄÁ\ÛsSzÔ¾€’B—LÎXfäËÄÄ_½Te¼{|ñ_ơÓ7Q/t ÿéëÏ–€o\«§Ô‘°~,GX;7Ơ.SNë-ºk†$AH@‰ØM&Ù?&ú÷€E₫ü·ç çéq&èO₫™ß-6¼ûxÁ°2R©–₫Ù¶¶íw¡×—×eY}{ëc2MĂm ö̀Ư÷€‹ö«JЧí#×g¡%ÇîD£ûP—1U—¤°̀Đk+ Ÿ¯cEó–´ä‘­Y-)–÷¸\îéG¾i ‹Ư¤H ũ;ñ h]U”§Fđ{”đưٮǥƒÎ*yr\̀\ÏxôbC` #ÈCºXeq%U­e”2J̉„Zß XÑ6:tJo½]úåZ¯¯ë« «íØnơ¶Ơí^ïÖèB5¶d)¢‡”c|½hÅó-nQ«é¨ËôøÅN¬¨ä”K/8ẁ…́ÂoLÎNG¢|çÚê–·Gz¬yEÀÄíåÅi:úØå=²{ÛĐùḥYÓr‚TiÏû^w«RF3/¢k¹±DQoC}¸Ÿ{g™¸É0v=ês@lMr}6¬Ăå;ưÑ ¾—rù°~øáăÿæÓ¿Yʲoûưæs¾’º‘_¡²‚ˆŸé"³wéáYkβ~†ú›6É¥ø‡+tưkÓ~xưp·ºƠi@̣ˆäùÚ‹TÑ5nPyä–Z’4µÚîăô(Ÿpœ$âÆÁˆïÙ4@Ë%nq«ç MµW;úÄ6úáƒ0Âd́ÙVfÖ:¹.ÎY¤5̀à‹UåÎ́Trùtưôéç<̣#=¶ÛVRù:ÎѨt™Øxz^ƠÜƠQ÷‚ùTûˆI)&ô¶Tÿ#)j®¤Ó2ơ*Ơ$đpT›NNÆo₫á7?₫ăˆX¶¼ Ñ1¡?"– ư£ñ:È™j‚ơ–3£(ÙS̀ææ(yÖî÷Äÿœ%̣¢Ky2¯!À‘Ï '́;[ƯÇă^ï·ă†ÀŸúOjŸ0¸»”ÊW₫\̣å’-MŒ®_«-yëÉåÿƯ¦Ô}`@¤á5XZ#¾Œ;¸!1g9÷s@q}щ ¦9ƒ3–O§4åXá2È4}–ßî;·!Ùư@^– ö¿ˆNC§–E°ÿfÉqåI¡T±ÿ:Ă²Hv³­“Ï„RÇ1(AǼk§%ä}ù™‡öơıxƒ8AE§\íØ#:Ü œæĂYÚùăs$§ÆZ$½HÙ¯Lêm4ú,h̉«AÊNè_'’VWl> Äa_NÄï3 fX^ŃUg›ïËËË’–Ṽ=”³”ü!₫3ªŸøóo0â;×A¼¤!“'ôÀ@ØC=¿ĂÓƒ 2s,:2Ëp¯ AHKç¤Ø0iØà£Û7ù|±ăÄL!FÀæû3³ëcjBÑÂÏ |H2ÀkØEè“ï盕Ö[́Ùîl+8Ú?Z¿BL#̣Øï··÷û;Êéù,Çm-)BBG7è“îV;ö¯"Ă”²7ơDɉˆ&MU+·`kº=nø¡¨gxbÖ^×¼"_²å¶¦µơ¶èbQ¡Ăó%áI€ÂfœØ̃8 #V³ˆµ—¤ƒwZ>é­6æI=,âOØ đ9b̉ƒ?Ø  ¸Eăâó‡₫đĂ>~Ø÷ư?ưƯbÀ´ÄP–`Ă‹i´Ö’¦:jÖ¥Ÿ‘©àÁ]Z‚Y"̣¿ö+D/ơ…=vpm]ê…̃ü‚Ǫ°̣SI¥”ú£>Đ¢YƒŃ₫‚S®%+Úh{ÛM¼ÍËg2u‘Äs1Æ€C`«Û×Gy\ÊårØ)-×5­K±³¬œ]äîĂ₫º¢ơ7(aơ?÷ITÔ2°°¯ưh̉đ~Œ>ḥ<LĂ£aÀ”,V¤\ NåÿmúЇ )™1”+ܽ˜Ÿ Yó<ê KM'hñD÷ #kܳưñ4§3ÆöÇ¿™Đœ¿“XĐÓ©5ê^8rê úéq™&¥ü@ñˆ­H”1tû*«5¯K[tW½ÊuY—El¢Ë%›Œl-ë%]8 +Ï’#9OVo¬ÏØhVôÎŒÉO£®iîŒ4ƒ²{4P oâS®3êí±ñưÿîú‹”Ó?₫ö7ó·ó”ï‹nr±2×[̣ÙpëZ̀Qd檳Ø2?Qơ> Ÿû6A¤¬æX If‚?Ơ@ÿ·ăv?î÷ư¾×ƯÖOü<Ơ,̣4ú·ăùb圆ig85S½û¢l×ơỴaIhKv™Ë8îÚÖ¸?éfçQd;ÜSëâ‹:9»~'ơB=ªøắ;{ÿæH!î)ÎųÑ2eTÇŒù#ºûå\‹T;;y•„ƒ¥©:Ov„HƒơŒ-¹¤œ¤Jz_ü=®ØLËq^m¡\ˆ€0€µ(6 UZmûc—.1xNJñḉ&âÏÑ17ªó8=ÙS¯½ZH‹Z×—kÊé±? {®Ă‹¿ÆÖ”1D*ñYXu#̃¨œÊë4)úđ7¹ä%/@d„§379îøàÏOœ?}¾âÚs?Dƒ„úù~ơ~ídÁÄ“U†-¡2 ‡1ÙóỢÇf÷/xaóp̃¤fœ?ëºY:Ÿ]‰à#IÊ%«è8œc‚""´w¸T-ÑĂ.W—~}¹~üđ±ơíËÓ6AH:úøùËÏ÷ư¾=6;ŒÎqRóWâ™PÍmVzyÙ©̀ÆSe|p+Ơ^¹‰á!:ôPƠÔí?‘`†;Ój’dé}ô–GÜ@´¦µ§̃´uí]{é.L|Z'x1}*pÅæ̃Ó©ùÆË>æßˆçDqơÎåJ}O6“QRÇf48YØëĐc?nï·Ú*•`hîͲ3,ü¥]Ơ¤½ơ6 ™­·–(NÉ9A„SJYûz­×½î®}XẪ£>X <êĂj€jyA6WôÛ~ñË_üú׿^Ëúóï₫éÇŸîûưèÇ’–̉m–0ÅÆ¸ ˆ ]̉¨̣í!]º&›È6l(ĐÖ¶µ®kZAö]—ë%].å‚¿̉Û”Qîê™M6§o„î°U\pØ„+ÍZ´\åº÷Ưºư ö‰›0)Æ2ÊKyÑ>•)=Àdx¯ëëëåơu}]óº,‹ưóœÉ1ă²rfú]>‚æÇ&«{A?G½†á—É퓸Ö¦¤-zr.îŸdùû°ĐŸîb₫t`pâR#₫‘ë~yî)(êC†(Ø/]SMữSJ‹./Ë˪ëRLú ‘Ó‘g%œàơ}́ÄÍÍH̀Æ0cˆºY*̣A+́ȓʲ‡'©\ÿ¡3’ÂÅ?¡2˜Çü QS4{tÀ¿K´q°-`ĉ+¾jIEñÏ1¹-]ûÁ í„z6‚ y R†tünó«äÿÁÚB$‰̃úHØ…) Ê%£±^{Í’í' ÖÄC:È•Æ>̀iAJ§JÀ„q²½tiG£ kFœÅ ûuO‚“>I‚™« dœÜ‘S†è\‡~øđár¹|₫̣yßv¾`,ñR?–‘<\mµ¸Ä|6ĐÛüCXTÎÜ›ÎXùÜG‡ض¦®½÷Ÿß~Öw&8×U û÷WBȹçyë₫›ÅŒº¨‰…Ǥ-z̉f™6làw(c¥ o4W³Æh©µ́9ỏ›´UW¬Ơ.½ô¶‹è|rgaỳÇä́*‘ᢠϘ¸'2[ÕÓÀzÆNfÛÆ`«¿fˆøû˜]Íî•@Đf³{{ỵ̈åËlù0,F::âĐû&Ư¾ [:f«µÔJ*u˜.ă¬cŸN¿¥/­´K¿í8Ú±Ûk}Åù Ó¦çg l[ƯLZÍ0Ɖ÷ÁÇÇÿôOÿôơơ5/ù·¿ûí½̃-M$S+¥†@îÉC†$™bé"₫Z5]·âơ["‡Úê–¶¥.K^.ơb=ÿ|¹–«q˜Ôä&.X\l›8|¸ ̃âïÈÑ_Æ¥†€!ÏÔ¨ë ÁAÁtÙQ®åÜ28¡X Äk²¯Ëơăåăw—ï^××Ër)¹”R ¸À̉ă ÊÖç„₫N‹NôßC˜à8É "â·¾D´…ÙUANpÊ_oÓXk«uÅ9¬l}âù9QqÁ+ÛÄ$̉¶&­K?ú´MµOÙ8u™ê8eư:E>H¤&e"@”­ó Wñ±l£ §8ÿq̣ơÎ@úV©·}yB IKà1PSQ1É6vđÙ̀q9‡ª̃·±/o_ăÀÎ9 å'oIPÿS²?-Î̃§‹kbw¢œz!褧vÈ‘!ŸƯỤ̀.GôGÔÏV7J!ú"ûŸˆªĐ'/2\ùĂn`>+Èc‡\FèOJƯ‹VƒE‡Dm%ÀÆ5`ÜĐ£°aV,₫‡'ôÏïy’¬|ëĂP°&Æu½J}Ôz̀EÈŒƯ§uêè<ÿ‡gd¢GO¥§ 9ín´ÿZgÏ­;¥ö!”•̉,3ÄOÊ1siK.µơ–4 –3˜c{<‡ge¦ ß=V0wL­jrO!₫ ÷ÿ0~/}$‡Ôi>&§`ä%/cŒ­¿ŒÔæËzYÊ‚÷e Ú€á÷S$4=˹_Lëåh÷Y³ÓøûƠç÷ǽ4'‰g¹̀êwXưÆ×ÉE!¾áéP¦Æ¢…³a1ѹ=eÁF’̃Ú&Câ35ÛƯضÍS^Rß{ÉîĹN6 ™<ƒ3ß‹¿K WØn½cV^4º̉ă ±JÀÁèS«:Ñ¡&Ơ¦¼°¬X°Mƒ8£;NMă4t”¥tíMt±§RÍí#©ŒÀU„IäD$”XsÉ“¬fÙmAÊå-s[Ă]-_^í5iJ=Y iJ)µdnË‘Ї`wóÆ;$£=ơE{ ¥/º˜+ÀG»PD0¹Œ°í Âå4É0°<Ơ½Ăï²Sa”3đÖ̀ĂB§p ¹oÇ.´‡+œøÁ("ó÷p§ºvéM[NB)lh-µ–ŒÂ¸#ɳărÎyä1Æ̉—ÖÚe¹í@^Đv„ƒø¸á÷-›"hË ²°ê=Ơ¿ưío_^^~ơ«_Ưïw£x=3T}”E—2 ­ºŒdFJ ¨Åe;NT2`KẤE8J+[Û–drîK¹ üƒ•˜Ă:¿héŒn#xÿˆz몺è².ëwëwh́}Ô‡ơ¬üÜŸr  µdä{¹.×gĐzúë²¾.¯/ëËËúr-××Ë«‰ª‘樑>$ß–Ÿ"a)GêëD‡€‹¶ø÷÷Ñ{óx¦̃v€”~Óvhû°T0ÛÖbHŒị̂Óo&üơơùW«Lå¶k¹°Z8Û « @Ÿd0ĐÿLôGuè$ÎÙjÙ>Hílb¼₫ÉÚë”*k’ÂƠ¥«ñ´â".JØÜ^‡Œ”ÓÇv¼½½£‡ÄFs­ÿåÿû/vüî÷¿³oâ$“åö¸É$y`+9Q·£I9rüt8ùè+Ü/ªƒ8Ä÷Iög{MǤ„‘œ}‰‚øßíQ·ăö8lÊo„₫s²¯ÏIà"ÀPU¤ß¢ˆ[l– ø¢Æ<đè`î#*~—í̃ùia©ØJ [Ẳ%3q̣ΤâÇÓîùỤ‰†Äúçâ´®¹±b“%cĐ笽Èú»N âNlÓ¨|ø£i”$Θ.…0üœó“@%¼Ÿyàú]₫PàÇÅ MU[oP˜uh́ƯÇ#œÔø[úèßèÉsuS̀OSM8,¹₫GMM‡ÇÖVŘ@!¼È̉¥—T́¥P¦q{»Ưo÷mÛrʤ9ăxïy—ƒ£ñ´‡ŒSÁŃ]wàæ̃Ñ`dƠÁ=?£µvŒƒF:n±`pºÅñEª+ÅôKë¢]óoÜé:NîIeyyÚ]ư₫wΈOºpƯj °Å`Å*°Ä—‘fIwâÅùzX€èU1̉EA¦¨g½ó" ÷gÓ·ÖŒ̀ú*7VHŸ)^²Úêï₫ưívë½oÛ&€+3Û†¡Jça]yä8€XqqZOă$eë@\Ư fƯ&‹Á3ÖSê)÷Œá²m´CÜsƠ/¡ĐÅnÆ-è´i‹ ]*Z†Œ¢Ë;KFÁF´GB˜Ûnw>8m4dÅÊSÎÚ{Ih†VUŒ-A 0Å¥:›Æḷ̃1·F >ÿ üĐ&÷qîÙ‰ ©ơfVÉ̃X´̃rÎĐ%µ¸jÖđ&å-yéËR—K»́ë~9./ÇËV7Ư Ú‹ë‚̉WDäË—/ù—ù×ư×Çq<¼<<:̉9bkZ! ¢Q uI‹ˆ-=ơ–­'Àđ+F›9¼7îè£#<Êœ„åÈÅÀ6ÔƒÈQÙr/e³Ù$Ă5Àܨè4Ø$饼¼êk]*[Ûj«̀ ‹4“€vR®Ë•p_“Á)X{¯åúº¾Bå‰?¶NVO Đ„ø}R₫‘ơ·&¡ûkô’<[ádÅ\W`[ùĐ“›atÍ8Ø9—¥³¨—;Åœˆ)¦Ä*ZÄg ˆÎ2¡óó$ñ7 àhhhXσ,1Ïk₫WËóI+)ˆĂÀCfGTz“é”.*­6à~êû£¢zN¥…o‰D)¹r’!½´Ÿ’L“(pa1™3\̀e]~ơ«_=Ç~́ïw₫ô9A¬·ûcmu?ö’J¤¯Xa2Ä‰× oü©øI X ¥n[e*₫a.…éUÄLѹΗµ*̀X9G?ơ±×ưvÜlfá±Á/₫Lù·“xƯö}'fĐ‌uƯ%]¬¶ñî7ĐXÔ æÄnˆU…cØ̉fÔUÓç0éü¯¼hßøpHaǧGỳØÊä½”túzÑÇ·ÇM†<öô<± )…ơ'dưÛ‚>æN+“)ÂE›î#†zé¬ çMV˜ 0”¯v/¤§”¨ÿ‘Ó…Ÿô<yơf§ñüI[kÉ~‘₫OíÊâ™Ï)_0£å‡Œ2ÊH>Z2Û'*ÚzëƠø”œ²úôÁö>‰$J&×₫|Eƒ¡öë¥5æßư:¡KI¬K€̃×I/¡§ÛwFó³vu˜˜4-˲”e?ö̃<„Ô*IđDÖƒh¶¼ö³Àü”âRrôé&MUªIt’‘øb‹ zk*pN‹JCa@gT”‹@ơ`†$‰P^Ä&¿Jp?ơć:wè´× îIư–êfÖÛ]¶mÛöm¿TTâª`7ó:ÇÈÆûw³ç¯áë )¨`5iëMªE1?'X§`h†ç³÷neÀ˜¦g¼¤ÖÛ31‡T@P ¨̃¬èd’5Vï‰HŸ[hO3AÆltÆeÀ‘u¶;̃©§Â•̀1x™¹ºº÷üƯÖX #bhẴq+9ñú|åÍ] ߯H<Új¯eó ¤‚+0fÇJÖ,9÷œSn½-}Y˺/û^÷k½>êă±ÏAœøưQ[̃ÀïuŸåZk­ß\¢D’5Uˆ”Úh(Đ °a‹)aœ°ˆ´Ồù=ZD›c±je1ô[S=ô@ªé–¶G{@úa\°KŒ¯L' ĂÙæ2Ó>#ƒŸ§Cëí’/4L×V›´$‰æÏ.½\ÖḲ̀Ä’M®đ²¾|¼|üpùđzy…r”V³₫ m«›®ŸA¬Œ sèưÔáIàĂøÎ]ÍÆ₫>Áå³Êɲ=¨üÛ„₫“ơÉÑåG/­úTMàƯÙӮ„ünÿQ#ÂÆ¾À‘<ĂÛb=óJÖm »ñ›̀æ‹¢\»•ăGÁkUàCÆÄúÑà3Uœ¢<\’„1̀}ôc“ø‹ú1+LBl¤bÅÚ^_®R$—|r„€̃}Ûûèi¤œ35và5ó¤S²YÈ©XøËN'SØgñŸ˜ßoɲ\–ËR–̃:£l]%{*âTÉÎ×`ö¾a\ùvl÷ưé¡¡ÿvư®­b_k ""B3ÈÀưSöÓ¡ÍÇ\ü1e|LæÁî ̣&Œß$’£ñlÀ7TuÚ¯»æá<ªĐÂÏØâécù…sbRæ~lÏ̉ rÿ̃÷Û>›'qR2ƠÿcÖ¦û—A›øWá–7÷È4f w!eB(Ô₫ÖÇ©³ô‡=£Â.Ál*I<€«~v“́̉ÿcbµÓ/™í¯Y„¡Ôèq’CTÿsꢉ4CÀ£Ú*_We”O‰@’OeíU†”TÄÇ_œ‚¦zb:@N=.˜a÷,"†È‹§f€5ªU™hik2¬ë¦¿}D$É·?»ŸR*¥ÔVc7‰(J9̀!%¬.6Ü,}̉Ñ?ÅôƹêTD̀R$¼ßøkv³¥ƒÂ×%*7|‚ơpÁÏ̀Nœ°x?ç,j&B£ló­‚3?ü«…Œ1zë|©\äD“OÈ[xR„RÇöG'xØ=8™®K×d->jÏâ}?Ưt~7ö?û>aĐ>æ>–S)E«Ú[Kb!ưhKjª©…ÿơÄ̀Œ>¦›l•dzs›:ÛYØ£‹Ûe(™÷¬íĂđ€¤ö F¿¯·MÄ•iôúÛ2§vz®É©<¯œ/~W5ÿÆlù5çP„7?Ê´Ó— 3¶À˜z4@̃81Q€¡Od€*Y%PJYÛº·ưR/×zƯ–m«Ûëúz¯÷×ư½z4öº›:¨î’N6á«̃,4(à X̉²ôeÉKӶ䥌“4-²ố•Cv.Lô°j9¶M¬hΓ4ùØû¾§ư‘kZ¯ưúº¾₫âă/T´µVjY¥#G¢PCà¡Ql:äüO>»ưdMÚs·0½´ư2X—W.ËEUK./Ë˧ë§ï_¿ÿị̂ƯºX́̀º¬Æ?ÁAWáO|¯ś+Ü̉v!†9êHÜÆ«IQ,ơưÜ”ç0)×ùDĐÿô{4¼Æ==úzí•̀aa´_̀³̀j,Ä(û1̀ỪȈ§Îĸjæúƒ̣'⟲Ÿ0vÉ ư§m1Îọ́hĐíœï V5$©³kÉâD<ûáº\K)½÷ÑK¢áÙ´)ÉfUúôÖ¸ÈZoo·7d÷R\Ä.prßË!ñ°ÿ¤ah´K¿,Ư?D<%ŸÓÁ3›—‚â“Dcº—ợry)¹́Û>?¬ZĂàđ¦-#J1ü>p<|¢ü}n_”èœÔ cPÇe)F©`̉3å³'ërâW³sôÆé VÇâî^Éx¢…]GUáó÷>•À(sÑ”LO”à•eùé©qÈíuöå<̃ËŸĐS<ר³ Ê‚ÎÁ.¹Úû:ƯÄ2Ử¡ßÅÿ4ÎÊødƒ’T&¸¡ ˆœ®r°(™ô #̣ÁXºüWBm­ÇÿO.ÀU₫³Zó;KCNd—ON(l1ø1dk ›˜ÄnY·¥ Ååç>ÀücÄu¡ ˜­6…DdHYJÉ—¯¤–4iWÍÆßåaB ¬¹öZµfÍ-•´zÍ+œ‰œ‘t#Y[´pO¶ÙXcLñ}¡4Ẫ‚•?‚UÀ¶î¡Q+2¿ :½B X>̀ö“‚x’Œg,²ÎG5}x=±¿ ‹Ê₫œ_ Ó Üê2T=ơ”°¯º÷/¥”{î¹—^j©k[/˱¡/ÇËc}¼î¯÷z=^Ñ 0PºÛÉv Éøè>î³ơ†)ÂG:–¾,iÁ‹Ä9úWfÈh)x/]A€4‘+áRĂmŸî‘̉Ê’–Cơuưóÿơß½ÿô›Ÿ~û›ß^̣e+`6 0‘ ….hÚÓƒ.Èε>Tô¯Z4i2“úè©«hùơw¿~]_¿»~÷²¼\– t>@ÿÀj§î¶¯‡÷.}îF4bÓ¬GƯĂ †Lö÷«ÜëÄiÉç¤Ơ€_ˆ7ÂÅ%åÏ.yÄIuWú›Ö½8E Ô#q‰ÇçÁ*T·$F†’x×p¿èe½\–K’Ô–5/º Ơ‡Í₫n_w›î%V>êZÿÝHßị§@½O!ÊY•®œHªƒu$p†¨,yÁé7tPƠE0ÁfSQ3}»ß₫æoÿfß÷Ûă†BH\ôBJ̀¸~ồưDJO4êymˆ®¥°FÑ¿gz–TPb唥2Úm¡ÄÇ̉°EÑÿ̃öÇñØÚÙˆ “mÁTưôéèŸûH̉´”£­Gó±fº?'YîÚ•âÔ=¿ƠGbqIÛ¹›<‘vLÁ1BŸf»ÖÑ0:Ñ ÿ)ÈR*`9„kسbï˜×ÿä¥`—b{C5Ưù£Å<5æe1Ô‚̀0)‚bŒ¡)¥²”œóq¦H„ÇTïÈàÀøơ7Ä¿ä₫ÆŸ{ÚèØ₫Ö)Ă5VËIÙy1©ĐơpÖQO¸̣íï¾ø—ô®Øç.èN^!Jf„N–̀~t¼h€®YÄ5–â„q¡Ÿo'́œlÖ°Âh3X(èdß½hÁ‰°bË>À¯á>ÿ›·ñFËç€ç ÉèØw’÷₫|FPÅWôfƒPü½̀çÑ™é¸Zdn¹/3dz áåú"CZµÁ´L‡€ ÄM.×K)e?öí±©‹à †đ́!B_̣ß$ ŸØ%ôl">sçŒBđèóà›ÏƯüôŸßdî*.gç­œöD©Y1•IØY“„FS¬ >1_ım[_, ƒäæđ«`úŸaŸ$M¹ç]ÖàCH â¢6̀b"GW7“́y±jMl Ư5PHs7̣i§±z–ñđƠ|^O=+iYC̣qă³?_•“8VáÈè½çœK/½÷œrË. J}zö\§0íÙ¿—å².ë¥^.ËååxyÔÇẹ̈z¯÷û~Çïs̉pƯ(₫f+/Øô£•^jª5Ơ:ê¢VX¨ ä‹.¸³ôĐ™̀µWD̃‘¢â9‹ë„——qŒ[½=ú#eƯdû¼}ö€5{% ™û'AÚL¥3îiĐI5æÁ.ZJ)–˜°¹·½üů₫â²\^××™âϸÉó́èî© ùưÈü“̃ûRܧ4̀Ä.}…̃ó BæmÙÿ—±í’$¹‘Q@ƠÜ#2+«È"ÙœÙ̃Ù³{æÿÿ›{öÛ½}úÍæ£Xùˆw3UÜ æQ́ æ zEFº›©éC ,Íïă^‰ÿÚVůÜ4\Ï“*om–tx)5!´^w̉t]¸ô™Ó¨Á̀ÇëÇ×›n»îà₫Aó»à§…µ/2/ä÷[a»ü4 É»´ {L6å…¹Mä\|…%䪨FU·mQïë¼)ư[±M€‚v=£Ë8‘1‰6x·Âñ$›ËÂ}Rå\c²Æ"¿¢í­kSWE÷B”¶vi—.µ×R*́i<1¯yÀZ"·=e?^D>κÿ¥ }·?püÛ¶±¦çd9Jˆ…´D ;矲“+ÜU•µ(¼‹bJ£¦Óütg²nêÔ©®+mGf+-µh•øO´¨iÖOŸöÍœ$’†¿µ$îi)²\Âî¥;´´0ưVûôéÓo~û›mÛ₫úó_ÿô§?Ö{-”DmS)™ ¢i†ÅS"₫e°ZrNG¤V¿-ăi’*=̣jÉ,SRđĂ®ÎT®‹€È|‘B âLV…88‹€¤ñ¤vy‹[Îô4Ư¼ê±[÷(±D)®åzLf½¼¨ƒ•(A3f‰98iÈQ8±¡vŒb´Ù2ók¬UqfœP±à£NF̀{RH夙Ï{Ô[îjß*Ơ›©ñ){ÉÎüܪ¾°rÚô­‹È}¿û¢WGM›L¯ Æ9Iµ]¶§§§)¥L[ù<³Y ™c¤&(ÈèG'Ẃ*œÀ¶Ú¹úÀZ¢ºw¾ôK’¬R(.Ÿ~ÀĂæ₫•LØéqȹúư¯GĐiä÷}'_ÀD(E8"̃;ŒACG³6tÀăcX[èÔi9£3¼ío/×” đÖÇñÇɃíñ˜ÇÔ™mô`€™ B€Iw|’y´cʼw +²±êäAöê>ïß̃¾ưÛÿm“₫óן¿̃¿^¶ËmÜÜ8d\áå4Ư”åÓLCofkûŒK₫ÈÆövÑËS{Ú₫₫7¯ª[ß’L̉u<µ$ÏfÎ̀›xüóUU7Ù@±W©‰Ăy±$î·9mº'*z™X¡¹§[ƒÏ‘̃¨&ÄX°—aV½–đJªÆÀ¥ih́¥©I ˜ä:&}–®ê¶µíCÿđ¡¸´‹‰]ô‚– fơȤwêhyhñ±¥¥E– 4#"Ǻ₫@¥(3‰Z1đÀºI©èü8@˜¥ˆ‚"CvE¬Ø­›äÈÄN&|ÔË»« 9gȪ£À®Ư¢áù‰ø÷à¡;ưÏBö€Ä„dYJù„í¨4;í>ïÇĐÿíxÛƯơ]lV…₫¾cÔ¡HUÙ| ₫hX^°–½²ÎĹx…ÉZ]f²ås*±9½Ç@‚#Ƙ€åC?W¢ 9²œâMHË'RyâʧJ0N3;Eeú”ûW‘€“ñ¿×(Ô`@̣üáùǼ>_§Í?₫éTP0 È Î8&$0”]à·:¢@+ ¦L­q73)®‚ˆ_üÔ¤ĐÑư¯¢đ׋¯́Ç£Y*}kN EĂ–àÿ‚’T°ÄöÙ•ÊÑn°%A €”x&!Θcè ß9÷2=j±`™ÄåüOâ•ÔhˆëÜ#5~²ô9ÍÏ_₫z|¦)&©É„XyP8h°u™(ÿ̉5#c@‡MvđÅm²`à|§…ö8³Y›mŸ»ª3ÔäL•.]TÚl[ÛIJÀ7sSe=̣³X¤ëú˜'B/Ä(gŸmJ)},›9¡êú8jđ‘w‘œ¡¤PU÷û‹)Íă ưk~àñó¹Ô@]KEÇéj[zv}釆•#&¸Ơ&mèéj̉éVÊl©HD°~ß-ø…ˆ‰fº ™©á!vë̉¤[g̉ă‘MÀÈ0qQÆ1‹Å—°jM™Y}49KâÏ,]ª*Ơ8qO"Kؼ˜.ûÊó¨='ˆÖ}@B5ç3C=Æ@Ú¬Q½<Úđ|×Öà#D빌Uµi7?v¯Ûơ~ܯÇơẹ́ô¼?ă(ÿ°x½¼¾íoøî­ÄĐ̀gûô8đq™á””̣[Û®v=ÚÚN†"´‰6,×vk±YŒX(Tá\E6àåíåŸÿơŸ›è~Û߷Ͷ»̃ïÛƯÑ¿<µ§§ù䦥qFÔT¼s^‘u$©©†M“óÑû!||₫˜ù’ư$aæL§Ya?#^ă ¼h‡Ÿ+½@}‘öº˜ưBJQ™ÂDüÑÚÀYÿ0ü©‰~|¥wÉ¡ V:Ơt̀ˆÛd.fÚåÏ.Z4$9³₫–@Đă©=]ízµëår¹nÎư3  €Œ ­R—²RƯ¬b̀Æ"î‡ %U₫ÅdI"¸·¢å +ÆF ưé}ÆeƠb#P—ß.5ƒ"y×(«ơö^Ew›–³HôB.}úN8ƒGEYéA?%Ñ¢–.iÚJ\DT’b¬€ÔÄ-„ÛmwéÿÛ₫æ9¥9üHhêè¿ö÷-"ܯs­X¸ ‹S âFÂ퇉ηtp*’6̣ˆ4„vSy§V$–{X=Æ₫ÛZ»^¯jz»û¬ë±QºêđÊ— WËEic ipk YO¬?j¤ø¢–ÿb£<³Èqp|₫̣ùúçë÷ßỵ̈öBæ†s²¨€óH¸›Å“NˆËŸ^SơT#VÓ÷R<7˜TI]xñIJbơÿáw¦Èè±XÙF-›ê·¬jÇsÍÉü[ç,[©NÊ@¼Àá ăzÂ8º̣@±”a™c‚OôdTVă‡w¡¿¯‚–xâôk„€ơ_ƠKª¯3¤±hx²ÊÄ…²U†ïæu›mÚl­Ù4T 7mè²́wÚ*Myê,ù¥ĐèÔû~ÿùóÏ€ăIO™ÖƯ…ßû́À…/o/0¿ÑüỌ̈x₫Ÿ(|µ¬cª0ư@i CDg)Aö5+{ FÅNKέÄ̉föôôôư÷ß·Ö₫øÇ?:H5R_KXêñÊOI‰sú®\!cøº+̣d4±)!ŸJVû@d/vôi¦¶¹iëƯµ@];Ïk “C®)üpÈ€ô‚Ô~O«ÉSƒë¨›ï¾‚ô¶R%́Åkm€…•Öy•đLBº†\ŸŒ̀Dùă¶H½FªPB<ŒwuÍvkD=¹¶Ó¬±³ez™«ÀUL-oͰ'àL•ÛGUµƯö±Wºs¢«‹ă»¹÷÷e»<§§ËÓÓ₫ô¼?ß®·ûơÁÎûơx}Û̃\´{SáSƒ_NcÉq̀côÑg?æáÆñçÚ¯pWsBS|@P<@· ‘ ÑD­Á€́Ç₫—¿üs­Ó;îí~i—˸Üûư6n. BB@.·ùøƒh®[²Ô©yD`»\\2A´‘ẦFà~›ăY˜;¦Izùû‘†äNÚ· ŸW¨¾¢9¢¢ÔûBùÏc?v/ÓÑ?¾Å÷hwɬÏKI¤±̉——;aơÄSƠ„œ́t̉¼¨4=…¯?|]—ỹÓí±?±ö×íÿ»Ÿë5ÁÂŒ FLXêܳŒS½ÓBB§ï§ë¹èEl4?Ú₫Á‡½Û¦ÖSå11ƨE-JÿGkơt<%£_³œ”1ÊÔ¼̃BÂŦ#’;N ŸP !ZO!5ˆRpú‘PæØÍçØ}Üoûí>ï·Ư-ÿ¡tµzÄZ,^¬lc}´Úx8XÿÚƯ)ÑC€§¤ÿ‹s+M¥\qdCÈ”cø'صëA˜TͲ,¸6W³Ø”ùéÓ§ßưöwó˜ÿúÏÿ*,i-oÉËëB́UHA™Áé€÷™iµâvj+ơjKîYÔEüGéËëËüá?₫ø§?îûÎf́}ë×í:æ@' ư›“7̉¸ÏÔH S7–ñ?  rW%©DjE<3è–Ụ™^g¬‚ ƯTƠ¹9µOˆúŸ”₫Wú_z«¥ó%đU)¸z §=”×b˜}ú½7“.:•QúœnRœÜ Ó躷$,(QÍŸ³QúIâ€ôd¥•A“=Û§ºâ]Í?ɤVe‰ PBÅ…º(BjđÂB”j¨XTĐ‚5ê₫¡ÿ‘I–c;u¶Ù˜ó¹T¹j;ÆÓ ˜¢LË$!{—₫¶¿ícDz—èV£”¼}-æ^Ï,‰€`¸j/"óç‰9ÎÓ÷U rB̃ ºZoÏ/×ËŸỵ̈çă8NDµĂ S¯Í­a˜³́ª!J̃r 2pOA§%R*ˆ0=¥ M)X¥¸KZS¸ƒN÷ióQƯT% ;üxå•«¯A.LÄcKÂ*ôHÔeQÉàÁ++¢‰r0›gPT đ¸í§ñ‡Ăíp´æ!,aT@å1ư{)ªÉÎÖ*üÓ´̀~1i‚́4öíÖÚ1­oÇ<ö}§Qx­zẾz[ß¶±u½«·à¼<¿íoP!9pÛo·Ë Éÿû¸#Aưn6GÀ}Ü—#!Đ££cÀ½ơ‹]¼‰XĐijͫ^ư° M,SÖ‹†Eaä;p¨¥CFÛïó~ŸwHlºmÑa1"@ƒÔ•¨Kd='PJŸ68µKơRÜ< E¬Æ#êß§¨`ư.æÖÓÓÓ¶m2åí₫FƒáÊĂ9œ ˜U<¡Íåï̃Ç×RåÂÏb¼ǺùE/°]‡Ä6‰am,ơ¦3âí0háOE²×}ÎC"Å–µËñY0ơ¿´¬ô=±₫ôô ¤w÷ÖŒàŒ»ÁÙ´¤¨3%"~ăYƯ öZÈư}!¹üfÉŸó#ZZèX°¼Áî,è¿è†=›Ü$¦Q5îE€JôÇAíù°€VëÎ3ªi/>‰é€® @  tOJ!„ú/r”cPÂ#Œ ¿ö±£ôOIÆ32Ă韔*¯‡ĐŸºíå¤)'=.iá, Đ‹CUç=‡¥O'|s:̀dư ßMzëO—'ëÑO×Q̃²Jlºb¤·ú~z̀ÎqºÄÙ̀"½¦¢´Rá:]èöG¶>xú¯Ÿø]+•²Ä Ú—…£ùqç‰}úy© >ѧI%”+¬¢& H)k¾àï’ud\Œ€(‡ơùY:C $ÅW±Ü&³öơ©ñđc©·èÚ­YŸ3PGèy?8ƒc|5]̀LYƒqÊNxc„ Ñáø4'ÜŸÛH<ÓåÖâŸC‡3æ¸ïw2Y~mH#‡ƠAÖçŧÔ$@¬ă"}|o4I¡…–nÓ~µQJË`•j=Æ!¼}zù»aèlp ±èƠEÖœpœïc!øÔ^ŸÀ¾ƯŸ¬Lơ“/aË́SL±lBá̉ܺF¢tÁAâøT¨dƒ0Ä¥̉–ÇW^£*$˜(3¥•ˆ„œ}$»K%¡¨ÔláÊÚă/“7ÇĐCụ̣̀ek0Ù́áfÑ‚̣eG:̉ ‚-8j®ưú4®Ûơụ̀ü|î§â×À‡×4:ÁdklÙ™Ù6X̣»éh~é—ac3g‡¤ {#CZ6§}¶̃(:Èú¨(¨v-«¹(¼‰àæym×}́×vƯzv"*&ÁêDÉ4 {º́&fSD>^?n>ÅgiàE¸?§Ú`‚VyΉÈǯ—ëă¾ßY­âA¬:Çè?îèù́=€BD7%®|ׂKåy×₫)írâ?î¼̣Á ØáéI‰‹[²̀WBq^ºùëÓÈÿäí“]<µW¯t CO3lËEÅÔ3-ŒI|Ô±QI—CÎO‡hE‰‹çá‹°©[û÷&*½÷ë/Ôp›_•«¡Be¥öCB€ÚàJE¢vgÀ¶ú‰iq0Å₫'Jg÷gd4ư¢’?ơF”ĂR¶qøàx¾÷­&"¥›˜,/¤œ Ø̃« pD[›å ·â®Ô¼œmdYz<¤2á ²ûñơ åg0ª²Iṇ̃ @Ȩlsë­_çở/÷q¿öëư¸£Tàm{»¼½Ư3x:¼Jø¸Spº0{3r˜72ÛÚvØqi—Ă£âP1yl¸Ïc¾ÑĐeÚ”&×ç+ú¥̃÷»óÎÙfŒ¤%Ë/aT0à2/{ß/z}l}»È…U¯0_!Êân‰xơ©?m̃wzPí1iv2 HZ-âZZÊ””Y>fUâ~s%@xÿÄư c‰ÏØY-¸ä JăÈè{Ñ úæ,Úë–Z&¤*×°Û>,̀ƯYpéEđ>KoÎZÎË̃^|½@í¥4]Í”è?+mnÛ†.tÇá¾F̀‘ƒiù$È* ‰̉̀ÿÙ\îßzeâø"'Sî—4Ù?×A'Í?$ ¯ĐÿîÇß}ÿư÷/__₫pûƒD[´́¹->©vá‰)a.Đ¾ ₫„AaTÅt‚”ôÓ)Î1›‹₫÷¹ßö¤ÿˆ|¾ä₫¹̀Rư_4{I·.m‘·OÅ4 ¡+“JâŸ68̃Ăn~"NGÜ(—=.^œ‘–™ª^¶ Ư'*רM?ÿüùÛço’…¡˜çÓZ÷P¡]y0WÖ Ÿµ]¶>@¶‡À†áâÓÖ3ˆÿ}®å¿¥yÅ>÷%J±ÈѤB X!€}ØEDF‰?Ù¦§Ú€̀C>”P+iá,Äüû)P±Nåû+đâ)₫áWÿ”₫«ËƲ`é¡OvNûØÙjå₫y O‹·,@ZÏ™éđ•çQüT„¹¯IVYZ'¼ơøzá‰gí”ͤCeN²È®¬zâÚËüÏ»m€«H‰%Ư/?®î?5×TŸ œĐ)µ̀R«¢YG¡­;XÙÄgë-T‰q%h2_k•)¦†€>"¥óMwo®Ûñ<@!%ªtTƯ,²²6ÈĐ=£¸i¸+Ï «S±*çö*>•Î>œÂÀ‚¥ö}ß÷=ùΠع¦øYuœƯ®4Æ#umѸ#eÀJe9¾hVÇ?™)UƯjyIÔÉđ­\ûê&‹–´– ¤WÂ@UƯß›¤D²k„‚’₫ÈŒĂ”Œ‚“|^¾ WGÍ!” B’₫?¯œuƒ+'u¦U5V¡/M[È©ewây%kÎr¿ÊºÆ>¦[YxÓ€9zënÚ¤q̀ºûq¦Ư“WªÅÇæÀ¸̃ûÓöôt<=oÏL y€Ûqƒí$Ơ×Udf(W;æûÜÁ9¬€iO-ØmÚ6ÛL]ü£M¿ûđƯ>ö7}Ó©̃.ºd’ÙQ^‡¸[ ² ‡ÛÜvÛ/z¹Ïûu†_P»lmC.åd£”Ü+8…Ư6;å9ø“ûw%ŒEÿóơœ[vg³×·×·ûÛĂû§Ẓ@Z ûñÇ_Ϭw2wAÆăLíMß₫Ûï₫Û¯ơḳÇ?ü‘>? €•>[瑟&ë6*Fa3/°†̃=@º¨0“À*̃…ø§Ê vE»̃úu»Â×”yÑÙKT><=??ưöơơözjăũSê>ÎgÈ̃A#ƒ¶¦]›Y à“IcG¶e|NG-ËO­Øơ”:ØX¡´;.ăẹ́dĂ’§ ?Đ38XwFç¦ ÜæO•a@ËƯ&UL „Ăi.C€¾=m²Énûí¾¢ÿc¯5¾Ùµjơ¶̣°1I4Æ&9Áụ́w!‘ƒ'YÑÿ\\­8J›kp•‡Í´ºñá[± —"Ïâ‚Z‹§ÿĐÍƯLMlŒQ«±ßQá—›¶§ç§óăư¸Ă”“}új{¯“èŸñÿ, ́ü|)ó{}=&Iä {­‡ïÓ¥5È7)Ê~‹&ƒTÇrçIº±rïƠ9]%2ï¤çÙí$1}Ø”UÂ"ĂÈS·à¹ÚÎç«,S¢lï!M)¡vü$̉ÔLÍ¿P„«*¶&mÈà!—8†ëq’×£ưUÂ’#ă']€Ú+ƒu¦’d9nâ“f9ÓZÀb`©¥Æă´5-ß5Ys̃éä\‰‘Oä:{yZóúÀëÄ»L®&#“Ó•- 9öƠ‚`ë‚joN Q>áW…’'˜‰/Üpÿ´©M½hx6aÄÄùXMˆ›ë®Îjà%RZg†¿ñIRÖx€;÷=¦̣<1£\Ç¢Đ¥&XÊ %ªËäÉóóó§ï¾ăxùö2lx£®5ÀVøˉŒ “Ü‚<ư½rC¦6dˆ¹Éf̉f†úI Ê–Xœ'~NcUTöƒ–ÎĐ1̀9VuAø°•‰bƠK„L]úaÇ>v₫Î S5O ˆ‡¤;ùGJÏ,-½Ă3!™̃yü2”F0÷ëD¥/¤̃;n”̃å̃«M›‡¾¤ê¶¹y/¦ă’aÀåí¶ß̃¶·çĂ+œ•îL]›@sÚ¸YÂl´6÷¹_Û9o`Û¥]àû́Æ€’… }vD¿£—tëĂgƠ?D-̣´G; Ÿ¹·;li.ưrÑË¥_6q^IÂ*“sÀÄäíØ3>ịƒ}uæ6÷8]2OnÜÇí@Àq¤ä¯aºû>÷”ûEÀ­´±7_hÛu»₫öÇß₫₫·¿÷ñí§o:Ơ->yˆ6§µ€¯Ï×1‡7|±Ô%ƒë­å­Rj€¨9Á%µï ?´₫H 6¨¥ŸMÛơz½n×9çƯî5 §Ù¢„Ÿ¦sºuMo­7O¿È0¾¯©êDÀ*ú€̣„]ëß ”m#È¥I!§ÓƯ)N‚¢cæN`‘œ“©˜Üßî_æ×ÛÛí*W0NüÇö'Ô€Ñ Q¬sfQNäe­ăâÑ~/{‚Dá£ï›-v²HS¦¾ óØq|úø½nrè±Ù‘æ»÷ă8RófÿÇ8˜À˜¨èw¾ĂßB¬YƯH©Ê Cƒµ ‘ß'xÊj“ƠêÉÇüơ½ơÿüÏÿœÇ̀a/eO™{ @ăØQ?w¢¨+Uéèß̉ÇÍ5©'Å…¥©e=¢¦Li‚úÑûq¶äcMÿ»²ŸZTûNÓë‡^ñṆ̃_™ưBKGï3AU€Nvöàï/·¶‚W_†]ÎƠ`ëÿ¤ ÷,¢,ưOª²é×BíÓ:«~Y0À(zyîñ§Eƒv†Á₫ß+×£«SªÀKư_<„°̣2€¤¡ FnØÊÓ ª^Mư}ïrsV4?øM&üé—:àÇù@L#!´«S´’Äf+Ĩä1[ƾ—LX>¨¾዆¥zÀ:Qè₫™đ¨Æ ê¿æ´·•(@¾9ÜÈ‹å’Á3~³i]»«¼Ôà<™V<¤DJËÀƯ#7Í"c¯øÄ”±ˆa´¡…‚†×»®ßß₫ªQư#¢ĐDΛ5äÈ-âƯæUS”6—->̃đr½üøÛ_Ïc¾½½÷õ Nœ0\bóôùasåè~à‰‹IXR»[¼>8‰†új[ôu¸|ŸTkÖzï¢rÈ“Ầœsœ‹-)Mms@xúàơ©S‡12¾ûôƯÓ‡§ûqÿĂŸ₫Àº¸x¶úÚWo¥¬.ßṂÂ|Ëm²™€ÛOÅƠ öc%ƒ°vB¦6‘Œôr C´ê[ÛúÏÖ[kV ©U´văéÖƯ•qÛÜ6t{º×ûvÚnÇíÚ¯Ïă½€năÆ–S® °1æÉçK–Ä?tAư¸Øe3·“ÚÚfæfAµasŸb̉¥?·çT§·È)ÑáZ¬>> 5‘‡IÓèUºÛ¾Ùv̀ăj×K»\́rí×MB #Q‡YÈ‹ ]{‰û“ơ|è.¡Ñ¬ÑÁÍô;V©Ö?Jzö#=×Iù»Ö?¼}Ü´¸‘ƠgsëÛÓöô¼=?÷ç½íÏÛ3 î s₫´b¢›¶­Í1ÇîE–N=Rá]9u:|…×ú¬äû(äwB âM…átÙ—üs»,U$ôg̀s»ƯDív»±Ü9¯°PŒƯư”Ùµ ÿ»‹₫=̣Fÿøû׃s²}5ù©©óå, ˆ¡E¡X™‰ÛËíöơ&Sº„=må™ÎT +O¢û ÂñH€•¾%˜qÄF/ºë Ï3°cíi»Í9oo·yD’f5B¥¬x8±b«:©ñ÷fK»ă˜´èníW?üêÿù¿ÿŸmÛ>ÿơóÛô‚ ̣¦$oĐú»Me&Khà©êSÚ¢©$ÀÊtÍiIS?öʵ(ùÍâÚ̉ØÂÛpù}Èxª,K¾Ÿ“}ăy&¯‚~³…´>sùÜ+°|obà÷¶đ,aiè!E; ÷>VhuÎóî\Đb^:m"A ƒï,Û Z Lc²ªó]p<Ï7¨¡‘’Å₫ïAÎô`̀áÄ́h¢‰˜ˆÿ's&|èÑ`>¾¢ô8{\%”ô.RÏ?ŸÈˆ9̀yR̉'ưزB5«&üUë½?ø f¸c™Ñđù‡–DŒ*§£‘¨4™c H‚e*Àç[é ˜{©véX§>™§d„Ïx FÅêkÇ‚‡œ?Q´ǽØ\"̣Á{ịV å̉ßưđëßüúvÜ~úËO÷yÇÚ®„¦”äœËăñ5#°’·4·Éi©Å»yŸf^OvÍà…3Ø<)jmι X÷â4ÍlØơzƯú&*·ûí¶ß=v́!pí×ûæå¶§Û~»Âv6g›ṭñ@hΩs¨w₫̃Û~µë̃ök»"Epíסck‚>»5û@˜.R' CXEAÂ0LKê)P¥ÿ[»í×~¥@h³íjWÖÍ‚ÂäÙửáFƒ¶²´üôµ¬ëµRƯëùư±øx’́?£ÿ±SDf< xM/€ïÛ×Û_ç_m¬~( I>X|)™2lÜçưvܲ…VÜm5÷$åÏÏM­?_·+́ü«Ö?¡L̃ĩ"$Yö¢^8b'öóÏ? ¨¨ˆ‡D9æûú‘ž5†Îúă˜ÇVKyLµøœsy3̉/¤¸™ÆO’ă Á.w£®½Í–ưcß÷[àF\ µ”¸ÔÖß'è¿8IF5•Ü"jdzFăˆ}́Sæëíe·Ëí~;Ʊ;Đª{ËV¨JÔt%4Ô>O—'m³Ưí̃{OOÆ0#jT ²\.ɤđ^û•0¿¹&8Ưï?}ÿ?ÿ¯ÿëéúôÿ₫₫ßûíÎÆ˜OäR. ÇÜtKÛ+$>HºYÖl »R˜8«>]ÆEĐæ`î´–'ê%w!̣©TI}ÊúYæë¶À:s¯ +wOwØl,üaÚÀˆz< oQ[ß\ÓăܰvæuÎ0ÎçÔÂ’%øˆ́ëÖ7VR_·+&×ú×ʼ¢¾]JÔE¥èˆS&ô[EÂä&1‰ubä}ií_QrƠm¥b çÿ‰¡Ü¡åë̉§L”³ZW¢µ+̃vÓÍß_óđMVkåѰ1ópăZunv¥.O²ưb—&m«sÂhIÁ:kJüỀƒ pŸmƠ\ưà€₫ùÇPÖ3)rưÆđ!ú/\û„7ˆ•=+æÚXczêĂ×#₫J†ÓÆüôâÁ‰oQJ€“‰'sk–)Q‹NŸ¤@äQg¼r8Ûpb™Ùl~|V<—ÿt‹OäAf“‘¥ü·:ÿ,r –Ïî„₫›æ¡Hh%́¹^ ©üW_ œLÑÆ› t₫Ñ Đ)¡é7‚Ó/0'‡ +ƒ"ƠØGTqxÛæÖjĐÁă³À8™ªb• ÿ>Û•øŸ¾¢usXè̉pSÊùV8…¤0F5h 7ÓG²"ª˜9^Ü<Ür y $½<ÍÇ [>=kÓg$½Q%©Llà'́6 ÚL[ÅgƠA¨}ʈŭT{àEô™9:¸s‚ÂÄäYœˆK•ÑixOáÉơÇÁÏè.â…H\X(”U«Û‚†ÿFŒƯ u·`}$K p§®Ñ́w»c IÖ “¡KÉwIqÇö»Ô0 T_t1<5–SƠ~øáùÇ/_>¿¾¾B’éuÅ‘EêY.lƒ©zÜ®ªºˆ‰ËTLÛl‡:Ư,Ă>tđqø̃K@¥ ¿ûø*6E¥_úÜç1 Öï–‡/²L>Ú%–¢̣bđxY‹¿›y†áơíơ¼Ç1$$½÷̃:đÚlÛ¶ó8Ú±í2\tï÷k»>]̃ö7¤<@»’\:jm@̉¾s•Ht'ă/v26Ư†xû0¤Væ»?nië›÷Ơ*’›4Û‰"  ă “́¼ÏÅïe-:¬n6Isro¤óåo‹ÁöñƠ³Ă©z¬r:Rp’×ăi9à¦.<ê§§Í J°₫]e½ ºG Xÿú§ñ?ưF¹ÁYQøä‹rmR@g*Åè€Đ_£“4@Mïú8XRUΣ=,{/üƠü„‡\{ú{ߢå+X¹Î₫ëŸlF{Y±ÊÖo‡e4›ĂQ·(”J™̣ơzí½ßï÷cpx4úöbw;jŒ{₫ºÄ7ÁÎ5U²̀:fQX<ÆÎ7Ÿˆÿ"%—b₫ơ˜îĂØ¦Ăcé$שּׂûCƠÿ¬ú~g ́8ư₫$É9“̃ƒŸÂ¿z?˜‹₫‡¿ă¬đôµĂ+gf, Öø@Èq40ÈP;àẢ¤êCRôȃ.µ«A^­à3JƯ(Ö¼PĐE›‚VhèaÄ–•KŒÅ+´a¢́UªB1#¢Ó‚O1Å-”6Óđ&û¾{-,Œ€Zôxª™.¶*—zl†¹Û‡¥ăéK4“ŒÆó,‹8!=ÅOrÿSăçˆ< Ạ̊?¹0Ë­L9æŒFa€3#! s;&¸ D1†‹² æsätF|đ!,Ÿy›ànm…E J'îƠ>Ie·±̣R`‹¾ Í/ÏăB7÷ŒxÀƒö ù¡…Z"âgΣ‘µIƯÁüQ/6ó,eÎÖ–ï}ñ#xÀö’Óÿ›!nÑÀ»ê1s.x7ÎryfèʪbB,'ØÚ·˜Ñ́¼¶¾}üđa¿ßOüN£j–"´P×0kđ̀£Đ°ă"s M:dà‚0±K»P>4æÀ¤bà3ÓlèhÚ~ÿß½\__^_¾½ôk‡R׆¹‚Ă­óœQ2Ù‚%ÏÍYB ₫ÂsơÚ¼‡6”e’däaJo₫9gkmèáKƠ÷µ_ÙG̀€ưvÛnl`…b‡²˜ˆd_pgmIÛÓº…^ÚeÈØÄ[ÙúC/§€_%̉˜–Nwu† ¿Í£ÊJ½̣!ÀIo}c1®…*Œ]Jü䜼₫~́÷y'ßï<+ÄÍ÷OöÙV’Α !8ÆÚ‰ù^ú6·Y䆕₫¼ûív³’%8…L ø]̀ø¶É)ÄÂñchº@Ö’EQ§ á`^F…J!\0ÉMѦ¾ûđƯÇï†?₫åĂÆ±Çá-OZxæª;X``=5­7—FƯä]₫nÓÄßQgïQç•ãÚ¥óN± ¸´Ë6¼<–AOưéíxÛ·DïLJ¾Ÿ‰ê¤˜™¡< rgđöcÿ¥Í¶}îOư e»›mÖ ̉ Úơ …¤S%@\–|‘a€ wW·åy*†H [ßP‰X5ôÖUÄEUCß”_bq™¹ÀTơûT÷;́̃÷‹{qÂ&’„&‹̣’â1;lÚ˜CBœ*á/¹©÷_`ÇÖêăÉz_f.ư‚ Êư±]>j(¬T$1…·¥M₫™á 9'—12ă\™KÅó£¿KBäÂú'8^±Ú›"°üœÅÔÿ”XÔhOÜç[§¥àG¢̀×OË2¾ô+ï®‘Ñ Ô¯ ” µ»§ø/Ùßâ₫- =pÓ_Ư~̀¬–1¤ô0ØèŒO ’óñ &Ơ\‚²NK´´+£ˆ̃ë—°²~Ơ<@MËà¯zï|pĐ”_Úå‡ï~xêOcmdÀ©Àû‚•7w -s7§Ă˜̉[üzt#ªÆd₫-SpSæåé̉¬ƯÇ} W1(r.$jar¿”?Zq₫ñ +â½̀̀e0¦¥”nẢ_Ë ½É©‚i+˜ÆÚ¶m×ëơ²]=T°ïϸQk1FË‚́¥Û—d¨Iƒ¦ÊQ%÷¨đôŒ*ú¯z-®—ºY™lĐº~̃KH½ĂNcềeËô2{°Ô.—ËÓÓÓÓóÓqưù¯pèSà’b´eb³́¸^9÷9E¤–“$q›å.ä̉nf4̀}Rl=læ­·Ëå""¨çă_é©(Ys OºÛĐ>e¯52÷®ÿQÈ4ÿÄp,ÈyôO Çlî¿éưP²R̉ fi·b±ÓV&K’< Vj@ßm@9|M;ŸQ1µđWIđ̃çN"‡ ¢=ßRnuÏ<=Äúss̃¥¡4£8§ Ö®ù"h ™‰†±½Eµ«DØ,́ƯÚ¶m­µ··7)Û»gQb̀Pq9¸ßÆ\ ü™ẬŒ»3±¯_¿̃n·1çṛÆơ(ÛqˆW‰à`uơ©ù•ÓŒ –%œ{œÀl‡}ö&í;Û123§}CArú矾Ưo_¿}}}{=æÍcIŸ}´Ñ­C¦‚HóÙ!w­æ̀AđaœNˆà±zNÔÄ`Ù‡́b•lµÖö}GdN<ăàˆ–vlm»·û¥]öm¿×ûq¿—ưدưºưÖ½]€ÛéÄÁWáŸ{öG4x´#q¼Íisk›‰Á h¶9e¼SaóĂ¾9à±dæ̉ú†« ¶Ơ;æjfèØîÇƯ¢±ÙBùẲ'$=,ê=ø̉è#j̀¿̃:KxƯS?)¾®e¾Û¶¡<Àá—ÄF9ưVy‘¬ăœc½Å÷: ±O°Kù{¹’\Ú…åȤWµÊày†ñkJ²UcSú÷'÷¬¡ù‰µQC/íj‘Ái†ª_íéôïËĐÿ1±2d™&¿íJâUÀ÷ª¯óT#1‰ăpú ˆ1́È-dÉ–DGÀ<~Ê"¶JsOIMâ¿Đ^—2æ3ĐưÏ9½àd‘ơ`µƠA@OÏMÇÇù±]WÖû–“YT¥QØë†Ê2đ68.₫™‹Ạ̀‘-¬gEüåœĂh÷­?==©éư~gÙëåúûßư₫ụ̀ü×?ươ₫rú¯avdÚÔâ«àj•èráuPñQ¤n’–ĂÈxR9‡5Û.›Ê›Đ̀xÿœàEÁO)ú)å1bËÔTD›0lp§*¡p1„IvV̀ÀÛ/)(.?ă~»ć{¶Æ¬ˆ¡$/\ĐÙJ`¦©ÎZDÿQ®p¡æI·F]̣ä₫ó'Ó¬Rqơ‚Ù}EBÓ́=¹‚²uûyÄĂƯ)đ|­ë ́8¹IzÚ]‡sÿi‹'O ̣¬üÉévüH+Ï‘­” T`e¹[ÈKæêÄ;MÂú“ôF›ëpiÂÖ%'ÀX"’œ½ŒÄ-AE…G8ªA 7ƒ^Y‚àœÑ*qN²Ô«I¨?}M6]E™4ĐÚ•|ÍkØÙ¾¢dÍêzQVÀ×Ȥ‰˜×6àx=PÖÓÓxËN€61e.¤ƠCFU§̀k¿~÷ñ»m»Ç~{»Ñ́̉¾•ó¥ÎjÍ|U!¨'Hf>P̉ ơ–³FL¹ºO’6̃2#›æ6¬á¾U ˆhi‘A,C ‡-S%qYà>WÙùx¦ˆ«6̀ØƠXTàÉư¢c¼7®æ±ø…æW₫̣̣r¿ß{ëăÈF…X&ÏRđà÷¯EöĂx€Àñ]íV=×kB€ĐÙ·ßæ/jd¥T`WXË*¦˜ˆ¼Dµ¥đÏ?´y÷èT}˜ pM¹½Ưn·Û ˵œÛe+ Âc‚QYRđăw(hÍ[}—åœ_¬NÑ+̃€Z Œ.Ö(7GFå~¿cP̉™X»ZK(>“Ô'ä YVâ:[ ›NuVÏĺtÇêg³E#-Jƒ’ȼ¬ñưAzs¯ H¼‰R96DôS­ñà‚Y ¼pºD>5%e!†Á?n½q©âḷ?¨¬Ñ ÏcÊe4.erˆÈ‡₫Ïÿù₫êû_ÿơçŸ₫å_₫ơøú•ĂB„­zV¹ÔÙ &IwT…VeÔ,„Ë‹̣¥!‹µ0œđè}ºnĽ,Yû‡]S˜‘h©d¨è?…|Œ[(X’hÎ’­JÇPƠÍ[£^ËvÓr ”<˜Â80 Đ¢ø'gWl>.²W¥0Àè±à,̀&* ḯ½///¤quD·rQ¶a£ÏTkO›Ư:|ư¡·(FªzùÖA[)ËÀ÷™xѬơÖY*€1¯GÖÊp§M&l7*á¶]Úeïûe\®ưzï÷ëvƯÇ ûqï³O›£e`˜× T2è`œ›³©ÙVl6ï;v‘ ¶ˆÍ6‡ –0•…O4ÇÚ̉= Äºô›6¶—ûKZ§Ïă8û¼ÓÑrvó…Í"í,3fHu7zzB̉SµS[ßPk»mÛµ]Ó]ÇûWùÉÇC=EÆñ9æH  -‡{ó·ôơ§æ'•?%ဟú#rđ3<‹Ümµ2„¿ưO«¿>Œ®,ê•yJIMЇŒ¾Æ^¸7jÛy¨'ÚO->^0J^(öèÉ}„(ÁX!¸_Euf‡§eM’s§P±u…Ծ嵦Miđï»đ»Đ_ó„“Æú€‡‡̉‚¶©ö¡ë|å₫«î?®j¡¸JÚ¡¢)JëzP%0^¿)s_hµ(yÑØYà{₫bÁ.(±9o·”?́AѬƯ^n²© CWǪñcc%¢=p‘‘OÎC¹ĐÉ4’¢ú5å}₫̣yظ·ÿ̀ă˜GF|:ë#3`ù·Âɶ<†¦ ĂO¬|±r•}¦“µ́Qï\{¨Ú|k†ÍŸNâÓüI1O}z)jü¯ZÉDº2¯Üy=\)}fNÂq!ÖJ I)*5Ṽ$xÇÓÜc6€G#¸¢%_„ß ¬)–ë>IĂ×X—ÉÎO‚•ú¤ˆđÏÔ-÷üÅ~ :QÑ́«áËéO’ùœ ‚ÛÆÁÅ¥q^›«l=—Oñ­Ké›Év`ê—JÓ¤Sê₫Pk$’í«e A£@„]÷ ¼3ƠêàVC㵸Z:{€j„”’Û&W «'ư ›pÚ÷Öư˜©>)¡ F ·2ÔcÎă8ú†LµáOÁ‰…× ¢¡)9 ‘̉ŒÂ+R¢q’6Ẹ̀e…¤dˆWhf‡~~E県ä£Î»i»ï÷1\ïÁss|™GyŸưư÷@Î̀ü+6ƠÉ”5HEÄS£>»üÌ󆋣²̉*6j‚7ƯX¤ªè6Å €oí°C£`!óÙ2] &€+ïm8;{oñ]{o₫½uÔơrH½0²Đf§¼ò ‡EáÈÿˆÄh´hpáØÛQa¿Í ½&ÓWù€IDAT„AĂ,è2.ûpE‘¬È$@1dw’~NQ9äè­Ëp85 …Œ‹^Llȸ´‹¹l0+Ñ«dÔ·>€O ªG¶¦m¨­ưO¶¯÷¯̃¢è8è퓟Ăíq°Æ¹Â SBïf/­ ù¯í Ä`ë̳ùk}r~Å6½®bµ÷±đ±h¶d²vömÚPfàPŒG+ô_߇Ä"`tR’U~0×f^¥‹½Jăª„AEî?ubơÙ×ÎRŸJAå÷™(-†#%rZœßR²½yˆ1 ²Eëof2#¨`q‘-.Çv¥:Qás}zúî»ï®×1ÆËËË~́~Ëk‚¨E(?•XÊƠÜơ’°Ơ1@ÍN,ôóÊƯæ3"‰_3ó£K´›¸¿ưñgƯüØ÷±Óiô¿øª"×2 Ç1n·º÷m²uí›ló˜üĂ¯íz½gáïêú/"è2!@0ˆå’œ3¡:ÍtA<‹¤mºå‘ïq2§Íc÷ ÊQ ±ÀÇ_¡ØfH\g"¿®0„NX‹[t9«ªgReVºDM·âñƒ‚66F L,±₫!>Ÿ-Ï öYĐÿnS6ɨ W û{å°$û³UBéÓǘ-ÉË1„w„D†DV¤•€²ü§gê°IƯüQÙ]ˆqÑô$$XÏú>ZkMë.ƒ¬äƒ47̀ɳ́ á¸åsR眲x\ wZ<\ Å¢nz³ú“åB¾¢æÊêèr<_<2gưÑ»E½3 ¿»vïn•BàbË›¿ûÈ$Üù*4HÈ™à ù¤¹V:íu¨̣íu½_ÍÚ%ÔAIr¡‰O'de@‰â“™>ÓÜ‚Tï÷ÛO?ÿÔzụ̂ùË£âÎâ¢xa­ôïóbåc#§]‹q¬ụ̈—j’†RN5ñ̀(ñ.y5Eñ€F b¿óø3ẩR¥] °cwăÓoÊzâ×X1'| ZMÖơè d[#\‰57{B1€‡³pú?æÑ¤È?́h³vhSô à~5£-©N™£.½[‰¬7m›mfæ&WÍ i\†X€ÅÁmÑâË)+J§È³éÉ{£ÄđÂt}S,^¯Æ…ơ¾í̉.—q¹ûÑ}îp ºû̃v”°i€ ›ƒW‡3"Ød7¡$û̃¦›ß²y7w7˜êƯú”Ù­ƯBƠ%FVŒg¸n_ß¾úlŸDï¤ ̉DÄ¢m¬î¥ÊÿÚ¯  àÇâ´^a<́=o2“Gÿâ$%R7 ’t~¨‰¨û¯¾₫$@qÔzeL¹ 3<Y@Æ÷o´ø,î(~,UÁO9ºè™ dg#áö£n°i›}7‘²&ËÁ)Aöû°Ô¬ m™ å.:géáCw àøIVèÏiÀ_H†Ç|“%¬jªª×ëơW¿úƠ÷Ÿ>½¼½ ¦ÜÀ ÿ•\•Ơv ´¨b÷YBÿBÀgË9YNtçä-{©bêJó‘S©{+E' ¬r31ô„̃}ŒÁx:Ç̣v[)PcÎ9î£÷~Ơ«ç¤Ë!?ưé§‹^.zA±;{qC}‰€™fñ´éCr)s‹lAZÛ®Ù„QvöƯ2$˜é…z:®̣¨fƯN¨‡¥äR"9=PK~3ÜmÅd–'k¤„cÀCĂæ̃);¬Mg¬§s,~&YĂ0:†3KÓú:<翦s€̉Ö³´øÍ\Mˆø“z~S¥Ê™Pc6¾¼»péñR¢’·ʽ¸®Ê‘Kdѽ§É½D‡HDœ§l8û́ø·.³ÔĂđÚ̉}̣¡à4íßưÊt+̉P`3gdMÍ-öP| ‚׳̀q_]kê/ÔQư¥ek!aZyƯ #ŪaºjÍ0\€È&Ög—&6̀-̉a¢AêköĐÍâ~n™6Éä¤IVÊ-–3«„C-æWâ.YđˆœçËc"i¯Á477aQ 7Uôc“í£›—=ø„ĐYgbÎM‘ûư₫—¿üåöv»ßî·û c"¥o„3)óÉ3ÎeëbUgsNi^-Í’e/ 0±fHÏÖP„/œ ¡©nü·́5ËD\̣Ät>¯?ÄäöA¡́ª)2)TÇ!\ô@Ú2#!¡äæ³Ơnµ‘Ơ¦—í"Mö}cp³Ê},¦.]$̣ÅÄFÚ® Ü'éă ¤ Ẹ¨ hÖĐI€oHÉozkh\Ơ­#ØlẶq¦̉ hÑĂ0#/5l©Êư¹©´uuV5w êƠAid^˜µÖFØÛ́D°·ư2/×ăzo÷ÿ6\„N^-JVÎxeÿˆ0 ¤›¬5¾:§x1Sk3MêÁ1I”¡{3̣P©0?êeôyø|ûN‡)ÙÍ ï‰C k.“…êæđ¢J&|›Ç½\p…ÇéÀeÖ,«EM¹ c†¹%hÜ—oÍCß:¥ù€v¯Ư ".ô°N*gs€Œ§· ÆTo3(Oăd@.T¸^Eʆ)¸,»tPñ· qö&ÛQÇÙ‚½ß†g$Ü‘l¥Ø_^_î·;“H ă  êê!ÿak(`B€ç)̃‡ï¥³y}°M·i¼;Nœ̃:³̃e³¹]c°…e«º,‡ƯÔÙFDÍo.O–²=b“Ÿs¶̃p…Ç¡p—üq ˜aaß­{$0‡#ÉP‘ØíÖ%âLàÔ6°±^± ư¸ưçxz¢q!¨+V¶¯·¯ ègTư¢I8º´Ö¼ˆVú[ÚzVOO$`¿S=ơk*1ÄtS—1‚Y$èŒÄ"4Đ@ó5ö¢0Ư²ÛW¿Đ ”¬Öz‡`‘Ç ₫£JNư µO5]:)x6iüP§gÁ4V`ˆf4Mă]çä~Tú‰TP7}ÿ®£«WÙÑ,Ílé5]€…Ÿ¸Mµ4æu],&^ëùœL*:82]Ë„{l²ïûç/Ÿ1^ß^à`¡7đ‘)X9•?°ư‘Aú%+µùKĂç*®ëVTtjmzà#ÇU†₫¤ 5Ñ>åSƠ/?Ù„8"gè¼+Åú€r/Ơ Ơ0°mk[ÛDd"²éß¡¿xç/¢ÀBxëRMr“=eE¯Í¨3)Y&“ÔápẠ́m#"¼À€X^{dÎt¼ë R+ư/lh-™y“̉o{^æ¢yÙ<æy'YM”,’h‹2̣g¹è„9ô/ >ƒ©ÿÖ̉æ"¾ê;2S×̣V(`”DH₫ˆyLÛZ¥JŸÿ&ÜĂù(+®¨_€Rh ôé3ÓIs¶;¡)’ÿ5À »\.­µûư~ÇiZ«’jÔ=gëÉcá©áPDºÊ@ó툳½V3WÉ{Vz¼ /—T†:ÇŸ—ÚÎQ Y‰³¡¤{ÇQÜ[÷Ù ºƯ”–ư{~ÑgóɦR“®)ˆp ’5 iđ#œ;GiAƯE62æ%Œ5Áël‘c›n‚O1aa˜xV%&Ị̈ÅÚR ÿ‰q)*8¥Nª0‰Ñö@‘­£bƠóµˆXKv¯ÎÓ½Ôœñ€)Ÿu× €:…Ïß=L7;ౠŨ¥6€âŸ fỔ%™›£pƒUQƠç§ç¾ơ···oí[̣;«Ù›̃øP̀l²œ¥…ˆF=O“6æPU¨wyÀlJHƒP= i{†êTQ äQËê¯à•=¶o ·¨åSg·öAˆ4|kB(Ï8‡{xq́ 2À©ùæĐWè…HE6 RÇư˜Ă³óô?Æq—}FW¢ Q°K‰ê¦eºÏ‘Cb½4₫+¦N8‡bëëÚEÄu†ê59Xf̃’Ü ;ßEûܾ̃¿Boă>¦á]“€sº»ngk[ïX??ÛuëÿUjD.ÑJI´cÚ„çRă;[+ ̣¢¼˜™Tđ'¬Àw§2_²nï*à p >ܹ̀\uÀ†¾©=•5Eö#ô&·¬´÷›{kªMÖ€uÚ1Dá)UWfrđ;u]É_Æ:sn&¶c|MQÇq®¤_uºÜó‹Çú±Ñă€ô¿­̉Ư$4„,³ dM¤H,²]9VM1®Ï‹g”T/¸¨€¢76&~vŒ̉‚ k‘ÇĂ;<¢ÿeܾZk¿ÿưïû›ßí÷û?₫ă?ʦ­ư·¾ÉæÜ¿ºă',kköÓƠhùa¡™NÈX⮌!ëE•´!¸„'ó’lHÎÿñÜyƒwÀ-̀6º]ˉ€HYËZ;q%k ÈÅ_̃Å̃Bû`–1wáz!µD–!_ñ€-Úr#uœ´ÅƠª' \ä²sØQ²Câyƒ···¾mÇ8ô”û º¡Áÿé…ÏđV A£ölÎ l2øăZ Ù† €q‚lÏ›4¹÷ûíÎz #$Æ9eÇS ¨²åû»ö̃{íù•±;nªÛ0×Éí[•eyœë₫ĂIÓá~q&6ñúÚë6Há¸è‚Àü.Û‡Ö̉1Ëï²v́âƠr¢ŸḮ÷ÔäucT-*,úư÷§ à(fˆæußAË6Q@J꣬YTæœ÷ư¾'D}Ϥ[, mCdå•!‘@;-W₫ŸÚ°68Ÿ~…Îë ·ÜH¬ùj{Á7Án©M¯Đ¿º½/₫y”æ‹¿ûƯßư¯ÿơ¿^¿½üË¿üËÜçE/]ú&ÿø̀Û²Ư Æ¥₫[Êô£˜ pw‚Je #*îÀ₫,̀îûỪ¼*‘Đ¹ "¿é0lơ ²¡‘± !¢tÍ`+UƯ4äIîZ†÷qíŸfwT^!&^ïƯÙUœé!ưfM¢$ Åẩ,éö'Û–‹±i½÷§§§ióe¾,vñà4ÚAä 3×ÇN<& <|ºÎüyo=Éu ̀ôỂÿ É̃¬Y›mvë¨ ®“ñŒ£(+}©¢yí2Ă Y®P¹¿9ÚK|Ví*̉ ’……"´¨O;¾à×I¸Öị́0Y2“É=Å—˜l –¡₫÷Û †û£K‡¬ón’û°38æ›ưÅÄq?¢8\¿óÜêcKh«%søúúÊÙ†ü, jff¬JỤ́¨*ƒyÚ»à|ÀưÓ¹È@Ï’ ĐÖ§ç.í"*èÇ'[‹yüèAw†Êh³]Ú‘ˆảù́e*€Ä·‚–ù¢̀&Ơµ_NVz›đé3·3eöÖ›µÑ`Ô1GŸcÑFÀkJÛ"÷ĐÓ¬£ƒ(•84³âêæùHi \ 1»ĐJÜ·âÛ÷dSÖ˜ÙV‰ úªwÇÜpí„¿Cÿ킪_fhïCo’p±¡9€³i‹rĂ¯¨™ö­U‰­îÍ@<À¸´Ëßÿđưwß_úe¿í··ïütúJ…₫4Ï‘´¶äׂ;K^æô1€‹+ưĂ¯ÀÓA‹úđªäR—V%23*PËJ$ÍS“Ç<û `ù 9›ḌçæÆ>|?¥ÿ3.ÛŸ[&?N™_“đ3n@±ÆÜ AvI¢%¸YûÚP¯œ5zMVgÏ¢:Ñÿờ¨Äj½ŒÓT— –¿nǽåơàƒ*ưĐ?ç$î§¡ø»_yđ‡ŸO›ÿñÿé:Ơ[éÉ…eÔüPt 2ù¹D±ÅêÄøÖ“»Â²¬)p\‚EΩ^Z æ)Ưö¹#£¸˜^—ƒÍ̀^ß^_ß^·¾ưkƠoˆsê§W\<¹.g˜ÚƠyˆm KÔû̀9)/Fô (ͤ sëù§ïàûlx§Kùo.ọ́º‚¶LÄïd Z(É¿ˆÄ¥,/ăWîŸcJÛËü¬—¸4¯Œ J‰<‚†p9‹íXùW±)ÍpJH€G§Ú-YÈBŒv@âÖ, pa®élÙéˆÍ ꛓÅà¯qƒÊFS‚…È‘ççgmúv{»ßïD„eƒï'‘ïw7K‘I I æäl];:U9XiR=Áb^ßÏǪ$ĂÑ` l păĐ¼)́\@¨3ˆE•–Bgß*‘_ù¾([$ÍX̉tˆ€ˆ˜ øĐœœ0Ü rVÄåÙaÑ" —OhÙs~ËS]¼TܼÈ}l¸]OI<$›™ôgó„Ó£æÊü¼˜:4€BDE^ ƒMBªÑ’Aøù)m@¬t à¾Wí\A׉gEav¸¢“"$ơÀyËY´Œèy\Ă?̃x™|.¹ñf¡Nˆ;F?́÷ajs̀K»øÉ¢µ̉†’‘LkmçØ;l´±µ ß]!̉;°̃{3”b YœQ}¥,¸û“"¤ ÆGªól„¸PáĂûuFç –@x _>¦̀ûq‡'¬TÍóÚ1,ÀlóGj™ª‚/©Í6½Ï uß½# ’ijo™ˆV´ "Ü D̉寙@üă¯ÈRrđ_|é;/̣"µÄ9ï‘ß ëÈ/ ¬Iÿ[ºf•ˆ¤@K 30H®s"ïÇă“\H…YV¥ÿQv\ƒX\§âë}ñÏ{ƒPA­˜|₫üỹçÖ¶fÍe?¤ÿCÿ“è•”àtĸ‰7) ³–ó ÆŸysR•ơ7™ˆ̀ø6JRÿ#9,Ç<è‰$¡₫'iD›HQùúơ«ˆ´Ö¾½|;ị́µ̉—ñ@B^Îy¦§té´•4|)̉s ¦9Êă¤ÈQzœáe¦Ÿÿh>”%¡aó9åt…w·íré½ïÇ~́Ç‚₫y/!îVL”$ ñ=ö)x|Ăw§ẹ̈Ÿf§ *´¨‹hÛÂ3{¶‰ó˜zYï4Ô¦3ÙâÆ”)°%vtf‘Y/s%×Ă­z©„˜’£”ùØ»ÜùÏu-œĐđcÈÀ­ s”ñ˜ ¿Ht€j¦’¥™¥‰Dî!Mk'Ó±ÀeåዦFYÖ‰ èíƠfs Q  cɼ_ôla¤’ñ¤5³²¡®öÇ4CÄJ€’âhs(ŸÓHÅø4çL«bÎ(ö# "̀œă)Û ~ưĐCZªÔ*'̣K_LI%ÊG¤½Ÿ- đ¸·Y+·Ơ§´>oiV!MD®ÛơÇ_ÿ¨¢Ÿ?~{yădö!e>¤.ÀØêờq^HC̃oé5î×cùæ§//·ˆhZ3Ơ}†wg„.—²6ç<äh³]Û ̉ióCâ¡€ èÑ ˆÛ<́@†'ro à'€¦&Öµc2ƒ` 錅+1…̉ 11A3ÈDß—j€‰GE ̣K –\à:·c̉d»nÛ¶½Ü^¾~ûúúöê™s9ÜG¢qĂ!×íêͼàåOGÿæ₫ø#̃»¶aå)tÜ_³v°¸VªĐ_¢œ·¥ôŸ¸=¿Èư3pƯ®OÛ2G?¨áK“`*L0(ň&ë¸SǗ6XuN¸/Å´¿́|Ëy*ªîP§“’"³Lá… r.樭M‹-ê)IºøÉwưñƯÿÅqIúÖKpËaSÅv±ñàä/Ÿ …ÿm¬—YkÁ7úÚ0@ g¼\‹Óg¥Œµ$ü¬̉rà́F‡mØ₫Ôµ Ùáûùpו†QÑă~¼×k»̉ù‡vŸ)̉hú‘Ơ,†ÊfF•Ç¥ ‚äH„jåÉ®°ÁáS à•Ù̀$u}HÔđ̣o„WL^̃^^ß^­X‰-Đ?UÓ¾F3¯§Óÿ¥ưV9—iÀC7ºÆ̉‚ĐØ9n?uAu߬ÿÚ¶úÅơ[ỶJ‹üâdˆ‰Zª6íz½^®{³ă8Üö¾ÖïJnkR‚JXæỸ–uw₫÷Îơ%3P‚CâåtÄ<.ÓZæá[ë€wA-£€ULøÁ·T_hiL‹;º<]~û»ßöÖÇû}—á+#àtW"̃McĂ7NËÀ ₫\ÍIF(°#e!çVB–€®†< Ư:« "fÄ94¥`¬®ªÛu»ªjú»©?ú†ÄŸ±úZ4¯ÜÑö\ [¯±ŒƯŸ'lûkđĂà5Óèµ×/¾Ïc¾~{í­ß̃n»|P­øº*dâ,¾₫LµœS0’%¿NvF=€­?-Vü×tœd¹ND*úçaS0.›L•–2e¹°–“•ÛP.V–Ê l@?_Ï%ô¯RƯrªU†̉“_€̃ù#‘öexÀ>S§åuUGLhUµ₫¡¨&*A\³™'Ȥço³µÖ·>m̃÷{Í‹hgJ²øxf?2:ưïU₫ÁöÖ/zqâ_·T₫„‹Â™Û5iuÎFF,çï{pÄđ₫ »‹!ÆR ÏR₫̉çœôÿaÙí…ÓƠ, <&ê\­3 •À'Kor²é /À¯øøX”áÆé¥Å$ÑØ&6̀₫É¡9Ơ›¬¡œ?•Ÿ36S]^3x®‘gf}.ÉĂ™iÓÖƯ¨fr2 (ß…m›ơ¿aóYfB=Ô¶¼EçÓƠ;̀x˜ß8x̀È78#)[s‰›y…ZrX¨Fˆ¹A& KÏƠé©h~Ô¢5UÜ2\nj$Æ#9ׂäZÈO¯[ÄúÀ¸¹M›·Û ^F4Öáđ&Iœ‡J>ÿ.Ñ$8÷,c#jÓ„Ѽ(…­¯HmÖ^§9=,Ö9NQ’—Đ?°ÂiN3aÓ¨"&ŒVQéêe¥Q2²=@Èíñđ*á2̃' ~¥K$º|—⟈ù@kE(âa–>O:¢–® ₫kÓƯo;8%*%±0M”‘ÄơCƒ”ÈÔ ÜEAÍ-̃›{¹(HDùßbqQă”Y£Ø®Ûëơ÷iLOs'ç~…7¡|¹å˜á9yw¡[öwkË![CMeâæ3QĐf:ºơ¡̣˜6ü,P¶“́ÀµŸ|ŸK´&ŒG‡›mÛt-’̉[+fA-ÿç:±Å0Ó¥V¼÷ÁăçJÔÖc!çAINlöøWLƯ`!·Œêụ̀üƯówß}÷Ư¥_öû₫öííÇhƒÍLO¢ 9%©y~MåÄà>€ ¥+(—$ÄÂpÛÇëǦ-…=[XûCå¸áÎZçă¥sȈªOĐŸ ¬5…t§–ù¦I‰T•R~ |ééÉ€¡k¿½ƯÆ}@æ"ÔÀưỳ˜óưX·$₫«Đ?@<ư !oèq^?Ê+M̉œè!†„Y¾oF̀7i¡`-'MƠV’Đ­ê3×R³Tåđ&M+aíŸøØ²Ă—̀•̣¯Đ¿‡ $a¢…]q²¬¯Í]Tûæ©£çkN‹’ưkTæóu>ONÿ“÷v>n+pḶXD؈ª†*­·mÛĹ~Ü+Ú¨!¨÷e5BoS›ô¿GÿŸÀM“vi®ơgs_E%ë/ÁsÇW=r¢„;}\ t̉‰©3mdå¹øäTi­M›2\¾ˆ₫¢2C£ BÂ+)—ơ€ÁLÈÂbV“M,µ 5ʃt3ưHF0Fª­„rêІIÑv§< ¨ÅL̀.L*hïjđ*ó•Äÿđ X“T¼Ï×·×ưØïû=½½¹Æ€ö,ª̃3(8?Á} %¿NÖ5rX9{ÆøÍˆtLÖby®ˆ5/¡¡s]‹€U=ˆbwĐÈxéyè âA®´ç—Æ„ÿSÈưK‘Z>’¼%U¨ªooo¢R7"•̣X#´æ Ƹ#¸̣{º«Y—>mºÁâôU©«Qç̀̃1 ₫8¸  Bæ₫¶LŒø_Î -ZtQ€EÛtí d@̀U óY|²5dJt–“®”Äơ6â¯G™†Rám.Ó×,^ºĂ•›Đ°dṛÜ,Éj?˜‚F­ÁáGS‘<ÙÅ®O&¶ïû1Ó×-…s;'§E m$`̣à6ëƯí s ’k Đ!Í~́üóŸ®Oo·7F’ÜZQU‚̀?̣ÀK}đy:{m̀)µÅ ø¡0 ÿÖ2Hj©-̃-Øh„¼—–öĂ}î}x7±6ÚPï)í@+JÀ1n jUtΉ7ÙÚ¶M7ƒm°0`³mÎé=Z÷úÚ2·Ï¡;¦Ê 3H ![Å` ®ư b£¨e'jz»7m÷ư®SŸ¶§¬ÔYŸ—"k-ƠƠmºY»a¨yË) ^(‚ª5–umŸ>yP$₫[ÛĐÄ÷dç_…¶|̀3ụ́œê#‰­E¼ ̉ˆy²~ Èú[´ẹ̈¦]ø+ ˆ8l¨ C›‰å¸â‘Cp9ͽ\W•y™641á\Íõ‚>)sèÏ IˆÓÉÁ0i‰…₫ñw̃ˆÔéC½WâÚ@±€ 4P÷¸PL¦x]ÿ ư›Ơ„€_ÆŒ¨ăAeÁ=_ƒ®* :èQùóđ&ÜRk ²×K½ïê;™;~"IXÊeNIŒ<Åå¼å- r‘Á" ± Ôư‰ư­̣ßÇŧ廿‡+N¢çW´ûmÚP*CŒ¢’ûK-T°¨>çqàsŒÁgy7qׯr´©\_Ô2˜*ưOơÿ8ü4 SƯYuNt³k̉¨_Ơö]́•/•f_ S Åô ~søÂÔÖ»«₫LưÚù£“2¬ ¼jđ Ÿ₫̃D0n„e+;ohüt{ÿMNdj}LÖ$)Ụ̈^鿬?; ©èh,µ² ×@Ẹç)§©‰Ù*@*OßÁ"½´cÉ+Ÿ÷˜¥®†¾@ø5huNƯ¦]/ávù^Ö<%Ă•à×p'¬Duí¸w̃zÑ ”p· ®«CUÙùW†‹aÂ$̃`·©×H÷öU"âóY„–ߪz̀Î̀ä'ú?̉%¾²èm—Ÿ«-gµæ g .ny@4j"æû‰;ü™2mö­‹È1K\ưΆ}˜8xEu„º_û„½?Ă¿Ø|²*ÿceéY9Çụ̈ơËm»c8éü]z›˜Ú"gÿcHæ%₫¹%Z )”]Óéu-/óĂüÇLv:+»¿)Î4 ƠÖ¥Ăô?{ £}ØĐ1æđ;nØKƒB…QÿxGaÙ ²nm6ëæe Ö8«Óp©8/[©6a§L¿} BM•¬ÿiÛ†CÀÔưmŸcîÇ>yé—¦m̀±Íí°ƒU…xAÇsXkT $!¢ó¢ÖlÓ ù43C„Ù­çDj†d®/wû‘ë0öIµ*T₫9!,Ôœh*–̀/bưÚøÎ'CÏäđ¢Ø?GE& Ï`YY„”)Î_ ‘9]F)¨;™6;\ܬ~ âW‰Bcß_B^K“ơÜc¢ps¢9k­̉{' r²Î$Îúǽ³¥€û{N#îÏÓ§ÎùÀµÍ̀W.f-¡FYQƠùͲ³îÚuëI—NóeZgÀ)KĂùFôúe,̣{Ô0¬îư§ÍưØ—ßinˆAu{– ÀÈ_ÿí/œÖMÚ¦Ûµ]·¶]ơJ·B—I§¹$g”̀‰g½¼yª•&ñçû‚–”|†­==?™Ù±§iFñÎ0ḌÏZ«¢‘»l—v¹\ă8î‡zi™NÁ¡zµœe W₫«L¼ơDñת¹EH§;ª–̃[§O¿0²1ñμRNó± `Åưr‚ÓÅ? •àÇÿM™s¸Đ3‹À ǹđ–ÏëüV²Êè0—<»¬¬¼eïÎă2ÊR̃$84³ÿ» ƒ́#·ó[€¢W&DGs¹¶p£—€₫3́À£Ñ›÷Ơ÷Á¿‹Ư¸`⩹#yo;á¤Ê#J¢1gÄ̉\¿‰‹̀c¤ÙIÉ‹d#TùKt̀à {z63ΑXk5ßRÜ:ä†Ô–DîÆ‚‘¦ÉǴ¨Đ·ˆÛuå-—Ä…ª³>‡§ˆđN¤´©Ñœêy,J>Đê½÷̃úÈ󡂉 Đ[·å€O6æ>Ç1–͇t»EEø´l.&ɇ2¢ööÏ!:¥¿̃ƯI%3¥;w3>ÙÓ ä̃á‹„ÀĐáúZiï³£]ÜBaæƒ_FƯ0è&~ àJÚ´9ttíơlÚÚ6Û:Øk‚§êfz^pX´ö¸Ÿ/{uå±Ju ¹¯†­l‚zB§í´9öqÇẰ®ưz茌M™ è³róđđ€¬(Íå¹R̀­Ä<¯Ñ{.ö41ïqiâ9¢íÓÓ'ëä₫Ư€¿{¹aeưyÛ3,½d¡ä)¼[VØzÂQ´–óºz'Đ¿›÷U /’ûŨʄ5¾só¬°$ö ç•q©† •̣Ÿ.ô'îOé¿}T,Z)‘̣çoVÖç.{MI€â‚ÛÖ°É̉`N£q‚æú¯–uƯø¡¸Mf—¬ÖøĐ4ˆO—($ÄI¤RD X&ú×PËijaó'üM-{®–wÆ#n¾SÇ“:¸5Z+̉«"“Ü×t:§ ¨„^ËƠ–›rOÑ€ÎÚô²]ºö©óöv«Å!N éLÊ2’ù7è åËÑ¿¶K» k5«~Y€?¹(ñjà¹À|s2—C [’Óyj2ÑḷüüüĂ?Çñíë·×·W±ÿ•A/1@I¥ùçëóó‡ç·×·ÛíÆ#çÀª<ñ½Ú€Æ•×É¿èdÄ…ËN"ë(Åö₫¾ÀưâTfdØI¥ÿÂ͋עÜ˳…¿§ŸT†‚Â’ºÊlÈïe™ç€hNx+ơ¾5†­ƒ˜/é^f₫u¹dơ ~åArº‘å —k~ĐöøSăÛÆ'XP¯Â­O?cÅLfLWcÖÀƠÛ ÑF&æ²íüWé[*AÂuư@Ĩ̃e¥₫¼ˆ:–{‰XÚ/>fˆÏ̃¦œWËÓ¸6€•åÍ›ú®Øü}\ĐßÜ̉¬xç³\Gư?¹Ö¼WCơV̉uLë&¹vbñ J½~Jưƶ3×EC'èø îT $ºxN©-«£Úåj₫LƯ¹…VÚe_bØlb×ëơăÇ*úùçÏÈK¸'c̀«²Ñ/Ñ?u8É;Æn”h÷́Ơ dsi—ªÛiÑ)¯%Đ”đ‚ûGI_oïrziđ¾µ­¦₫¸ç₫ĂÛ‡q!®/x†…|§,%•Œ àÎË3*£a]6ewUÑ­o×ËuÎý‡“@‘d"×HèꛈJu­€ÀqgQ=eifæ3vª¼l‘ô)íÊ%9A¸¢g+eÁ.¯?q-E$‘́Nær:±çóªø^™Xßú¦ÛÛưmÙ¼zGR¾“%zà6"n!C…›° ÷­?=?Y³!Ă^—ºöY¾Rçö^¹í/}aYuí@ÿ®ø×|Ͷ_éoSđ¥¯öA¸D\ZèÿÇ“̃AF(¼¹zÈW¶Ë†2h´­S"7Ö~˜;́€p³–ÿZÑ–,Pƒ'¥/—̉˜¶œpäTxvæ©V«~5iï° Àă¿´¼H8´̣l«ÚÍơ “‚ơ5j ]Y{ïPæh$Ü­´gª¿Vy ßÛBçĂɶDz¯Kö_‹·Êc»»ùøÏ™Î.kX£÷đvVˆSe„„JQ‹Å‘÷Ư›÷Xß!̉’ v â~¯IẺÛ¼/k€ûƯ܉y‹‡Xp5Zà_åê(’a•­Fj7^äİ"œĐ¼ø*b)tÑL3h¶p¹¿Àè'»:8ÓAí»z®®w¹‰Öi(¨1€­:·ºZA­ábˆj±*…Nfª’ ®ê₫Ÿæœ:×TcK²ø+UÿîN¯WJïÉó]ŸƯ ÉÜdœ.O„³åºåzNf¤.†¨j›í‡?ư&Sf¿ôí²cÜ;:4×# xÀAsT›˜R Đ B)÷0Ävœ@³ü'§4cåLÉ“N#gÈĈHËœ&¢Ü¬–=|̃Ä» —™n*Œƒ^-R¼đ̉Xk[̉:[Ûö¹£fÚCíûÜ»ôviÏŸûµ¿¼¾|}ùúíå—ÏiW™6= Ùk›ÛÖ·mn—~sl}Ck„F¬RÀt̀€5Œ9ÑX|Yó¾Ï„ÿ؉(Qzâ© f!>¶2o>ĐĂŒ¢Içq2ÚîKIÛIqF¸IóÚ`d`<ĐƯ wûxù˜†Q_ËK/ë́=èæ'bĐ&"K™oípŸºQA11S ËïKöà”g9ow&©ŒJ_"¶ZªHÄO¡?ÈK/ö•è@d)ñŸ₫ qßIvӖщrää ‰ª¸))¶@üëÑ{‚ê•Y'zuÿ­¸ßƯ÷oÅ`ỸiäS\Çă…èS‘[@ù^ÿ!o‡ë“¤̣âưµÚôútƯ¶ívܘ ῭÷9 ›ơpk¹€̣¹€ă8!­î3 Đw.-Àhéù®™"¿ư…)íÿm»ê•èùåâD¿’mơ’xaæ'æ°[£ÖeÎ)6à³.àïíö†…³ïûi@̣³j?„™²ŸS´û~o·vÇŒf«É• Id3b¢Ïw#±ÓcF1‹¤k îBd-U¼'çtU§%¡ö×TèiQÔàtå¹”ª¡áÚR*¹¥pRû!0Ễ÷qùÿå`pO,BEÍ”S¢RJđ/Đ%jÙ[ˆ;×Ạ́4K€̣¹’?ô-hFơ´æûŸ²¿Î ÂSÈƯº1¼A}j]ÑÛ>¦Ç?+Flú¯GKµŒdB^ï„‘¥YhÂ:ÔP…Γ!£WY`‚Ø,Àú»z¸)ë€Ù8 «MÙ™cÀÙ¬±çw<̀Uv‚z,¯ ÄÀgÇüĂ™ñe„YL¨È³Ñy¥ÄÙáoơ9ăt» íSơ¨­›-`Đư~G Q!0Ùˆ°º” V~g9z¬ë×6 yG'|x—)óút½>]ă°7›cJ9€X2›A¸ø:ĐGˆâÏ&‰µÖP¯IfÓ½̃»Y‰·YÍimñç.§Ađí²4tóhYs@39|Zûu]ÔËq>÷Ø­ü“Ó h(1ª`üö"à`q́ºRíØ.Û§Ÿ>~úøty²i··ÛŒî¹V¤’̀.JD¯ncˆ·èÚ] d}Ú́Ö»u¯F©¹R‹Êº/d̉üTfG=»êÑA¸àæÀƠ1:QZ›:»v4?v9ÎÑÆ67ÜN¢Ü̉÷³ éüÂBZ ¨\ä2en¯U”D;`wƯ|MÇ(“́sÈ€‚Ÿwâø+ú¯D₫ÉØÁÿä›đ‡¬z–Kd*“>Œ™-&'pFÍĂưµ~Q75µ1G¢LÍÑ<äđv¤ ]ºfpÚñ)%Œ~d•2<#KrEêááÉ~0RèO5¢µŸÄ¼àg‹Ø vID¢‹ĐMôy³«lFª̣Gó—ßÅp™e¶…ÅL­EÿÓơ|}ëÛeËyX@Ư€r(øjḲ üѰ€¬g¦úqómN™·ưæµs.ÑoIpÊßü–ç¶̉‰₫¯íJÖ?EÿÔ¼1Ă[3¥ ¬Eæ¡)G›«ƯÖ> ¾¥–îơåơMß8J oÂlX¶c£̣g|q̀CDn÷›—₫[欂Ȭ¦nÖI«ü̉èE]¢#ßj$7†IT|%·̀eƠÇÍíÛ!B‰xs‚=>ÄÊ–€)‰X j">º†d•öæ¡åƒĂÈê9(a“5>i„ha¾̃QZ^äj—ĐJ`JQúÖç‚„>£»ÓʯHâo|eB¯ügÊœ¤Û¸¨à<‘ц˜Ïiº¼̃+>Í…́ ÖØuưÄ)@'»Â|DR¯­H4y駨¾Ä?®A+UÈÍc€1îW˜ÍKo5Îr(ÓĐ™apÄßyZ+Qåư« P¢£’hqêhR ÿ èWà̉çJÿºƒj)¹0Îpu‰ ªÑ6X¢@%ˆ ¥âkß÷{qWĐđø×̉Ó°̀G•I!̉º¦y(LSơØĂ%ûÑÂïC#»ˆ% ¿Ä&í̃îùô  mǰ²`À­Áà„¹BaƯÓ/8gF.L íJƯ¨•QVlÁô\ôU­Óí“Ưt5pàR,Nzv€>»´Ëóö|í×k¿zï(-­PDǛBÂí¾¢Ó+.í2dlmC|G̉­{¹…-؆+—»‡±ÁåZ‚åÛx± s„V¶(x“Á5#àGSƒ.Ư‹›utëÈ ̣a€&¡E€¸lV°’ëÚ¥‰ Anm{Ú´f±ăÈ”`›X,ËJG8ư¡ôȾêq«¾ù„hñ“Ú ¬¨}–”:í)-/L¢Á¡„(Àj‹Ä?XÿĂpÿµxñWßưj»n·ưöåÏ_l7³<À‡5¸Ó˜¹T[jN÷đœvÏ2µ·×7†Q»ÙÊ9×Ô ¡6vkÖhÔ`A?‰·øî§Éÿ-¸œSw.́êÙh ĐçjGxFå fAdѫԦÆ-j{ºú»t*Đ0©Í: 8÷–Vâùô°Đ{ØW—V?Gÿô¦vh¦Íưuÿfßö±ëĐk¿ªè°ÿ¨i¤8‡ăƒ CÆ¡ÇÖ6<5 Ï X ¤P½uä7 Wx2Ù“5}ÄÁ©Ç(gQƠ±×¥Wy· ·ZV7!e¯Oæ%ÆPÖîu²¹J%úÆ07KŒäEnû­iÛ.íÂó.¹“iñ2›w÷%îAưâRË[?C-B–8€†.‘ƒÿª–ỶĐQÛ.%>!:©5¾,J¦¾ß!KÄ 5?üđáÓ÷Ÿ¾¼|ù÷¿üû1ZLQPÆvƒl.å\o äÁi.́ăO˜¸ä”Teđ]™fvóÆøP̃ƒœ}J²° ’é/¬-5®¤I~çL«“ß́”nª4!W%Ñÿ;X·¤P¾&|39À·NK•Tâæf%ƠºáÛm-œ̣£ÖÊđ:c¸¼x1ö}XöÜ£ƠÔŸçúå2ûTvQW₫Èi;œ5gÄ—¸€Đ[kØu³[đ;M+Ï:₫ĐjƵ kW»:¦ á%•¡Ë½œø? ;Ø™s¨Ă±dÿ,hÄ' –çpl£<€3 ¸o]›ă¸ïwŒ•ZƤNâsë~‛Ö¨øÏ"<‹ÂPJ°́B¬ç̀Êi7ÿéR7½6›ƒo´[2ÅÑœËg.cÅH[|bæ,­—TÉ$DbÎ̀b[́¦Rë¢$]‘21œ'²m=*ô/™7¿ÈºóXî‡f6ñ@Ä ú@6ơÁ̉s˜X·)Óí̃13»tésÆ-ÉÅƠ‹ªCGGèÏ,……ÎZFŶ„‚nI*R₫ ZÔưÖB÷e!H#•;€®„‘æµÇÓÁ$́€X<Ǽ¿Ü÷±Ë!Oư©ióæYv uÁ6oƒ́e-m¢i@æI€ÑFo­ Á‡dz±--˜áá˜pv1~æƒĂ“̣[.¹…ª?lÅ5›ª? ¯F#̀RתhÁDH{̣•u;å^bSM‡Œû~WƠmI8ÔósöÍ»}yÇfÔ°6Ç1ªz”¿~çÙ)"₫Côö̉­&es"n¥´µàqѳoŸY$ srÀ<ˆÿ˜~âóE6›ÈUíf÷y¿÷êdk;X!£f瀆gFµC哌Ùă½‚¢´aâ2ùX[TCRÛ§6V¢ÎPÅ/§Ô rß$áê01hCry6è wÂ~ùµUÀ¤©å¥M?O®ÿs’<®zô…bu=]Ë%iÆÜLÉÉñÏ̀\R¼d½ïXº}QÄL½p*J…º÷²WøxÓßÁ€l.h Ư?‡Ñ粬aNå‘-S(kŒ•̃|ơ¹çÓ/Oê ˆ 3q«$@œôgË’Ytqå}NOŸû₫iÜ¿’Ëog;Ï1Js+·–n}Yb({H™ X_„9åsñ™¦Ëô^•oÜ©j¤ñø^Ë©, 3™ë#;Upè9n<è8¤éŸ›A$¦Ơu'Ázæư¤8y]"3pđTäåưR5çIṚ5œ0*IÿÑ/é‚tuñZ»ø!‚’Èh äSĐü‹ÍÂhư œ^ơ$›6 á¦JS‚¬ñ8¡:Ü*½4BÖ0²ºÓTèƯ©]…ĐEÿ™Ï( Q’¦ôl̃@§B4ŒRTî4¢úå¿fv¹\z뢲ï;KâÎɽ‡±²·`†‰d+•Áq/@r±/çÉ炈Â8Qn{ơĐAp‰Ǵ4:Û´ Ö$̉ăV–̀W•gŸ-KƠ/œ¨ï$ĂâJb_Ï ÿ3kÖºtkæå˜knYÊé€ç[sAÆ̀mDD~ Í`Ơ‚Üoí눹KÇ ơ1ªè%çcn^uB‹Êjdè¹–ưñ†g?Ñ|ÂMBûáa¤dê#S’46$ï±J͵æa„§¸Ÿ=j¬µÖ¶¹uÂ÷.ử.8awƯ=œà—‘¼WÇY†Ñ2rî̀æÑ‹\Ăû%C{ë³Ín*¬êA/R„døÿ°-^ZŸ(LZ´º£ơK%bÊF¨4øB à£rÀQ“¦Á ²X³u.îT9çz+„¨mV’¤…¶äqâuÖRÈ’ñËÙ°RŒM sÉæùV mÏôÉo‰`‹!·ǜÊír ?–_n…8×ø ~·-1À/¹œsR åèÓi'ê7Œ…§D?Ó88.̣ïÊoÓˆ7¶eNÜRA§¸4È‚êvbj°”è_ÎEÀơ–Ń)ê®[ï§OŸ¶¾í÷}¿ïIÓ®¹…Œằ®ŸùîrSƠmÛlÚ8ÆâÏ(¹K°v-an |>ÎJé0ÎYïU0´‰°Hád™'Ä»BË|ơxÀ¥ƠP¿*-’×&rF“uF1öXàZyQí ˆ’ñS¯N¶₫kZ™H¸mà—„>kk^ S”Œ‰ªyÇĶ2$F" Ö¶Å-vĂ9́§=F—»®SÅJW>)ÅÊî Í ĂÇÈ2)Zf b (dÊ:"˜Ç ­PQ€tN¯¶ Cüă ó)S¦ k Cc<¾ü…’Ä£¦@ܳÁ qϲù×§̀EÔ¤ÑCÉçĂ;É¿%ø®ªÈc~Fˉ[L bÁ iŧ³¨Î‹H¡¯ ú41Èy³’ô–˧™ éÖ¥ùzñœ•xïªÜö-¶hÉŸàPK2›ư¡ƠÍ 2˜Ù¶íút½\/¯/¯÷ûƠ_x+ÔÓ­¹)]å…u0GĽv®X}z}0qă¡Ç®{Ơ›à‡ÍÚ!¬B«"Èaƒ:öP¶$3o0tl¶m²Ơ´₫àwP"ܵ»^ß<L‚ đhơø[XË0IV—HÎüåÔ¶b /]µ,›´0ơÍưHXT™a@9G¸XDeK¤5Ă%3ÿÓ¼|Ȧmm£E>Hÿ«hÁ;˜hÖ¼̣?ëq₫ÈØáV̀–ư¤öáíy¬rRùC$åªKº1‡¿ç₫̣‡íëọ̈ọ̈ơöơ°ƒÄ[̉Z…ˆç$¶"³æ•ûFBüÜäq[¾üŒÆ§kËÖ35é|̉‡3q”ú(n\ç<í̃—¨jQ†T¶ƒ?¯‚Ÿ³@Zù˼—:ÉR̀PIeù/_Ï% ”|́z ƒ¸ưÑ0ÇÜåz²3….Û˜#6z\F6¶N³\QUù3-™¦í"@âÜvô/½·å3`ùo-f¥øß¢áÑ€¿Ô¥dù„eÑ[V]²:^Î̃¤ÄĂ@M¬ÎÁXª€°ÄD¢Ö°¤||N¯¢ÿó‰»BüU’ư…,8äË–ÓºÜc%₫/ù£mÛ₫Çÿøß}üôç?ưé?₫í?ôÔ´üË,̉ 4¨-7efà¼éíééiă89}q±szÇCYg₫ªïäÖäkBVxØÎƯ‰ËyâW£«n8c̣ÀN5¼?%?k­¨lQ”X~̀¬¹Öôß”¬ï$VfHăRcq́~ßZ̀=J́f“Cˆ’»ơÖÈ́˜$pÏEYÓœ]¥¶î b嵤ܥ±H›íØ$çßÁ·’éâa‡eƯ©:IxÙÔó@Ă`”8Íɧ,ª¶ÔvÙdˇƠ',K>Đª‹̣»ö(Æ?‡%“˜3êRPøg¨öŸÛ¶]¯×Ëå2Ÿæ1oë¬9¥‡ÓsLB–F€ÁîÄM÷Lï±I©`´›»H!3–%£³·Ùúè½u¶ è³·Ñ B €™ă„«4û‰mz8âo!Đío$<;Z÷%ncƒ”Tuû)‡¯·x¨&¾u{“¶rÏ̀]đ2Y–›3ñ½‰éT¸Ey%€¦˜™zî±b*ºă0dùgQÑL¯Z°Ăæ˜*JkÿÇS™t]‹>g¹y‰ ? ª₫ÿ„ªè§Y`\¯çMæ0z×@%Đ…ûÄwfL–ß9†ŒÛŸoSç>öÛ¸UâS"íÎVƒ¼́~Is[+¨,j₫*̀"u  Â. ˜ˆNÀG½È"äÅóƠNM¾$–Ηëy3Ăb¢Z%L$PgƯxÔec²x¬@ƠØ`AÜ‹¸x đég øk%Û)5w`4­̃¬­ûIsü[°ÎÅEǪˆÉ%²₫U¿Åö‡‡Ó >7âde°ÉÖ4¾ë9P5ûÇæ‡^̀₫jê₫+ ÏÅ/ä/#Ks‚× Ï*đ-]è%`©̣8œæÄOËÿZđ˜ áÈÍîtÊ2%½¦&ºDëÀƠN ?'ÙÑ?’ª^̀³¹p*9cË'2på½\®¿ûøíËó¶m>©Î̉n¬‚†å?K¬A™R” \N5߬I€¬0a— ñ¸ zÏÅ©"ơă–O_crsçnv!u£¨ăPa4qyMä<Á9¢•ûszIĂ4jP¹7fVÉUu¨ÁP;°—Pî@tđBvhШ\<;râU+Ø“sNL!@øˆTkàb¦'-QBæyr)̀Ç6-à‰p_$Yư¤+…%ï<è8].—?\úåË×/6œ´†(¿êfZ„M1{…Eµû’ŸÍç*’xAí—­ë I´”₫ѶnedÓÈÁçb;/Iđb¦tOr«Yd!d¨ê1ƯÄ®6|]TW±AƯ7đ•éS±ƯvO”¸Å ‚Øô×&&‡̀–ÎoÖS´ !f5b!ga®ëb§)îH,®f$S'Dô÷Ûư8c£ pcúa(ù.X¿Ó̉ OTzë—í¢MăpÁíæqBS”ùúno… *íü‡Ó›‹e¿°én99‘R1/†_:Ø2 UG;.í̉[G±Í¶¡m§3ùL0[œ¯r>F̃™ăl‘>•‚ÍNü•%_̣Jæ ́4º ·̃pvc ª©)©ZrÜ"²ă ƒđ]­gª»¢jxđ5?Œ©ÄÅÿ°§đ…ˆđ7ưÀ^ÍÉú'=D~ö3̀{Iq"²cÎyˆ³’lKt†₫1¬¸:hĂÛK7µuXp˜ …,‡Û™×'±­ƒ¼Ăúä\àvQ!B́D!r*ª¡̉~’‰‘$̉h$#†sh™/‘¯ÏƯç¤ö~PÅT°èب ÑO&b?Ïÿø¢€'ơ?ïjMpAÿUĶô¥Ïe|y®¨«Î°‘HD2ơ~¹=&¦ú_úîf0ƠÂUk¦>6µªü¡TƯ“kàl’Á³‹zÛ ”ưPü“7²̀ êwßaEÙ|ú|ÈÇËd#oơ?å₫ơ‡+ÅhúVµ(ïÑË”WĐy™o÷ábƒprüµ€Đ-ESE6p*`$°¤†",§I9Ÿ~úé~»}ûúMB£ÉË…¼Æ\§§e!ö·'7猥È9êÈóoÓt8䈓ªKÍ7¡̀ ·‡ÅkU H^­LƯŒ–-DŒÜ¬¢hïÅ‚2óé×ßµÀÇ*¶µwƒC_H8Êc^Q“°Ü›w¿À%ëb,´¹ªNIzO+Y¥ÿúæ½uÄÇ~øe«Å)¨E¾'j„Îu³­´…¬Đ÷î ,œ=C•11vñ¶´1€> T1”¾‹_Ä©\èvpư¸xûå…qÛ®Û¯~øƠóóóËÛË}Ü=€ŒÁ÷y§BÆw©UkéUÏeÅ‘·èÅ›å¶Ñ¦J§6i™`3 Ni‡ñÑߨj¸³±‚W˜T¶̃_svÖïHÅu>-JDذŒ÷âOŸÓs¦Z•«@ /çÀ:\~‘,ø7bA„₫¹iàU7ëÖù&Dy;ô¾³¸/úŸN­KØ-7ÄsƯ\SxŒsÎă8äđ_#—/­‘c€]Ô§‘²¬¡wl ïu`äÀâ¨oÅm¦°lÑ>wpÿ̃Qxỗú1ü& < ˜‹ÀÛwƯ(«ơăU] úÚ­m£ üé­o²¡8mŒƒ*uqû́´ÀTªO¿Ø 0æú½Ü‹¢Ø¦nªuLD̉DÎû—›G°HZ"{ă¤ê£4Âăí>»ôFí?Q×ëÿ–ÈÛ¨ĐhùưØg}%O35ëâP£àÇkÈ÷Ï0ôœúçúñÀ—ÉîE3̀Ø014.…4K©’à ÆrùÊ);Kæk˜è,±`¾hØY]Ḷ‚y| T'„à¿Vj|Éúçq+¹•œöÜ‚Kº3÷¦HMÔÀ­è›H´k!“ZËUÏGE“f³èŨ•₫WAÛŒV₫“@ä YX£ ơ¹Gçáhˈ…NđÄưË™ÈÎûgƠo­­áw½OYđ¤ÿS§Î ¾×Í+´:đ„Á€ 'm¬(ªWT@u2lÛöüü,"/ß^₫Ö>3oÑÿ¢ù‰X•R´ŒY¾BÙ[½}çÚ0×Đƒ|iï{Ë̉êkíù•ß5c5×Y¡ùø˜0Á\˜ÙŸ₫øÇ¿öM¦˜öwŸE®ÏåPBÍÇ@úÿ‹̀9ïó^ïư”)[8ˆ56Jÿç̉í‘ûÇïÔC¨>f®2–ÍmM\cê-^øÑ5g]vÎks‡̀?Ü L®O×csŸÇ8êâMÂå!Ía1/fmÑqvễÿ8‘.>v„¿4Á€ŒAC̉c̃àÇØ₫‰L0†©m æ>8 ˆjL{§`~¡à¯àz´È°°#•çÑ9XBñï`º´¨ uå’jövl_:"¤Áh+{`‰O›$VèóóóÇï>f³ØÈ~x×™¢ygƒâ¯ñư4)‚Ù’÷Àœœâ}*ÈÚ@‚|™h¡I£`N—…S̉q4k̃qn•0pg!SÙ>¤s9Đ˜¦LJV!E-¥²öăŒơ<€56ql²1Ór:ÔH¹¢”ÅOX ầüÀ=ôØmw¨-¨ơ°ƒáºÏLÍ9 đ²†ÈÓ;Øå_ë6Û†ŒM7h¥¦z$€CĐĂ€è[ç˜^²z*Ç"B î̃$æUJHJƹPĂNrÅ.Äp.̃ب̣¢aơ½‹XqẾÖ.—ëÿ>v[¨ÿDEïÉØ'@ey@+æH¾Ó,÷N߀₫FKø€\ôö©]‡ªàgŸ;¿Sñï ơâT!€‡¨ûÙ0kÇM+Ë’ëơ,äF¦!¼!₫¨¥u”eÈÿÓcôXû“@DEXD_íéx f̉‘ŒÖ#Ç'[$Ѭè|¬#Å\÷Ùóë‚{̣F3"ÜøNˆÜbâîœêÿ̉Ù¢†{ùµ'Àiy,̉3s²\¶”œÆ’ )—Œ<3×”m¾JMÂôϵĐùQ'j’€Ä?₫îC탒€V]íá_YǼ¥=°₫¹J>œïeuêŒóÀäơåơưtM ƒ•ªz,½}îÇHé?bFÄ1ÄÙ₫h¸ÀƠ—¼H ±µ©­mƯ͘SâIeAü<\=<ˆGï%à±uVn^—ñx đ[₫ç±6 û'?kœ8Ọ́p€”́ ¹2—˰Ç)îRåRƯ]ệÉ8-–˜I:x1[Ơ Óˆe“ÊÛå@M/ûÁI½h]P!1b,v₫„(„‘Øßÿ°}~·ûmÙxÈIîË[qzZ´̉´Ộ:‰[U@ô₫'€`5!zjæv¯lYü`Ú­6#ÄâoÎẹ̀C°>Kû$GزÛuœ®Å²!"„àÁ«W5Ûùñ.2¼¬”P'«5â‡FGWu—¤¸À¦-Ë~b"*cŒo/ߴ飦ûpX{À{"‘hå²xÊ?xîđ lá{ˆwë­;øiR)ö¦M‡Ÿ;Í»"$BÍƯI•(&¡ ùŒPceHÆëĉ?³[ 'ÊóøJñÍJ|n!áóy)Së­çë˜̃Yû´ø ;ׄ¼:‰‰œU ̣Æag„mœ̃̀\uæŸ`é䯣ÓÎ!¥ºí·ă…dFà뉆‚é1ÛlÖÆî+3Cd½ Ϩ£‡@:kÏ6lèÔÑú…#™Sw˜¡ ¿kŸsvlsÛzAÿs»ôË1œV8¶P’‹c½îœDêu»¢OŒè\eIú™I¼NyHÙWt—eP"½Ù¦₫Ö"L³&MƠ~øôư¶é&$₫u9hOăăoiÁÅçÔZ$ ’Íí2)lj"¢«I[Ï(H îsO r~/I€ãäÙª{I„ l < ±40«G=x&µtçm¥g[Đ ûXà…GM-{Ÿ%ëÓ¢-¥â$û}³ànFÁd‡¯í²]/W·è—₫/V¶Ûo‡Xögd¤¼tüÂ;è¿́­ä3êçºDuơ¢r”/Ù®áLü×0À’̣OíM̀¤(p×ëơz½ö­Ë”·ÛM Å5ÁëúÏÑœ~Ưư¤h‰ 2@e÷åË 'o@ơE–®jhÙc¥5ªz­‚׀׫ĐÉ*ơßÑ)Æï.Ä‚ ¶kDªª6í8\|J bĐùZ(Œ†ù¸¶0.k™óÔƠ°˜»_®0³<æîÔ Z"B|Q½sâơ“×,eœ¨üϹ4“Ơ^0«&X!øÎZ”úD%®ªæ ỘÈá]X"·oÆëơºÙöơÛW-:Æ|ñXHp©ÏÏTA–̉¢èe•óg–>_Äú‰;‹>ÁL¨¶Önû¹h åO,»,f%n>Ü †fø¤ymk.§f™&Øs₫î÷¿º^?ưü§?ư‰æ9 , ¥Âƒ™„?Üđ†r—˜—+nÆ…M›o··?ưéO?ÿüóư~ç3ª?¼!̃‘¤ ´Í› [9ë$´H®bÀhû›₫¬-z·…¯9WïL3´B±o—íïÿ₫ï¿ûøƯÛëÛÏ?ÿụ̈ơÅ¡^D&I–ÅơÆyhÇ^Íïd¢/ê¶ÝÆ£¨\ÖhĂag‚…€ßÍö®ùÑüak[åæ+A€@LĐ8 O³÷uÅb˜D!ó8ΦvéO?—Q̀@W¢e˜—§KË)K ¹*Éc"aªRåÁ­iÙT×n•¹ó7mÖ€ÇĐ¥Î#Ù›¶1G¥-A¨ÖÖ¦Ï.w„·( ˜SUá#„L×°q´c›~H ½ơ‹y}°‹‚l›6{ëv[.̉fË]_¾l0([°¨f`I'9q²µ=®R¯«±Rií3ÇŒƯc›Èß}¿mm‘­m@đ~¾>¸ø#µ±Ïb™\€Só£ù ¼;A€•’óÿRöĂï²V Ä?TUôÇ_ÿø»¿ûƯơéúåó—?üÇÜeEăLâNT̉£y¹Ÿ)ÿ D:Wsô*ù?_2³åÓ§̉ó̉Ïqu‹¸PÈTx#>g)^/̃đuĐso-̉¦G.—Ëåz™s̃ßîơIƠp‘€r£SÏ/Fpÿh™7g½†únG¿û…-¥Bÿ­mgMT”ö¨*”¯Y?kÎ÷O‚$ÿPư“/ao88ièMs¶«² ÂR?ètËy¨W \,âô¿Tơ<‰_ª X¸s=¯r¤`Z´n&~l”~´À®̃SyeÑ›ˆ¹đà+לGMh`Îóúó7KÚÄÊmøïĐ¹+f;p›×¡̣E¯?6yEó]1‡ÂMQ¼x¡pñđ9cÔƠˆxÓ«<•M[s£IçLUTD`èaE${rÆ„ơH/\úåééééöäKƒM䳯°æ̉ÿ6”(¿öh)ó ==ưđ«¶m{{}}ÑrIV<<¾—§Aƒ/“T¨~;z¦á8ȔεS;~ÿɧ¸}ê41Ÿ¼»eƯk?xȵ.% )Q®",ÿ+(@Ă6́ ؘÆg!ÄÊ)<“&t.’°‹Ơ¢IË ˆ²¹ç@"”›97«B\BI*¤Ë|¯Ị̂@÷_k…YwwØqè1§‹éÀ²‘k'<€æ1£ jb7Ûæœ£Ñǘcëúpyû0|hÙ«1g˜«gª'öäwJ›¢XÂ÷̉Êë­bïu·óÖŸ¾Æ‹5°h¸¨k– £N»ö«Ô €$ ¯„Y đPÀP=i‘Áư…˜‰F₫÷;̣¢üœSæ1B«3cŸ4!±% .‚¢đ—©`¶ƒgg²MSl·9–†É₫œ̀K¸j́ơṆ®đaŒÈ+¥ÉÁU'侜vÿ>¢±—ÜÏ®QU3æØ‡‰a¬€£u{ÍAlUưôéÓÿoÿưĂÇç?È₫̣ç¿à­èà¶₫ÖÊ„ĐU/ˆ¿₫Öà´ê¨×ÏË–Ơó'úøµªY’&)®åª$mhP[¹)ÏàDºç±§""?~üôñÓư~ÿº­́¸É~­»8)₫!Z¸ÿ!>o™iåè­ç(æd×îÊŸS@Đ‚§‹+‚ü{h‘;’“3®€•* 04¤kR0}Ík9ßßĐZ_•fµR·OB.Ñ¿-'€ °Æu‰ïW'\VÑdNŒg<»]’;8Í6¯B”HÀ"rđ¨‹p©tÑIS”ùô•Ká'³3±e»ín‘Xq…œƒT–Ÿ––Æ®.ơxđ‘™ áä§o ï̉×ßb6L#èÁ÷cÜF¦ă"3ï³s$̉5~ưMUơï₫îï~ó›ßÜn·ú§rcµ(-ÀưTr4§AÀMÿ,?gÏ ä¤Åƒ6vn&â|P₫,Ч₫æ]Ô@ôíííÛ·oMå¸Ư„¨.ØÙ„Z ̀Rê"ŸäÚdƯ…Đ¿¢ -€iÀ}•3Ö¯e¬çơÅøP#Ăk₫=¾•ÁÁ4z }>¤ªÿ)‘ç?üđă¯üúåëÏư™à#¿@iY-ƒÛöÔ₫_µ9×Sçªơ#Èđj{ë—~é­ĂnĐ¿zÿ+=ËëpŸÉS¶†è²ơx5袒§ªü#yú µ*ư܈s꼫9(KGK©Ú÷ǼÙ̀² Ư?ÈM¬Îj©³I\2–O0‹3Çå4Ó·?Eàô§æ¦2ä¾ké¿"±“/_¾øn ˜²ơø‡¸÷ú§º¹ó„ËlÆ)ÀͰ֖`¦Ơđ}6zn·T¸Jàh¢É}› “¥·Óz3‡ Ø®*ˆR¼Ä@„;^÷Ÿ–À.'FE0/ÄÇGˆOÑ̀¾|ụ̀åë—1†Ô¢ô"x"6* Û¢ă¯ G?F/‡º(Ê"O±2¿óIµÙ¼91æÛŒSR½^Ù_œ¨ßZ¦_´j¾o´đÂAE‰ªº(t#CÊRn!%îưØÿüç?ï÷Ưæ|{}s5W„g]Ă¤Ê“lkùp«²–đMÿ+Ä\̣”BíÀ5—bU9ÍW^ă­<Ä^́H–í>¬E¯ƒ+A&F“P³±–/÷„h·LŹ)è ª[syÎvH¼4Ji-<…I+h)=Ê-‚ÈbaF3¸%¢¤ÖÙí®K÷<µnY5 ÂPÏè½êO¿5·́Ä¢øµI{*yµ( fLèëqÍ9œ̣4²ŸêæhkÛ1h„đ ]:+Đ.úôh¸Đđó̃:ĐEka)£""Àxf6áÂ?Èz«Ó"4êu‰8}aâIHÖÏÔ ˜·Ï°¿ªÔÄ’îI‘U&MVd01ºuúa/±ÍÀÖï²#@Ù€6—™ƠƯ•{‹‡:j~ö±Íe¬€LíĂR÷[l₫aDæoN1X¨ù½¬"¬̉zÁb„Ésˆt]́En$,Rß—0àHx @ÖøjZ a¤Ư':µ¢ö©̉ÛâïKĐ/„₫3óׄTéPíC¦ö#^ƒ(ÅyĐ ÑgééËœÀ´yÈQ¤6e"ç…­‚6lm̀ä&úo%¯TÎè—ä O1vŸ—U…R©zúN0j²¢&Œ®^B³ỔÀ¯I%»r®â¤²§S+dÉÊy}}ưù¯?9-ÊơøE9Prÿ1½r­²)˜¡Y:æÙ;ëVKzw⟈ˆ·¯+ h=!OÜÖÚ±_¾~ö+a·Y!QW˜Wü-ưO(ÿOƯC¹y.œÔêgĂʵGË*¤8`ø±Jåøí8Ff̃™§áÆ{–á§#ë(úßÚÖZ»ô m¨üYzS£üi·Y‚±‡ó ï}+rb 'Đ̉?8#´P”̣o«Rh̃‡üFy8Vg`Kóö˜×̀C2%ưU;c0B®¬¿…$ׄØùlˆÎS³FŒ®ŒŸ°…“DsJa$5g´tuƤÆ6UṚuËE”àÄÄæ1úé§ûq¿ï¥(e­ư]vé`dÈæà¤L̀²ûi†Ä(x›æL"Ω-ZI*ăÓ@^â±äƠ[«1'éül Ƀœ₫ư–©¼ÀÏsW««ÄÎ/4*ˆ¶ó{DM| ~–iZ‹dYתPwC41m.4Í$®™åY—ßYƠü7¯?r)0ôÉ¥Má»-!JáAÆHBäƒ6K‘Ï,gq„^` â2lºĂ#åơsÎư¾K”Đº©mYy1çCVÈΛ‰ă´ú Ÿ¥ù_Á̃₫NC€ZPyÉrb´½ü`Á*ÔDL€æ­F©fƠDDq̃ß2®ÆïKˆFÜ[kÛ¶Í9Ç(ªúrܾ§ê[|PË•‹ñ ́G}!3ñ8åj²¥†ÇKº¬$~¹fëœÉ: l₫̉ "SÑ¡Ăé9iô“¶Á‹1zNĂXLe^†˜ˆ[ c­yU€cưß.G;.ư2¦#Eàî8æ6Ad$z²W`ŸiîÔlÎI@Ï}̉ÂFÉéi[` yd¬Œ9>Ο¯¹«ˆl̃®‹01.‘ŸhåíT½PøQ†áO6h¬ñµ@ZÓE ©ö™)ÔI¾Ÿ–#¶˜dÔPDd@úÏ£Í3̀u3¥i&6ldN­¢ç2|U²ÙÑxº –HX„¬ b <©8`Ùâ(âAÿômßO\T}Æü”eÇá²ĐŒ|…XöÛ·o÷ûW™)‹€BRÔMË{ĐŸqj¸î8ʶK̃ËYf₫-IM§âKCzZ9&5Sù9ÚáơÉ‚¤åLƠyˆOLÔđÿ‰úǃßSVÛLƯû„Ô)ƠÿâÓå3èŸÑµ»ĐÆÁ€S–El UU™£Ü8x=ơÆó°Œ¾¾¼¾½¾IR´1&÷ª›’‚[:èBđ‡”ÄăyâçÍ÷'₫ûvi—êü“€$^zrĂ*>ă˜1U_½)àñ©\2VkmZ’æ]ñµmÛÖ·ơyI噄;×÷R3=£³¯PFÏ¢½Bö3$8ǶXñ`"4ê説:1Ù<$’MÚơz½ßîÖLQM¦œ+È‘å óûù'PjA“å7ăçÇqüôÓOÇ8öc?¥dyÈƠÿdejb VÎfoîp³¨ơpk­µ3ÜL‚ëO–K ”¶kr¨Hrdgï̀˜ `*@C̀À`¬̀›å€ Ú[?å&Ö_«ª$/ÿ̃d¬4c.Baœ'.í₫°ª‡° ÿ0 Ë"CFò°Áàʘ¾*eĉß=ÖĐx:•€SÏ_¸¾?́V3 Ÿ‚ô F|p5ÅṬ|¾PÄÀZ”`,»Y‘èÔgÑ¢/ù~*\2éƠV–¾!ñ⣪ Úü¢pœ(E«—'ÚÆ·uál²6&ÆưÖ0[ú…m¶¹I=Kă‰dGïđ¨>‘e矠ϩ=Ag^b́œÍrj(ˆ=„yª\é1¹*₫,ÇO /óŒW“«xÓkh;äÀAƒHèT/ Đ!Á³pÿtdf›h¦}È8ô6ºut €m(`êf[›Í#đ÷¦Ó¶²5NKiÙ-Ø7|* !Pº×óc¨ïIBø}£†'OÍ`X¡Ê¥_!r5HÀ¬Ê¹UDŸôL4jưÅÆ¾¿ ÿZƯ ÜOµ₫“rªzüdyŸ<#«}$Vt÷*h)~îW‹,ÅÆD^Pkat+á"ˆ"\Hô_Ô|eJŸyÀé’¤:˜ü[̉xá“ιœ¢áß/}±à8Lb,~"¥“Ö™=·û ¨àGG<æa‰]f±üO¦Ó5?pÊTÖAđ¼^!k¥6&‹*O¹ƠÆaÉdÔ™ïc>Tự Ị́$Œ­.ÛÚ!¢b}¯U »₫Ÿ¯Óhư93HW¥GëR­ag}X•ÁbĐH°E±¬kđ¢ø̃£n:ÿD0€¸hƯÿÏƠXÈç¶­§æç]ñ6G]Ơÿ$Kü¬-~55ÂÉëYu5J̀Gj~†î¹œÛ¢û¯É½OŸ>]/×ûí¾ßv¾M~ºưωÙ-@DC&EüÇ’¤~é—[׋œn¡–9áæO~ø₫ụ̀åËËË‹¬zñËÓåÇü÷ÿwnGHTïùm&YOFåIeàx åÂ)B C¿zܽ@ËmfD¾,û÷‡Œ¬ÖE^{ºsuüCF×î̀‚ºĂA÷ª×lê¤k !µÿQK¸¬E¥₫IåZ¥àŸá`â¹B¥síçÊ]í›—PD#c¬B?c€èF\uË©o~̉y*´N0iCm¬á I¦6ƒpÑÉyH!P“«¥Áå«2Ă“;ɺ}i”ÚsiÓ̃KE‡¹Rå˜Ê‘]nY»r^¨Ñ§‚ås- p5t½ß||-ú11Œa0{b»b¨ÏßÙç.TíjÀtm½<ñ3~¡zBvwíuS:æáeÁ¬Ílö,êƯ}Ơ6Ùà䃭l̀2Hè-·z§®̣ˆ]RvÎ[G>ÊƯí9ÉÍJ—HÏ_Y.?³Zî¹ƯÖ̃qm|@`âœêjÓ³C]Q êúŸ>³KÙºac—xc̀¢öz›–'ªÚF›mº̣'xº>P*ë°n½Ï¨›%‰9ƒN LÈT•̉ Ï̀8ˆ'ú*Lª¼T̀¢åỜFdkÅÑ™ưđ3jn`ÂÊưä¡+ô×Aø—^NsÂWd̉Ös•kÜçN­ èߟJhó¦Hü9̃p†»ÿBüó ›÷̉å·ĐTŒé•¥„Ê_R«Â‡uÏé}Dú¿-#Ï@¶™ñh!¬¼\®—¾Ù˜·×;Øt–‰rhÚ®R%;U»/´lª̃ÁËóÖü¯$ÀO ÉC]i ~rŒCUƯ"f&ú?Aÿj¬k,œ(w½ùª¢ĂưIËøSY)R÷RŸ“æç„₫+w‚̃té‚c=%+’̣- ¥ŒX‡ê'àd|HçŸưSlCƒ¬p8™cPNèøbƯu^voÇ’…+…øïsÿ‚fxœ±'ÄúĂÉ'úß¹-s¹A?VG£<ù¨B’W™~/wi)x[ŒG[[₫3Vư§ï>}øđáÛ×—¯Ç—”Å唋 ú6”5FJöΖH¬nœœ´5 È‚ày.˜±ùZ}ci[»<_{ëû±ưöµ̣à™0Ọ́6¯v}|B(¤RŒŸÄJÓ<è_bœLË̀ øk9Ăk8Qb€62¶á—4Ă’¼-NÿF?74Ö-f¦*^fÚÂK›«#ƒ{wü{Y)ªz/?n₫› £oLe:Ïz>bM2|¼ëŒüYا)Rr;iªümrÉ/Uè©""¥˜[Lr³å¯åÖQ Åz™!ùĐ€₫H>L~d$Of1G̉’Æÿ\Án £RÓ‘Û&DxÅÁ<_’^OÕ Cr¥§X;mEuZ¤Û„ÈNç¡-dß¼BŒ~Z₫Ol3ZvW^y½°~Ă]E,ôưŒëràQ^ײI“†£íẹ́ÔZ;Æ1Æ`P"QÅájux‚M_§Jỹœ`Ç]Ç̉bK Û¾`ÔW)ç°#«ÿxÖ`z3É7Él°.‘@æí[:DI4”àYé·µ¦í˜BJ¼`é 8ơ½ ħîmŒ6éB d0ăØt}tëh†*a?•LQGñOÙâE<)Èá¢̀²n¼6eË]ơv„ơ JAUD6B=ï¼Ct» Ü¥ØûhhW<%>çe^8Öâåïö‚'Ö÷y¯̉ÿ]ÜkÜq‰8¤îŸ }©Hó®ă59^¹d©•Lagn…u¬O¤ẳT[ơ~÷óÏưçú7ɰü}?­å t¸1ƠH€“^¨i©ôªP<»à±R¤̃*<‚‡åÏÍŒXu'< ;;jÅ¿ón¥¢1‘MỒ̉Œ™a}n¶¼8A„:Àºg>¸²†DKŒK¡k÷?cdƠ¯×*‡w5·rñ#–t©„)Y)»‰D(Oöv̉–4›W £…×u—©;~½UJؽÑï”ûư~FEâÇÛ ¹9V¨sΓƯ4?Tÿcṕá­ß!ƠªfZÛ¦®ù!â¿´‹g`$[k­‹³ Ḱ]æ3ú—”„-ÍØ̉·@B͘m¼bÑfÉ…|¬̃®f ª[ß.Ûå²]–DGÉáœR|XIc×ôK…₫́.ÿˆ³÷sL₫2æ¥?ÁívûúơKkươí•n*´;ÜưË·/„\™ ÅI?ư»7 ²–ç“èu‰äû¿4ËÚL@S¾/QÁ U‰g?p&…7é¥-˨ù™ê^~°J_7åê0F̣É[Ÿ;£·”íVâU^aÏ™XD¿ynkuXøWëz**2ÅÄ÷á Juu 'pm~ă:9Ô>]áiaMÖ3K"¥ŒED#TÔÔ’5;Mo~Í̉„+ ¬̣”Ѳ@%ꘙ‚Úk̃ù/ç¿›a~"è¡N¢¡;?Ô•6ÇjaoơơˆÉ}56IJ̉ë“Ẓ¨ŒóKxÄLME=×x&¾¨BóÓ#öéÍĐ¥\@®²°x—&™F .@₫û¬ F$Đ/¡AX—.M6Ù.O—ëåºß÷û~Ï3KúỔ¼MsÍ̀CÍx”ܲ$@?·>—ÆÍ¥³3cyæÖ¼“º —ÿyoYm[ùSºÖü@8úvëÉóÎD¼câ‡^ĐáDB·€ B•¦mȸöë§Ÿ~ư«å°Ï?¾·̃:j h­m¶5:wµĐïh¦5,ʽÆ:|±°×Íh$̀5‹ñ:„Å¢–'æăˆmƯ´¨¢Ûâ”+YRÖée?&?9” ¹ÿIêăXŸ>ƒEôϦ]^æ.ŸiBuĂu¢ó?-GḾ²]zïÓ&;’ȳ'ˆ“dO‹xƒÑ!ó!`ñŸd‰OÏû ¨™uéTđs1½÷ÿă¿ư¿₫ơ¯¶¾ưë?ÿÛœ“ô@†q•ûO`ḿ¼]b;Gö¡ !úOîŸJh ‰$F¡–ÏU+Ä(ÅÀgÑưÏ5‚ûe)NÉMé]Z¿X_›”°fúK|™ßºŒLª)¢ưœHùOz₫ ÿtùƠ¥gÚ¡}J©cy„₫™»ˆïĂRyø—£E)p‹~áÍߨ>PÏÓ¢§î'yw(h>‘|-[óNuêy¨…}ÎĐM;âŸÓvúx/Ze{QqÏŒ%ZéáODÏ£Ç÷>ưqM./¢¸óö²Ó—å”<R§;å¼ÿûË©C¾yë #=™fA˜T¥>²Oñ·¼gÇ,>Ẹ̈CSoFå[m`Ç)]&p€ei559¢+±»âƯz0Ơ¹Ä5’ôh«d· $@µYóâà©£ d9,”I1Ï™À­M™ÚôùÓóïÿ₫÷¶Ï¯¯__n/¨ hÖ†‹]°6Ư-4Àƒgí4zN—pÈS)Í{­a´M¼¤fƒ±™ &ói±ÉW"f»ô T₫$³QDâŸuN$iøP‘’!®"â§ÏO-%¬n@ÿ'­¥öS@Æä|·3O6óu¦œÈ́û¾ÿá‡ö}ÿ÷ÿwôúå^™J: õ%X„₫¥kR‰„₫äÈƯœÓ`ï.fÔúW–KååÛ·Kßöû·rH‰û¹btÙvµÈ+jÏK**~Ơ+§â9ÿVƠq÷ÀÁ₫äÉâÇóªà’"̣î4ú\d „̣OJ 2¯Öo¡Ô)$cÅ…[ÿđk ÀH5A%me₫¾T¼KÓ ¨YÓS¡j—X̀‚Ê„HÂøåÙ@©’¸Îm ±Ôj2ºævRỦ¶}x₫`f_>cT0·v É`jÓ÷[™ỗeíwÑ¿ˆ[4™WU§üûBü_Ú^@ ÿ½Arø&iÑƯƠ˜;{Nk¶ê«°8t÷:úçäæü©™ß¨̃ñ _ûéçxñíåÛ±h2­Q` äbƠiơỆ>~r’¤~_%¬ŸIÿ'ÓQöË<)?áö""ó˜§É ‘+WȦ-u ç@.à́Ñ¥WlMÖ³²qơ’¤äÜ|Ç;ưyª+5ĂéơHûÊ $ä²û(µ$Îqă’ Xy Nï’đ±hưđ4Z‚¿ *Iê»1 €]ÂƠ)Ñ4€:%&œ]Q‡Çô€IDATSøû&ôñÉ•ØưÔU ®A" ;@—¤”o•h —‘·±1³¾b™Y?×ăÓ®¤k¼„qOai˜ă¹&F˜âé&¥tD‚6®›á~‚E¤³Ô×f5¸XÏÿ˜·ṣêØSׇ¾Kh:Jwë ‡PZQ­iÉn]ºÜî·mÛáx´UÙ5Ÿöå¬43™¢]çœÈ°Y­–x¸‘=`ÉyªƠ¶k1¾'>ÎÂOp $*gÏYôszƒi¶ P O´Ï=3¦ÓæĐ‘eñÁ¹à !ûi³M›­7Ùôă÷dlr›·cÄ6fŸđ 6g›½yz’æà”´?Ăxm íßœs»l&6ÆØ}¹¤̉Ê›Ày“WÙ¶§Äư*ˆ0nÀ¤èă{¢üSVa*ê Nÿ}̃Ữ'r»í¬ëÍJ_Øz ‡*Çœq3{{$°*6mÛ¶Ëå2Á ¹̃¿Ă KŸèƯJtƠú?ÚóøÁ˜¢¾IËf(÷Àâ:æñÏÿôϸüáơåm3 ºíŒ Î D ̃y(0¿Á+èo…₫ïå'«ØzÚ x3oè4ñúäëªí±ªi¶Tàđç|p¾Ñ•Bđu´Ó½4(à®kăá4Ù{b† îXà>*€“aåDè…³<*̀¯êLÿó©ëHJđ8ÁO€₫31Ñ,{¥Ơ V ¾\Â:UEdß÷Ÿ~úIDÆ<ºêPœó6'­9ö±/ ½‘é¸_â₫¥,]̀Œ¬?¤ÿÎú‡íÿÑ ê vLË=·đư­: æöƒ¡FƯẺq2a+Ó¶äÁ´t¨/'Åÿ#úWÑûư>±x†ö†₫;œÁ x‘'´”TiDh’̀ U=uÀŒ½Oïäÿ #ê­ÉîHŒó́6|~´¬Nù"’b’‚k-z.V˜{† 9̣­è{)Àî\î»#À:Ă12¬O Ä©̀¢S꘣ûÎèÛJ{̀C~:²đ ©I ¾yó`"y×-‚–Í‚N’Û?oûw2„«à{–æ¾ä”̣€åŸhD2àÄWŒA``s¶É>˜|‚µdINZ\¿Y>”¸ ²’₫ƒêWhÅ|V¢É—)º‰5´gV#§“¹æ$¶S¦^äMh4b“ÇuNX©”à ¹•ǧDsL±!tO&·±± ¸ÂVøöÔˆw̉¶•ë”Éyp‰Ă%÷ùcH¡8L̉9mn²ªX€ơƠlöé1[›Ö?₫ùåå đÙ…Ql—Á99£Ú9æYͦ Ú$¯óV›ÑKÄw'¨0£WQM „©'•Ü D“ùæĂ\…@•¨Ê°\Ϲ#Uơ×¢*ÿ.‡ărË^ª.₫Y¨gk†’tÛí?ÿô‡¾µK¿|~ù|;nMÜpܧOè́ÿÚ₫µI’$ÇD5sÈG=º§çI^Ù•¥P„"wÿÿ¿Y^éé®ÊÊÊŒđ‡™â~ppTÍ£º8Së]’íááán¦èppPk‘Ôđ:ê°cV¶–Mûöă·mm—ËåçŸvâLyø‹l@ø€˜Øº.kP`%d#™‚•Ùă_÷ëư˜‰ÿ¾(ïcÈß6‰Ø0 $ŸĐ+È 0ờŸÿé½ä#íQœ*G1 "r½]¿|ưr»̃JêÈZ§¾¯ßùƠµ!ÑÿĂØ¿h!ˆëkl`;̣'£ïW‚®^föÓ?5mû¶Ûn?à6–*V2Ÿå€ÅŒ₫Y›¨j¡J‰ fĐÿt ²& x–=…ÿáÂqAme¬ü@– :ZâBZSzØJ4µÿÇKđ´d§‚¢ư]&,ˆUB¿p¶ «ZŸJI•ahˆ˜^ăÉè_̉ơÍb€áøÑ%Ü&dUuÛ·——Ơ!BYñfbĂssä Ÿ¡çư‡(ơ/? “å¶Z–Pü<µÓi99ç€@ÿGE]|f PI‘o?~»®ëír»\.r$ư׋ÑX[O®zK–/ªlj®Ù©-¶¼ UbîëâÓEe]×ÖZß»íT‰ev3…QÍE¾¹ÎêS~”ÿ·1ăŒœ^lkk­ỡC_,(ÂRƒ¸.!²¤)ï¡t "‹ç.ˆ¨ ÚÅ uô û2 "Ă¿urk9®|+ 8Rt–µ ‰ªñû+^€z|ÉÀ¤±ßửû8ÔŸHç;ux±m˜H4$_ íĐËû¸Ñ¦.Â4nHeu”œÁ “Ê2´Bq‚ß’'­È±›¯3|ïÔKˆBǾ‘qVv²8¸T•$¾ô]±åååó.2̉uåUƯu÷éF‚ ơ¨z‹Ñ«àF–×ĐΜ×î]T ñ‚ú½̉²Réq‘Ptóˈ†‰qy ”×m&^]°û ¢9ôO+¹(å¢Å–¾xĂà~éÛ²µÖֶŸoÙ~QÀ>E¿Eh<\ß^©*nñ náPˆd‰6w¦4à´Đ=xïs OI¼2£U©m‚2Y’íêŸJU—œFEÛ`¼­[ßÛî>NAµ•™}úéÓ¶më²¾|}Ùöm‘eo»ÿ×[đ¿ơE—Å¢µ°ëî4k­…ç!áÁ ”&K[N멟ú²,½áh p "₫󺶕E÷b¤,ù‘‰Y+:ÙÍœí“ÍS‹åï?{Ä₫îơ¾}Ô÷ä§•thât Äû‡Ơ»@6Ë'àåååv»mÛÆ(hÆñ¯MY “|†sĐ]k ëT{¨NÉ)TăRo׋M–ư­àëƒ]း孑øI‰ëŸßĂ˜›?¸§Æ\éöÈÆ§ö^ÈL)øÛ^eCÆ&÷g­@- t¨Ê#ô¯@ ù‡ˆ€"Éë¬MQ耇ÿ©Osn©ñ©0CrTâªĐ\=ó¼ÜQ4” ö†¬Ëdáùk F8ªÛÖ·zCú=›©±ø’;ĐÑ*ÅÏ~/Â^êkưªå—&ư™ÿôÔÿ ÿÇ₫²¦ª‹.•ù‘HƒÉ÷ß~ÿüüüù§Ï÷Ë}8Ç@ ƒ₫Z¤Ǻ±̣󽤇¼exÈØé, —râƯù‡Ö,{Ză×ÂO{PưVQ¤X‹…ùù¨Ă÷úcY–§§§mß®·kÅ)ú…ØŒ¼/ÔPæÎS¹ơ¬ư³‚haLj°k/y,C_>•Qđ§>+¦X³²V¥BËo-@3ă0©‘NqQƒ’Ó̉¤úà‡¤.À¡›3ûqú2…vM•äíÀsÈ ©¦ú‚e6Y₫)†™ƒ9mJ"BÎ₫AƠ˜"n*½âJy©¡ăaѶ µ"Í}Öo…ëˆ Ăó"Y§áĐ rƯ …Ú¦̃’¬%úo^·¦ê‹¦AëDcèZ¼îHÆ fĐô{̣Ç¿ù„UQ÷ê%Ù ÓªĂÑ€<ÎGLƒË®Ñm-H/=u¹Á ĐŸè?8-Èà1ôg&'}U©Ê’Uà u ́ú́Æ|µƠË-Ö¶‚ÓQ™aíˆG¤¬wHÍYb2¡ É%ÄgÂưèÙ+Ă—g>™'C ñ_víđñ†ˆ€?Ï~…́}5.æ=½rÆS4‹'Ù\¬Ü6ä<ƠGSá̃" ê>€çCØúÿ^^_.·K°4¬ ₫[%ÚœÚi±¨ FP̉b–‚B¬:aEE¶ms îÀµv{îläbÊ|0×S;ñy–Ư‹f<× Qÿn½ïU\ïÂ>UAØ‹̉ăÿ̃÷»S}î½sÔ·Ư4JxđĂ^A1ȉF"₫gú¢# —¯/uüóÉͽEUåψ? ‹KèQ%¬­[­¹á‰iÍ„•-Ă<₫ÉdOÁM ƯUKÍÿÁÿơºJè́ àÙ¥ÁZ‰̀ xHĐ³æ¨?ø‘§̀²J›Y.’Œ2¶k bk( Ưđú ¬ÿÂÚ̉ÖuƠ¦÷ư^+™Rx3G j«ÈÀ8*2’₫iy ê_ñ‡%)ư9,r™é¿Bl ̣̀ôâA6Œ&y₫V¾>”ü̃ûưׯ₫ÓưÂsÄåFÿÅ̉è₫[¥öDøÁđʺ¬O§§óz*¢0Ï|̃xó0åé†iVÀă •ÊJĂW̉gơNÔŸŒ©„8Ä{ͼP§åt:zï·ë 9NF!®;Æe¾mM ¦÷Nì_‹¾EdGÙ₫`‹ñ"G ÖÄ £q5"\̃B“Ă>A|!o¤̉o°c̣OàBÿ6v½eÄ™kBåZŸ¯ăœ‰ üâĂ‹Xÿ-~Ć'ôö _¼dÄ¡g—¼cđ=Û–1LÇçâÄ`êé;·L90Y)„O8<Ç­XÄ\Z¶P+Ø+,äY Ï?'kƠuï»{§bâ}*’Ô‰˜Ú£^(|Ó]vßSØ8m•èüŽï[ÛNvÚÛ¾ë̃×¾¶u—}µƠ{¬Ëê2A>> k €HÓvy½\äâË̃SÙÈ̀D u:Z¨À-Û _'½L¸ûÁF¥’Ñ¿W{ AÛgŒ÷³Ú—óĐOª‚‘(ö-”™aË8{*>©=5ï`:9LR˜l„h%ØÂ €dˆüÚ\s)Ó¬™̃bèï‘ËZjtÚYĂqc~ëŸß;6B°5¦•Ù`eŸñúÏ\Âÿüá@!tó’_÷Åù‘Ñ[Hˆ üIØ/¬iƠ°L):K!öÈ{8ơ?m®Œ! 8(õ±`€ÏNDmàNøeHM°ï*i:ûJrư*™W "2SÿQÇRA5ëi%#L<„$œ…Lj"H ©z{Ù́İüÔSEˆU@ÏDÿe„₫ºÚÉË£äfbÚHQ7üüÓÏ—/—ÛíÅóÙWƠW"éäÚp¢G£¾Ëµ₫[Ø8Ăƒ ­ƒÛ_̃–¨xă‹ÂDƠ[×ơƯûwÛ}»\/€Y^` S³ˆü†w pàoå-ÿÁ~¿ÛËŒÂc—iñb9ÊÎÉÁ!ê?fx¸4mHĐ¤àªØúY&âjeeaÑ&µø“’üÆô÷\x?†®—„c(  ^êí~ƒ̀̀=°FñNm8áKp¡°d$È'V‹€«Ï©cDÔH„yÏÜy/¥<ë/¡ÿL¼LP¯Öà g§}ß3v´¬ÈÎn…˜Ó¬8Ẽ„:‚áÇäm3ßƯÁe­ X»`¬•Ó8D¾ZœÜÎôTƒ¯nU-3‹¦Zdñ¼´V¥Qâs„YÛm÷}£ù´ÇAÍmº¬æé%Ă›%+đ…x.bU{7ˆ^r8 A¿q̃cm7Ùe¯×3=U»,]>¥ R-ªóö'›mH±=Îemúí»o›´ûơ¾Ư7œP®ôêèßëÖ½e˜-ù™È¶æxÔQJ«¹É¤¢Ơ₫ểY0¡)½W€Xø¹MâÈNư\ ¶®Ư³F¢èˆ.-*Ù+BUFrø`µ,vø¶̃,ckSé‚C'úÍ&MYWñlè»lư$R;Ä?OÊáeÙwƯ½Ă]ºôµ­‹-½uÏÀD}K ^a4KÀ…¡W¿Àß¡ƒ.lơC÷|>‹‰×;Ù• (Añw ñ.̀,ÿ[¿÷sg_ä>+‚¶¾˜”Ưu»pư³öt_ àœgŒûA÷/•O‚ûLư{™Ç³–úä’„å…§Ưê ¢_!TSµJN„–ÉØ=…m@-ăW¦4äÍÖó |ÆWđ,#ˆà"{1†‰a„Đm³3µjÆ_SP0„Æ3{¨Üy•X‘²©ÿ%à-$“œ×‡µ́b7•ûưU{¸µîô„c&ÏEîGè₫¡€đ£Ăaa‰́ñ@ñSG¯CóŒLƠÑa%Đ…€©àcÁ œnƯÏTêªÿ¶½¥÷ÿđïmÚªÛW₫ă?   ÿ²®üŸå,«€6³dPÿ~¹oº…].J#·^WÛåS¾BÄ‹´ºÔ“Fv€2Kx½–"•¡×9Ç¡o­×p U°?=jEGÙFÿœ¨ăDÆă„ä̃x²ö¾÷[¯˜¨ïH¸é¸–Fú›u`˜+£`u§É‡Ø± ™ó¼§Æ9¬¼Äđ-ĐùavïøQau3đY 2» ?€ÿ ®³‡…$D;‹‘gđ^¥»óøü₫™_ÏØDDâgïÜ!°w¸¡ûèGñ¨N®~…$oŸÀ­µóÓyY–Ëår»Ư(ÅÛ:”¥;/¢i¡uz|]Z¤XZRŒ \ư¼œ “¡ñfm×½¾"KH²Áăn«®ñ¬ơæçEå‚h çDIÍIU{99%uvƯ= €`ºKˆcL1Ÿ×g„F0Öh¢M¬µŸ¦ù–R”pgô˜èº€/ơÁDù« ¿²$>ö•á +«¢¢´©5k­ÙÍîưnÙ¹,ØYé·Újf½ơUÖE#Máñ{ªáʽµä–‹Ư«ÖL&ă"qHù­™yé9*é¶R&θƒm‰Ö’‹$€5ø–® {£¥¼‚Üê Ư‹UY¤ËÚV!Fd* IÛdSÑ]v¿)÷-5uº•ƠˆF^Ñ+ œêÓ¥»°Ù¶öơ,gwü¼6 [wµPOn H½̀›tkº¦ĐN…‚v¥ßĐª]—eyÿü̃̀®—ëµ_}Ÿ̀!ÿ¾\ÿNº= ?́8óg/}OFùȃ”̃ Äb¾F&¶’€5u4—üo@ âù4™up~Dñ‡Œ$uKư>\¿/¶@!iăÜÊĐuä -wz Ẫ6\O„Nû°¿¦Ö²í”¢2YàSFâá§>Ç¢d0¡Rœ½@g̣·Å½AwqD{±­±à=ĐpX́,Ä”¬FØR ÍåÓœ— vcpØ©« ºƒ©êÓÓÓÓù©÷~ßîỜËJ#Ÿ3hơ5L¥F‰d ~œ°ÜW(}€ˆkN¦#‰C’Mî&g.Ü.;‚~œbçøœ7Hû@äÀ°̣(©«¶¡z`ØMœfe0|?¸{ïÛ¶ù}iUÈÿ°b±>#̣´¨¹f0q鋨x°yiI"‚|̀²‡8ƒ7@‹,Åa…ÜxsV̀¡ñ‚D„Ơ‚°ÎQKÉ놦¶Û¾ơ”ÿE"f‡§O!@„H‡u…L̀ÀùÉC¨$ÿaÙƠÜ<…à §}Tüï½ïÛ¾Ùæx” œOè÷ß/"_~₫̣ơëW¬4ß2ØJU˜!!ÖTY;Û¶= ÷£©ö¯~Ôàh‹Ø¿s~¸äW× ÿ·₫G€9ă₫£—Ç _ÉqV̀BFø‘ö œ̃i]M”3₫wx¤÷凖IZ©­•ÿí~s^–B̀˜2cö/»£—kô·­–2ûđä̀óJÁ†XͰ¢9T/ô‰èø6¬x¨#Ÿ^´.·S£V‰‹ #rÈopi9øíOp+Ó²÷ƒŒÁ'|É´†™Q<`̣̀.:ñ„À¼rXª@Jeß²Ô/:îT­•Sx^Êă:n¹Ê ÙoÈKĐÀúª.}$ Ëé˜̀ûEĂQ+™v÷‡›ö t‹ˆ•ˆˆù–¬‰Z£âöĐßT‰zͽïñÛKMDüEWLW‰ƠºÄÙV›[\tj-‰P4’Ö—(詵÷½-­C»¢ơ* 6sê?04‡~ñqº $§—âT₫ <ÉÇ«å ú&æŒüx̉b ¼A•¢í]+µ0cơ£A%/¦'æ!×~ïüóƯ8¯mïuÜß–ªIC£O¯p6Đ²X˺‰$FëÁås”ŸQÓB2>Ưf¡ Ơ{̉8³¾÷ÊMơ€é¬9‹ĐĂT¤4 ;Ex8A EÁK–H™X²‘+@Ùªø¨m=£å+ÓvÑ,3ë^AWä¯vƯ±ªƯĂœ²AôxM0 Ixé­ï¶ïmßm÷νu¯míÚ}ä½2Ø—“¢yLZö,ÿ¼…¯ Û̀Ö¾÷]öÛåfb·ëmÛ¶ªTs¤~ÛnS¯£ü ôsg_ˆü `‘?›m7{,µˆ÷ç‹óù7E¿‡&L†^•Ûë9đ/É,oÙ WæĂ¾öUn²e8v>«X4 WG¢2ă7—ÙÊM2˜z­ÛÁxĐñ3ù§Ág©JG¼áC˜`¬0e ú„¡´¸àrĐü¡&’4ÁL‚4Uè?çÈç…ÿ|ư€₫ŒAáaWˆ#«Ơ#̣Í~«ĂRL¨Ç2;XÎ æÈ蘱êưÄóp“d₫Ă^·Ù›ØùƯùÛï¾}ÿáưŸ~øáÇ.· Û2^ÚŸ₫ÏÿïÿÙ{ÿÇÿ₫ÿú§ÅÆæ…±®ëüÿUùïÿøß¿|ùRTFÿ­W±Á́ô¿,öÿæĂÏeüCïɨ¿ûÿ®m]GÙ±¹œaWä:´0ÍtÈÅ‹Íànù¡‚¹(¶˜ ±üZZ#ú¯Z \å‚ÊÇi%y*£Ê$ aÖ~––Á~1lμ•Ư#} 7DÀưí! sOî¹Bñx¸ßîß*Q+œ¦Ø8U¹Á4zñpwÑip%árP[®‚₫TWƒA‹_©J«$0ÎQ̀Jñlÿ.°̣ÈHR5µ Ep„u,™NÛm:ˆúG„r| Đ_²á€Đ<¡œÀư)œ –"Dp5Í`ÊbđăËËËëëë¾ï>¿poï€;ácX$™‘̣Ê®¦•9cB9–0ḯ¥›ñªË‚ơn]x›¹Đ"Úä.{˜SgÍ,º.«§oË Ấ“Ñ@«̣TU»vÀP¿Â¨аh0yVå^êđpPù‡@%€ª–{ÓÖ5†ƯLmiK<ÑÅWûÚÖ­ope…̣ŸX6̣ đ+•ƒ‹‚™̣&»ơ–„̃¥;ç¶4ÂƠÆZ¢‚–gJëÖ¬-áꈈT`ºX Ê¢₫±1a§#çĩ–ù'€$Xb[Y5¯0ßrïÈD Ê]ˆ'́Åîè!Pq* à/Fœi9ûÖù—¶̃¢Å¸¶½ïѼQÔ¨`ưŒ´œ¥³ÉæÀ åï¶¶µ/á5Hº§́ü ]Úâi ,T?³ÊÔ¸ÙS¹U¾Î̀Ö}Û¥Ë×—¯fv¹^ÜØúÖ–öñ›[ß¾¼|¹\/Nv¬bß›Ư¶¾ù¿đB–:*™lŸ­o¾ưøpB6\²$N¤ ă[è„ĂEU›'“g¢Á™´ S‚Ư[1¿Ñ‰„ñbsư TÂÔV’/WX† 9}›—{%1É}%sư]ž¬öƒ´&[p`đ¯†˜1ænøø_đ‡‚?ZCäwä”q²E³9<ô{+L6º°TO Ù>à₫h4‘å,œ1¦ĺ¿6MÜ4;yCă·HPĐđØŸÎßưî»ï¾û®kÿôù̃0œd‰\?}úÔ{¿ßîk[COMt6÷YÁƒ_UÚ¶‘Oö{¿÷̃!úùo ưø¸«’ÿK,ë¹ñ伜ôŸôäáÿp@̉“h©¯ă›™ŸŒ¿ªpUñ–Ơp!¼h)Iü@†yDFªÎY|y&oü–“YmÄQö:]¬'⇨;´]¤…4₫̉—̃³&Ờư–‡Đ\دKº”…¥àäî™ih™ŒuÏÿ æÍÅFK1nÖ ï2éË7‹_FÏ|…S ¦ÏËÜnøD…ÁC½>Â_“ cec‹?Ïs2bÿƯúj«ÿe„½-̉D‹-^±’€Đ’ÅMÜMA”£ăáuÈ?Đ77Xöt*oU^ißÊQĂ.O8×aË~aå‹A£ñŒJNV· T‹ƠΈ31§Å(w¢í¬¶ G¨«Sü»ưl²º>&¾A¾röc‡$¨ë·zÇ€̃]^ÏÙz~’–YΑgÓ”…ŸËÀ¾{í¯™Ư¶Ûm»yŒđ´¿ỹöíËưËe»¸ˆg~úCé¿ô={á₫âŒå¿ôJ;X!‰BÊơÔ]Üœ"ø×êÊTçzÆûqö‹T÷3Ÿ1|Y÷Vÿ2×oNÚÏpÈå₫—·Ï*^µ½Đ¼UeO«ÿE˜Ÿ˜?È„ÛĂ´ŸñËqádåÆ^́ HcüCó§©½5P 6K¦ øßk[ŸOϧơ$&}ënV"9r¶$“›GIL“ÛOªîƯû^’ÿ=\¤¹öw²°ÓŒ₫É ₫¥­e{ÔŒ ‡`QQYÖerkËâ¨È̃÷ÿûÿù¿9æ7…7LlëÛ?üYL^^^@.GâE†z›lƠ._èđÚSü̉Aï\ˆÂßuYÏËù¼œ×¶—3„ÿOÿF{`ïùeøyÛ†`"c¡kă~ïơÎO8-¬À.¤ëX0ÚP9Sè¿=ưF~Ü?S(N(À̀ÄÚec¿BÔÊÄ×’1kŒ8ÈôÜLDN§Ó·ßût~ụ́ơçmÛ®·«A-”~ÈLëÛ§CiǽÇ<-2̣Ö>¸ûM\"Ă}‰àǨ,{ÿèë²|B₫C@sÔ¦Ïá`9åÁŲ.“îN‰‚üI¡,Í~ÇAŸjSÛ̃Q₫„•qUâEŸB4˜¸ª”4ª™Âçqƒ£̉Ñ/́ÊaeRÆ )¸0"Z2›Ñ°,*"”Ä!Z‚Z×Q·,5Ađ>ƯG8Ö†̃j»íƯH2é„Zámßn÷›o.ëÑIM²²!v^ZVÅ8·HÔKê°E¼63Q‘­‚¢­ öĂU0®+j¹ œ‚0ơJó[ï ĐE$y ƒ®Ëºơ­ợ¬$Q̀xÍ ¥×pU‚KƠª ØúÖ[©™Ù*k×îx4Ô„»ÁïIJ;bG­Ù²,ˆư»́iÓRÍb:]wădÏä¨F½Å‹‘”Se™ X¶# â÷Ö r ;G7z.ŸÖ²[é@" .-ê7b»(Ư]O{®]ºD[:QÏÅ%·J]Öeßöb{Zàga-¶,¶ỗ½ ˜óº¯¶ú{‚äÑRm«¬¾y$3bIÁÔ»èK™¾në¶m ûCÔßë#/÷Ëu»~½~}¹¿@ßszuÀvŸ¹₫ép̀ÀÿrF ̀ÿ‡±˜¨‰\DSÉ ?)îO)I…ŒLû 4)SC2h4µ%ôéÅ.Ư‡÷BºN\Œ¡Ù¤M|r6ä`º(Ó‘Aô?–ùª.Ërü-ßl™c&½M*1Ư¯¢m«voơfªd­?O3́…dV¤%ˆ@µ¶ơưû÷ï̃í÷ưz¹n÷ÍÉ?₫o¡7 Ä"®ƒÅ¿)¾±×ơ×=é@¤i>@æm*Ÿ `pù€Ç’ßÀÄ₫ÇW{̃Í÷öëåơOúÓçŸ?ùúå~¿crÜMú̃—ui­ỹb@ÿ™̃¶í¿ư·ÿæ)»0}˜·ªđ—ª~ưù_øfY—µ¨ÿÉÿAđi9Û9T€Rô¼ßß©éưvÇ’ˆ  Hß=´‰*´“7DÙ)Ñ™öCĐß3<¼^E–®sAƬú=Fú§ç¬ôï :3çg ÿU#$ƒ ́¦¡üè…¤½uÜK£₫kÍ({…6MưïIü‡Ö'‚â=ÛưF®°,]”Á˜"ị̂׈ç)Ơøâ¿x‘C¿i°ºơ—ËËu»¶¥Ưî·mßp¨àĐƯê pïªCAoT́u¥ÉÚûŸ¼>¯úí.ú¿øvD₫ă©F¿^P%º:óçĂó‡ß}û»í¶ưtÿɲ{F¡@Mmd·)Æă÷>£,$uWfßeî08Ñühœm! R>f8 È€BHdÇ*^EjfŚĂ¡Àú ưñQIضíË—/ëiyy} ¡­D-ÓbËc×`áK{*¢Ä,ÛàôàơÚŒûç44Öçp;́è’^BÅ”Ú@x—à¾d́J æY£e?"ͨư­ưûơ³3`2V"¦·ă7A(‹¼><ˆbfåk $«2ù3œ”ÏTNPp€™fƒOŸÊ¾Ñ=­†ÂÈk"”̀w‡HV )~‚äQ̃p̣’¢²P₫ø6X–uµyaHJp”º†ÂszÈ ˆ¬mu7 -Ñ–ÚMi+û†W–Aư¦Í³£¸> zˆÔ"*\_'u§ÁÄÂŒØMQq]ßûˆ¡%0ˆÊî*<Ÿ>~óñĂ7~øñ‡~üáëå«Ù0­<ƒOÏOïß]n—ËëÅéc.4{ª˜Ùº®!Î7.$óÂ2SmÉøwFn4îeU‰̃M̀ơ‹"I°ÄófQjµÁ^L̀•PáÊ#˜•ŸïƠ73¶t›¶PJ¥2ä@°ñk¬p\B6‡›àûi΂§†zב" É¢ ‡­ÇÆ@‰*Ö‰¿-j²†̣̉–ï¿ư₫ï₫₫ï>ùùüúùËÏpçü2¢?3$>́îô¥"zë²®¶Fm€vdÜ™ñá5̉Ṇc>ëm»yx¾´}ú}³­oưËöå²]^n/·ưĐßnÛ¾ƯíR`vÜhL _â`+€(k_Í¢Ö ˆ g àr²ÿ5k+¶—§W­Å4‹l‰Â=T}aa¸˜²¢.ˆ'JÛëB3Hg#TI­|qư ?ŸÎ뺆<ÙÈïgê?àrD11₫-ᇥêÿ¨Øöi­àñṬK‰<ĂÁ¶®=Is‡¤•OÙưv÷åbâ”7…a5;¼2ă4U±@Tg₫L’ÿ•=´:r&_ćDcÛo Á²…£ÿ»ïû}¿Kvo­³yô7°rbA9ăÛ7‘­o¨+­¼M'Ÿ­÷ÁÈ=û™̣ט<œöoté ôă3-ZÈÈ*R \'*³ă+Z]Fe ¥ @²́ñ́ß5ƯˆÔMʰ đJëÁù ]HµJ§¨øc̉— ϧço¿ưöûï¿7¯ç¾¾B0zÔÖÚ»çw¿ÿ«ß_¯×?₫ñư6TÁEYtùĂ_ưA¼|yùüås­‰JÙ:÷­›YTÚwa…¨µn›y5po}]VÇ₫Öl‰¤€áˆ!ùc5xé9WI´«DƯvÏ8BvÓ¨É2ơ»§óÉĶmÛ¶ÍW5n&AÖB±“‹AñTN [0ăÑg Óh²Èâi}­h°$DŸŸ¿ÿîûóùéÓ?¾¼¼Àû -ZM;œ}»ß÷Ôöđa.Û]ơÁ>;ÚGÍ‚RRÜ‚‘#ơ²]Ü¿ß#ưw»ï×½ ÿ̉₫ä}|ç3ïŸW|4¢‘ i<ô2"f!JŸJ±}„«~ÇÀ?ÆñüH —©œ₫憇ù(rŸd ë'&±Ö2TC6áx¿ƒ•óéüñ›ÏOÏ?ÿüóư~Wè{eˆå ·¯Œnzđđ»@úG‘èÀÚJX©ÖèƠ@¤CŸ/j×€˜:&´R1=×¼̀WM·ÛÖ·¾¶Ơa%îµ^å°@\(ùMô‡d‹<{èă>:J3kRâu ’Ư@sr̃ưƒÛưăî́¬ß ŸÇ’:"ÉᮤMßyNKr÷7Bÿ^‡Đ?C₫^ø[ư¿üƒ®«®‹,¶ÛơrƯn|rîùC²êP‘iùk˜ï4 yv´ôÁr#Uy@VB1ká{¸ “‚­:́#̀=*’‰L2Ăw`}‚ăå!C.q₫1T_’"§X«÷ûưÇO?~úI÷}çè>Ơc¼o˜79$₫’‡!Â*îÛ̉“Æ@°%Åa€˜éèétrÿ’€áÿ\µ•¬âÓÓî+›_'dáư}üºăc–̃ŸbÏ> µIÙSŒØóø†‚ƒ>̉&̃²-+*ümS¬±‡™ư‡eY<>º÷½ÆđQ°BÈ^áøẸ́Å úÀ Â\Tq̉OŒ1¤T@` ØZrơÈ»¸Èê›™Ñ艅R°ÏÍÄd“ÍƠè·3¯ÄEă•|ƒocAö c·U~o”,g·®½kßmEK8–•(Ù̀f®Ă*Kñ7•ĐYwS½Î3é⽮°ô $i”Dơ­;3Úµ¾w¯å‰ê+àĐœÖÓ²,Ç„ïu]ÿđ×8ŸÎúóŸ~₫̣³IÑä,e7¼ù)%¿é X³EWùD ¯w F=€µ¨hÖüO|*}ܼ”¶l)¶vSÿ×7ø®Hă`sE®A£:(fÄK¥ÅŒªhpă>|èÖ]+|]2$»ø©Â¸¹céó¼ W!—I1ñwºLo­øCÿvKÿÓƯKÓÖÚn»ûºn*ϧH›{́5́oæ$Ư]tjPÔk÷T@HơÅ[z¤]ºơ¥-₫N/ï#¯y‰wY_·×.=”û÷â÷ÏÇŸ@ưÓƠư©—eV(Ê|½¬p¸@¹N Ä»ˆ kø@́aˆÇ'µ¦ưÜîWjA¼}<“đ¥²ˆm8›_ä~) m\[¥&Đk >QŒ$8̃?=đ£­i{zzúƯ÷¿ûđáöm¾â“́3x: }Îç`¹ađ#{êB\+Y=Ú¨Wƒ{zÈHÆGpR).Ÿ`̣OüÛ₫^M02['t``øTb̀ø§…ÍJ€̉!ŸĂÛĂ*W‹ñä`’h¹((Ñ['U¥9ÄËñ#øŸ0ÙÄ.åíÊÛ÷»1ƒ=£}‡·Ù₫7?TuQªúMáÖ₫g₫*€W]›´ư¾¹ihÉ'­ö9çqèÚĐ5³#F:?±HZµ/úÖ₫b¦\₫B#w7Y «hH¾sd“˜?8*j®óÈWüH YØNÖ(̣Tk6ùBXĂUx3Y¦Wđ·ơïxưCGQg¤4 £ rƠ r«,y02À÷å’7ˆIÇ®ôs=”‚F†ÜB ª”q–ưá1 s¸ 01I\ à“…˜Qwªè;k²†£^"$Y'€¢g•#:ëwï̃=??ßï÷Ÿ>ÿ„¯±1%®×Ø©¨tL'—u.H ­e…(ÇOï:±ˆÂJê´´X=84´Ö,꬙Ü9'\¾˜eꬖ­:kO°ØCG%̣‡VKk„4ơƠj6íÖ½¬•j¼ ¥Ư”zcÎó.'Â& H£dfĂC¼á̀´ô®©?Àư~ÿñÇ_^_.·Ëvß<·¬̣Æ¢föùóçüQD¢l¬“ je¾Îç§÷ï̃=}Æö /³/bfNçö#ƠƯç™x…©IÄø½H ƒŒ)€¥ÜYL¬µ]¨Àµ“ñXÏ”¯—ø¿½÷àë{éj78 Må̉%s,Ê+J›>¿{öÄæơz­N”ú:IwÅLĐ¾Í¢xĂ?$*”́Xz/­g‰°-„ơJ€íƯ}›ØåợăŸÜöív¹y»)V¢^uƠG‘Đ̃ơ÷R÷ b¦|v5i‹.î Ô «ËVY_¶—p íCDÿĐư´­ÄCú3çÜq¤;Ù¨ă±é"›^Ñ#–]§Ôp…9Æp ñqD „E@*:U!@ŸFÄwÉ Î-÷×ùo9êÀqD0sÊŸ!¾{è±Đû©Û}kÚ–e‰?§J|Báfjcä#ï¡}©e]©IëqbÖ ú t" €Lœ%ôçÁAøßK¸t̃¿WtÁ@*£°5º̉Háb_÷LP0=‚ưï‚`2®ÆŒ7p”]x-Që#öeđqè®P1́Q  >–¡₫ˆû´ƠíK̃îDôꮪß>₫ḅá—~¨G?/êüå²?ơd́ p̉Óª«7ÖL¸s–L®…áFÚÇÔcÊ–vëbZ® „ÿ¥¿ÿª„ẨRhª|BXµ˜ĂŸçDĂÿ‹NqX•øẜ,ăưÂÉ)­!́/c‚2oN´̉+¸T¹„ÿisüÈån̉vÙ›e\ÅD²0Órzê¥àó…¹F¼‹uÈ¿q|௑? 8'4åª"P¹Àô²˜Bøœø¥™­WP €ö®FW• ¶ÄÆßƒÑ¡j%;[öZ–© ?g¼§5'p;‚›ăŸU”¤F¡̀ ÅVơ ? TccÔØ1È­89˜ $L¸T ÖR"3„Øx§B‹Z!F!©¿ñƠVó'rE‘rM2G’Ơá€}ñ²Z¼©ªö Îzø̉q[³æ0®èà0ÚỖ›—b0 ømKEy¼JfܬÙ*«ơ*«ˆỗ¯—ëơz½o÷}ÛĂĐªÙ›,Ϻ®"²ï{4#Júί}ßÿô¯ÿz>Ÿ¿|ù¢U/C΀ÅS˜‘¬ ưkˆƠØI%G̉±ÎVV­EÚ?ÎôV#ÆË̀²në<ĐyÖ„±eºÀvÁè—‰“çëåÚ–*3 Ù"›&̃;¾TÑØ3K©¦ß¤¹ú­ÿaËfÏq%ḅNa{” ¿|}ù§ü'»^®̃—@Á!DS#Xøô<¼€°w è=̣É2±E–®½Azµ™wqf™ ơuơJđ{¿ß%E~ˆT€mèïAḄ…‹â >*H€íq ù#!‰:’ÇøÓÀê!ñŸáqk;ÚVX@ºH#Z˜‰¢#S'Yíê´ªø+<Éx ̣+g‰„ù‹đìü¹÷₫ơë×ûí¾mÛи \ÆŸĂÆ=Ä (ÎF́ÿè̀rŸG¥ ÜY8#+¹! ÷I’ƯäÔÿrÚ̉Z[uơ$€ßø̉‚÷_‘ƯÄkZ•"ô3ághû•±®QæĂiS2¤ËçXNåúăÚFÜÏAúĐ––ï sF6$Ö|½í@JâƯå½û‚üƒVÀư˜Pù÷=Tµô₫Ûn_AøYÎø·ĐVW₫Ǩ|?£tó’O(xDèHÚzZƯA X™!‘ƒ'@É*J±¼k‡Öe}~~‘ÛíægÆqm°ÉâØn₫üÈ-‰O~ç¼àÔí#D›äƯ]ÏGWv°2 ®Đd(&`ˆpwé-q6,áPÂäÚak`M?X@Q ̉’·¤%  zº%IFốsÅûÍ[Ĥ·P´Ó<Ú÷Ôå„«? NT £‰XI&¸-æF‘ưdưm__¾¶Ö¢'sÀÀäÀAÆ|…wëHÚøÄ׌gÑ0‚Sa¾̉LydªÂ[–ÿµx²ïûu»úÇzŸŸđ ›ỗo[@nR¢GGk¶G¢eC_¾¯EÀ{ß×¶öÖû̉W[wÛW]}̀£Á\”/”Ÿ¿¾́/åXÊü'ÿ'(VÊ!î»3àÚ{VKybă“ă9ùñcV8x3Dư3œSÂáˆúĐFáZ›¶$ Îϰ}y6ÿ 5.ui₫€^«XÙơHĐhU©\á}¬đcƯ^__¯×«.ËR~ÿ­ØDÓ µơ.v¸D‘h₫mcî{Ú«£Ưï(’à3°$…S}Wú—@ÿåd÷_¿+‘”üO„}| ́ ß½êƯ¾ü•I”“A„’Pbˆ~aiE$ (®g*₫àf×å!FiK ñÖ^9̣(è“ÑRé8€₫˜ỄKô/ÔĐ~Hù'ô’ZN«®•íÁf僴q9éW§j s Zkß|óͶm¯—×Ûv2₫Éç¢q9 "ưád÷–eùî»ï¶mó@¯½É^M?ÖrÊUÄ!|<©À?ùl6y– ë[P8˜Â««¾b«ơ„/ÚZ” ₫á°Ô{6̃Úe÷¹‡ ¸®Ëúîư;¹¼^‚Q“+ºf¦ˆÙy#k|ưª äb×°m?®TA¶V*¤=]ö÷%ÙDbƠë=ÂÍû‡“£×ÙÍ¢¡•‡ĂªJ8Ơ‡LÆ:`íơE\¬<•êåzqÜöp$ỵ̈Öå~éGÅb 7€Y1åÿdC†ZE™ Ưz­1ÅoQß‚œ ¦g1bFøXl|Å̃÷hOÛƠb–L¼H„äPI¤Hàø]È ù¹4-Ï tgSS;1ïE(ŸÆé…ú"¨Î÷Ôư”`§ucÄ‹,Ö ª `y%€뫺Ălß÷!ÂmäËå^»\.~Ш :ä‚HwXEKÛC{—¾J¸‹E—!©Ü.À?’½~…Í;ÆÎ•¤Đ ¢ơ°FÄq̣¢ŒX^dÙ( 0ñͰüÉĂKư3…M„Nz¹₫ô™̃«f%ƯƠ¯-¡sM ÿ»oZ<„ ?€Âë«ÓWÛ"ËÚV'}\ƒC²è²,‘ À 5ÔÀÓƒ'3É₫Ṕ¿'Í y€HVØÎf!=€2^otaJoÀÆÈ‚cÏ+]×§§§óé¼m›Û~2;6F` üd±oÍé¿©Ï×ĂÇÚÖÓzrèïlŸÓr:¯ñïỌ́äÂÿÈœ—³O´Ï{¸ă.«\– »¸ÆJT–uù‡ÿđçóùv»Ư·;V~`ú‘ĐÏ‚?¼éÊnd1̃ù|₫Ưï~·®ëëëë¾í¡®ƯÆÉÍ%DÍb¤Î«‹Cḯv–W@K¥‚y#ƯŸ'Ơ{••OF9¢tm¾œÊÏÔMÎ97ਠ0Së°5TôùùƯÿ₫¿ưo>|øúåë¶oø̉‚%LM¿«öH6¨ ˆ”dåÇŸè äđ¼›x÷¡q~c¢µÍÇǰ÷)ºÉº€*j£?!Ó :ÄpI¾å'&C~`e ØùÑJ —w´±B¹÷óñÉ8ù‡F¼:ük‡¢¾£÷X#6ă4Úƒ•F7½¾Ç̣¯4]A«eƒAÀœKg ϳ†ˆÛô·ÓÄÀb±–¬Å£¥2­öùñ̃PÙẹ́Ă9nÉà7ŸDĂ ”ºxÆßX`DS›¯đí|#´s·»z“i@BÉm\ẶÎb) H¹¸VơpưËđ³̣ó(åWĂ_N¨y ` Đj¬•6.]QyÿîưÓù©i»ƯnF•Çœ Pw$i¶äÓçøc}Ù^vÛóăOñ§&L»>‚c¦fYljƒO jZú÷́É_—_ÈAôÔ0:ZöÁ„ñt*m•øÁµ́ Vmo₫§Y£ø’̀á²Sׂ¥r¡B₫X¢ị̈>ÔÜWŒ448$¸± ëO@ϱ©t›yÿ–Ư¾8 `“¾¸DÚ0Ú¸Aj|=ä?Đ~´z~±Í Ơ^)ÈRE £è'Cÿznć¿çPdZM„HƠ´D2üG'[@Ô¡jüˆc½ÀQѶ;lpDäùùùw¿û]kị́ß/¢«Ê¨ÎR  Btÿù)g w“ßư‡̣ÏÔók©ª_/öạ̊ßE—Uד"ĂĂÍ1&RS ›¥ÀăÅ4â­5É$˜f¤?¶Ió–ï#íĐ›‘·^ü¸4ïd¹ïû—/_\B*TDtR„"¤ü)´„h1ö8 o!Å̉ô( _Z…C¨5?\©À‡Ïă°–˜”†îN]YJ“î>ÖªÆÍ¥Ơ"c½ÁËRvI©rƒ<–M|{[b\G¿¥è¤hh;vQUÎJ18ö˜ VERI¨Öx§‚§Ô³]tMeüR1Â#M¾z+€-æz¬ …‘ÛˆGÈÄV[c:’?íVöµjÁô7ê=èφ×Ûđ_^ä•Úá¶î-W›©îfê½{‘@„Zè̉xf£Lt¦…ñç0‚Qläơ»§ÀHªĐf‰…§à,ëïä™fÇ’c¦ ̃¿Ô'̀,rÈ´`%y¬E¡~@₫ü¯¬!ÁÊ ñëV½ö89`Ưömß·]³'Z|^¯²à¥CaÖ—d”^SBµµ­…\h±ÅyY­…ª#®ơuE/ ¿cÄ‚(4´}€₫#íµŒP$F=G„OdđĐ²üfz±~%dƒûâ“ù̀«'(!Bg÷æ-üVáü8“²5 ° —빬R} ơcéa(ùà̉'$₫…4ÿSÍđˆ₫ó₫¤¶^>̀ơ—à(ö/ÅœØÿVáL /æÈÇÇy>MÚ*«+{:úw­Oˆÿï_OÖœ*5¬¦ˆB¤3ĂˆŸD?ƯÏtÂ<ơ}Á†›ÑĂ…p‡H)̃Ï>ü„ºø#ê¯FK½,˺®EƯ:<@‘àjÖFưûª₫Áºçs~3ô¯-ªx¡₫¹ ˆ¡@I9H®Á₫!qØÄ đ©üIïư§OŸö¾{1LY€Ч¢Ùû¢Jg¹-ÿOAđ\x±SÈx`|óöÈæaêQ́ÄƯ¾æ×­ŒƠ`¯è6³“e+ï‚M»pÔg4Ëü:Ç̉æß2}(M÷Ç?¼ÿĐ÷₫åç/,́èø̣~¿ưđĂŸ·Û¶m₫v’Ö.Ô|‚Øç. ’â9\*ªc Îr̃hÇ[›^dœ-+ÎJ°üoz¶ơ7GU‚¬Z̃&!qhÑ(\¢Z5t(D̉¡àƯùïdøª—àçJ–ødù œư@íÑ–¡ư¼pËÀÿÁ˜“)ù?„ÿÇI‡åÂëߤ$>ƒó“}¾Àû‡Ă#Èøiœđ¼±öèÿ˜8 a€½1l#cP°"d0¹¶Qfư° ”0äQöi¶A"û¶¿¾¾¾‰û9Ê+áŒUÿDÿĂ“LéÈoñP4ưt?å/Ñå¿Ơ ¬­«¬̃˜°6TVÚ₫ê&pă¯ÊÙé{ÿôéÓ̃÷ˆô7zÛaưTeåÙô7Øÿ*ØGA°¹^¯W›ƒÄăcÈwó́ lBÿà5›©7^g ư>‰.<ø„G9®‡Ë̉Æe7›V zô7ß~óûßư₫åëË—Ÿ¿ø‹†Y].×Ëÿơ¾ËÁĂ½‚À­yÄơ…uE=́j¥¢S±7:5>̃6êùưO<ºÅ˜1»v™â¿(p }Üœ]5Àzÿ̀`“{y‘P5û‹I@–!<)c:’Y[•¯3.Ẹ̈œÇĐØ´µqƒ’n6—ăK£°Uú ‰¯kc}¤ÄÅË‚sÄê3UxN§9̣ǘ°“ÉpÍ̀B„5ȘƯÖ7WE41iâ²ë¶ªpªỊ‚ ‰ ×fø²ßûîvĂuºáéÖ–O=IS¡!èé¤DL1b=aùZ.¦.“¹¨iåo1Ê«đ~§”÷è¢ơœXd‰ª©ª€µ¯‘%è=Z†y— /¨µæ%ÂHÛb!¤«·É©,UL<%à!ó¨Mo~¼ܵó£è"«`~•„ø0P®£Ö",™¯&ÑÀ!¿tèđ³Ù¨̃×FjI±÷ÈĂÖöd‘dá‡.—¶đ ƹÙô÷¿ÿ½~₫̣ùúz #™uQnn!Ÿº·}o»7h«F¶ø¿^4¼È¢ªËÿ€ÀÑ44#ưAư—=zÄ IUŒö”¨ ‘s"¾/¶±iW=‘bùOqt…̀¥ärÉôŸG¾wZpåÔïtY—₫8WÍg³EÇ£øQ$àÂ\¾ß©i%_ÆuçMÅçKÜw‰û²`•øR¶"‰!•Ú€À^ Mß"û×ëĐñ…í”à†ơºÁ8@̀DåËç/§§ÓvƯÑr=Ü0¶&Ưz¤4{¥1‘»ơ¥-à­Ëª¢ë½ßƯ×L,¸Ëë&ƒ9}#Y|$¢Iñyđˆ’—´ÄX‚\́; ¾úè„XdjøTp QŸ1Ñ÷¥̀Já₫GÉÍ–₫,b q+¦>̣çÓùĂÇçÓùëË×í¾qÀYBs vaĐĐ_‚éh8©á¥>4ú…?AY‹’ß4¾ü“+)ár¥¤5i®ơذUøG-ôŸúk>°°2ƒrß} Pªưus|I!Q¦!&‘¨‚ÑGgd³¬Ëé|’.·Û­b`¹Î‡&A‡{đÓơÄ Nyû¿!ú÷¯_Ä₫ĐÿÈû—Å;&ç‰ø‚ÚÜ,6±t?á8ñ\¨Sr‰ømËƠØ å±e:H½A8S—̀€¤T̀8Ù:!ûô»ó.a²JÖ+Ólà3íi( Nba‹?t²®™6Å$D @ÿ 9•øºëG8T1ê—&—8„àcmÔËÖßÚ¢[S¹ü¯ó1´[²hx™IfKŒcªŒ›Å!T–«.ºè¢áq©E¦Ê*«·,(ĂÛ4_‹æ Q$pÉ4Inî˜Yüm6ư2®^„ v¦^g̉QصüX£¶c₫s0›hÓwÏïTơr½\/ẂIÑa©Ç^?:̀¬RC‚T‡|Óbá́Á,¢«mœ»ơU×`ö'‹aPß/Q9@M²¸·-mñí`-h?ÑØA¥÷ềÑŸÖ£. œ½¦áR«„Xư à§Å&ƠCüu’1#Z4?ÉÉź›«i€w7e9>qG΢24@ƒ>äơÁÙØßO/_¾´×æEN*ăc¥e¯í.Ϻöuo»7ȱñêê₫ e÷T€MBæp…¢«Â´^ÓÄI?ºY¼Ä§Ư˜ çRK~FîcXÁ Ä!Ëc‘ï+5OẠ̈á¨ÿ^©‚j̣7 JZ₫“¼ÏéoÚß=ÿáxÿîư?ÿó?{C>—ưê€Iă?öO–`xUôµ Äs?¯ ü÷ Ư¾6ÉnnÙÇ­g‡`±(‰p ¿ióZ'ưCöÇ‘ß*k”¦äÿº¬ơ₫Ư å† zÊíƠ¬ ª]¡ưÏ© >‡ÿwÛ%E„`¶f†ËĐ̣§'93AÔ”ÿ÷Èè±xÂè€ïCZ¾TrÿæÆø91Ñ#¼~<̣2ăÂaœó nÑMf®üqÚ,±5ÆHj¶p—2̣$àºđ ˆˆI[Ûùé,»Ü^o^…˜ª̉eo»ÄX–¶ -í(Â혩2ÿ¹¤«DX*ÓnŒçFR,ʼ‰S‹fsQKb[#.™|qCáHÙ½¡Đ²,₫£_ä"‹ŸBg(ÛO!KX«e4܇ôŘˆ{ø'’!H1é=hẮKó>Ñ@#÷‘i§‰–3à©%¶EoÛ¶]¯WgTÔ@Rë©¥bD <^·¤×÷,Íïå¢WÀ/¹úu,¼Óƾ%ù*üá@Œ è¡ưïÏ{‹Đ-W€@(GhÔ3ĽˆƯ.·Ë–̣ÿ Đ¯Ç/ÛI\êÚW[Ư.AÈăËÇÓÇ¢Œg1(?3d'ºRÅÔE=¾{$öT¼Ük^dUÔ9,7ÚN‚‹1ÆvĂ8 r¢ª(_ÅN/¢&!n-‹Sü ·‡¸M+–ÿ̉–eY>|øđ×ư×ï?¼ùúr¿ßñ«øw˜ñ́9¦¡AàNZàñG€Ü6ÿtôsđ'ƒÊKg÷¤‚á)¥U¸ßăưNúWª¥çA¢ÊBû¶Á¤›|₫KÍûIñfÿ[oKïÿPM;á,6ƒKÀẸ̀Đ‘N„N‘ɤ2^ñ¿z:?}üđq]WoÂ"’i|aV>áÀ°?PhvơèÅQr¿ÑCU=ºïŒÿÏÅ₫½̃÷i}:/gÿC₫ µ}à$ƒ÷Ÿ¥À´Z„Xæ]X®g˜’û䯢2É(kæ̉n sƯ(0‚Èï”)ÂîăçƒQS7œ‚ăŒ‡ø¯øÏ#|euJ IÊ<ÈèÙNÅß> +%g´&ŒES ¢Û¾mÛÖ÷ARƒ3¨•PM–0ÙÊ4±c^Ÿ̀œl©G@$ÓqC‡ˆê°×úFsH±Ư·á¸a=1SÊíÄÖ]˜đeO¿ªFÖ`”Ă'…ƇVñ²ƒ£åŸÉ§ÀÇ•›jèÛÙ௶Ʉ́‡µth =ly›ÿvÊäạ̀>~üøƯ7ßN§/_¾̀ƒs¨Ü +ÁâO†È ̉àĐB¬• Ă"¬/ ‘¿—>íÁ8XéÉÛ~½]ï÷ûà–³ØoЧŒ‰ i¸øñ·r¼,âÈ G@ØádJ:G:l4t 4?"›˜˜+ä Ñ!åµ=Íû0}4<îó(ăÅqn¢Çߣ¥5îqj½¯³₫Tơá-”í’aíƠÇë`”Ç8@RQçI¸ï×÷.ûµóÓh°¥“aa•!S=-§wïß ‡@̉ؽK¥pùé Ç¿$`ªˆHñÂăG°Ơ¥DÜocè?4!â’Ä‘èD 2Đ|á₫c‡/*ó-– =ÓkÓu]Uôz½¾¼¼ô½kÓê„E?́]ỔÅê%³5ÅÚú£HT’""û̃÷Mê¹DƠ,ÁeÚ¶"&€₫ø'¶ ÿ©¢ÛW<ns¦\£©®́ÈAÄêĂÇççóí~»ow°ÿ·}ëTñ«€TÎ 8ˆ©K=/ù!€§c2‹¸ÀÂŒÀèø§rªl÷í~»†‰66œºÚ¬c=7xcfÉđ‰–ßú’Oü×Nç5ë}—ÓỌ́tngÔŸÛ €ÑökØ,‡’_̉•‘Íe¡Tú–c@£-$yø-—D=0Í̉d §“€N¡1 0b÷mK賕ˆ'eL=d%³üCÖc?ª°}ŸjEæ<ø§øëĂü­ei/¢_J<eơưL­`®=€T MÇÛă5 ăYΘ́€­+^(̃‰[˜ÁÎgùpµ”™'Â@*îÔäAc¸~yX3&ëº.˲ïûëËë`F´‰Ô03^2ºqZÉ‚÷7´ÇÈ’ó—€ñ¸úFv“g¥A4'Ü3ʲpt1º­+‘y ̀ox Ë3ÀbaË3H1‰³”lF…®‡f*v"|ƒÑd $:]í;ÀSFsTŸœ‘ǺMúØ·&«6ïÇ|^ñ,Ñăo‡Ưw0 µ{ɤL+ e¤#äz!rä¿]7ÙäHrå7íÆ7́Kß“•3|Ï5 }›¼X 3çc®r›BqÉâotØQ•GU¿UÀ*•đÀ6`ÊÄøg̣z©|2ï?‰ûE¢½ÓĐº¬.d•Âù©€a^iK€ bNO‰OÖtˆÜ=¿dæÿX2ŒñiHçÄu,p̉¿³}¼Æ·ª?=̃¯™Đ`æOkĐè®5!K¹Ïe]̃½gj?}ù© ÷Yÿ‡›€̣Ä™ A=±p\ui4–‘@¶ASÄ¢ D½wT²ym\ƺ,Ëà°̃ÿT́·9Ô¿û‰‹̉^¨₫/«ƒ~–å$/æJ¯¥ü?"ƠAñ:¬ 1.ă9ïŸæ0fª ö ;(̣ ăY^sqĐ~±d¥ÇW”Iª€VS^ºÓ³aÛ Ä9EªI~ûÄù™©G|‘ï§×ă^&¾5t‡ŒWK JĐM[qÈh»Ë¯ÆŸ ¾ß êSF.Y‘I[Fă“ê6ĂŒX6EÁ€Y“ÑRÀèâĂ''§ḍmT†b\s;Đ áÁ`¬%ơ¿X >PI)®%ÇÈÊ%›WÅøà%1-æÁă›'́q̉y†Å“ À“• Û²×ת3}đ-Á‘^cn‡UG,¡Öq9 ç©½^_½üq—=̃ă”½¤?E¢qLO_ô(àzÉ^ʉ¾,M̀T÷ÖªÂu×ä†ù"EÛ£X"ÊViKÛ÷ưz¿̣íkÖ8¡åÚVyt‚¨¨óF&•Ù Î8₫ś¸áP; rmXtÅ!Kn¾Èn}~6Å¥Jµ̣đˆ˜sºY| ˆËù/Qkư¬-ºxíDÄŒº*µaÆÄk€8«éÉ33tëú|¹:Ix¬Ô:"ÔFƯßüÛ£•„FÿXiỸí°ªZΫ†ä½¶4É₫Ç7ôB¶Üß™ZöQÀĐDD¢zX«dÜÄ@³n»îQ,Q ¼Ë̃¥/º́}_:< Á<"ZèPLî·;–lœ¸2LO¾ „ ³ˆRWEr×₫fˆéÎQ4™'H,Aö‘Ù/m‘eú“IöGµH/Àúá¤ÊÁL Ruës»Ưö¶ăở%äÊ«% Ë2—…€©±g £‹sªưT¤5²ix8đ åJ çü,²8èw¾¸ç½ÿÖÜ@)³ Ù¸”âd³ĂÜUV'÷ụ̈Đ~ø¶£÷-̉ fµ ̉qƒUc0s áœT,‡Ë!q!/+J‡°ÙvßàZ‘,qă%|UP_zœ 5¿5ï߯9Đ«’ß#âç2€(ümÁ₫¯-f ˆßÏ{¨„¨Iƒr:Ø”4ªáŒ €æ*ƒƒ€ÊTEĂŸ¯úôÁ èbÔĐaV0å! —f ]ñå?X«#¸ŸB;øCñÓñ«ánñ-#4FÜw@>̣~×-;'z¶-îLơ¯öÎ>ÏñÀÊ„_²ƒV m¦ó'Å#ÏÚ€ÀÙwö¡CÎ_¤ŒøH̀₫±a ú#4V“…Z£³TŸoc:b¼/Fü<5ç”'â!¾©±åjQ|À,è´ Ơ1̃³´¥Úd+€è )Å“ªêeî̃đ*.`µB¡»Ü.·ÛÍ“Ï|;«¬{ß#ƯH–̉¥ă‡UÚq <\đÓP¼”˜'Đ2—”*•á#ÅÎ ©₫äE¢N”ôÙz[ÛÓÓ“'º…Ú„‹Èj«_p¸^^Q°d¿ÇMùơÂgèb;đĐOÀÜM¿̣=xGJ¤OÓâCL)†‰™-¶Ä2%àr*Ơ˜Ty€‰E°ú‡¦Kùú<n€ŒSæ´bmå««̃?½SàÉ)÷v­Db;ñ™Y8^Íó ëIĐwỂ”ê0VÙG¹°eŸo/D±AüÊŸ¸MƒXùh ½i[̃̃=ŒîÏ)¯çEđ¥”ÙÀæÏü,~;|Ô8y…èĐ…Ñ¡„p?T4¸)H?~èŸlŸàü´…y ª́/ÂO›Áư@©>Ǻ÷G+¦ú |¡‰öĂ^»Åvrƒ]¦øăßèëlAÎí(ùåè¸!OÔ“0y:ß>ª₫KáG–(ưùGOé@Dp‚̃¿j¡:|£G»ưn»ơ×ËëÏ_~¾owư=;Ư–®Q/#B­ăÖ úÖ­°G₫«D‡†2ÑÚS’ññ£ÑH¬3dó Đ^\óäăYi¹̣¿9ú₫÷2ß5Ơư×sP}’ị̂ÿÉù9-§U×S;Ơ>âºyư²€ötˆ |Âi^á±o†ßÂĂŒçÔ€³j<ƒuB¾‘Áöt°N™K-#ûHHF¤>8³‡O;øú­÷BªÁjư ¼ÍÛUÉ`6Ư:¹X4C†ZDˆX\`ú(Ujz¢@đ |ZùÛøn«ÍÅÎZ̀¼º„tä$“NĂVU¾ÄZBå?đĐ˜²F_ €1"û'ÓA9¿Î75†Àø º!áÑ›öHÅ),Êo;ïñ£©Q#×_“…Áâ«Ă.ó ”óÑTöÄ5²+5lvºº ¾]å?äw<ØÈ6„||;ÍiËŸè ~­X„{jèqϦñl­N§¦m»Wc ¾A¿˜ºúwÚ¶Jñ”^iªĂÛ¦ÉƠGx¸—ºT‚áOz6ÛQb á ^Ä  ÂS®•@GĂé¬ăêƠñ~Ex‚0ÅÓ›†«^Qúäa´ü"%*QƯ@µ&æœđĂ´U_zǗ ñabËûÓûéNæ‡ÏT‚₫“½àÿ°£x±²§Ujw:«|Ư% O]É\K¯J¦m蟸³ä›ó¯â•7XÅ ¡ƒjØG8“6QN¨PKx>ƯQ¢ƒ…'™¾;hƒăQ;zT>)7€¦ÆO YÎè_ơ|>ŸŸÎ˲ÄB¢aI3 ;/OYL´ ÆáC̣Í‚Xéñ ă‚˜×ặĂŸO ;°Àó:ÔGđÖÊ$4Y3¨uwn]|½9ƯËÁe"ǹ¥‡¨«V¯ûhăRÖóĂÿ®¯óZ=̀ç¯àX9NÊtƠ•Ă›JŒ¸“8ƯN]¹>z̃ÁĐsÈæe4‡}ªkBB“£É’ÑHb*‡ƠB-îl ́ĐªàÁÿî»ïŸŸ[kÛ¶M“2OR‘´œfl=.Z₫(₫j¾’ă¦æ%=|5 2çÓùïÿîïß?½¿¾\ï¯÷ ü,ƒÄSp½$_RI¶`;h$‘¦/R" !À·nJëD>a²ÅúÀv@-o‚c"éTzư ßÿPèSÆ£«@¼Nß`Çç3›è@C\J5ÔG™ßq8V©{ƒ‚ñœW¬÷’Ôäºäß: ÀHAg„ÙŒP…öBøư@âC¨]F¨³KSd-¬?ôs5T‹•ö¿A-“(¼8u6AW£ª̀>$n-k»—Ór>ŸEd»mÛm«Öiơ ăˆ?#?,àc ôÑ2˜Nù‡sͳ@Ó^|°Ü±)ˆ™/4mÑ¡ ¨í>ï’, \Æ!ØF׃ϟZ̃Ư§ Ü¡Ø)„z÷^Ư—\g}“Íơ÷¶‡DË(råí(!©(¯ybí¹î{”úˆ(ú¾IeB"í-®œŒáRîD×væz$œ)_›¥6î á•™˜™.*»́mßûÎ#,t¼L|̃ø¼=ËLUGăiƒWàûnë[À$§₫k[ú<Ö<ëbf‹.ˆô[n[ï%`Ñ Nă!dí-ú‚5mï̃½÷¸ëåơ>‡]¼C™¸æG™§aÑXÅụ̂™ eÍWBđ zV­ i.¯eC‰ŒƠơX¶x˾"â=Ñü=9ùƠú¥Eç.~§|N ´ ³]K¿8₫\á[Oa*̃"̣ẬÂFk”đĐtf [˜Æ-0GÎ@jXÈü®ªßM ÂJÊàb€Ö¼²‡U ‹äôưTr„W_Đ̣·©ê²,*øW®–tđ?÷#€Ư5K@¦¨%ÂÀ̀€/Xl80Ň‘½@?¥SÊ¡"à‚ƯÛĐ5̀Ĩ¿¬áx°¤₫W%¨ß_‹¬ ́£Á2»} À¡Û׬₫É, TA­fÆ$ c÷ ¡5åWçüà°eÙQ¶{°GèZj 24epE¢ó…h×@úÏÜÙÿ+đ¿µ₫_–uYϧóü‡ÿøíÇo?ÿđù§~j½Ùfœä©jïÖ¦œ›Œ‚z5T£ơ˜*31LHñ}rÏ¢₫Ơƒ³M uÍŸÉ×Đë„Ăı™&ó¼Mơ™î—1=^y À¯ëÏ ©«ª¯x+à*5 ¡` øb•ﲑIï T=BÛp6ĂQKhT2(dƒṔøá² ªRZ ëÀN`™É1¨µ—ƒ<ÜÈô¯ù[‡éˆ³ÙƠ'EwƯ¹£oÿ©MKe°“0̀ å &46ËFMÁjöÅ·§Æ_ ?ÄÑM%;044óÖ¢₫ûĂ)à~åQ›}ļ®Ï‡¥TÚ2Ö[¾YnM̉9ܧ ;£]7Ư´«w˜ Ư‚7ÏmƒăªZ6iÎ`w´‰V<¢Æ}\-‡BY­¸P+L™Å ̃Ö[Øú"qí|iIågmfí4‘d‰RÅá̃P¹—|ñøs³p̣ s´Ut25((·Î̀;“úª[Ú"-œĂ%H2=¢ÀáX‹‚`‹}̃£ô â—Ñă@¶©£gDu‹!Zµ¾¼¨# (4ỐW#RP~˜.úüô|ßï·Ûí¾ƯĂAe°·(ÈÖ¿hù|́ÀׯM‚ưJ ¼‰₫îđYæFIcy Í«ª.ÏYo"Ë́‡|QÚô PAÓD¸¢DZxw ÷x˜Ñ›%Ë߯Cæñé¯èà̀ÿµ°ŒÈ%₫ªUȯ,mqrƒ{øQê rÿ@̣®ó¯S‰0‰ÜlÈï3îÉgâúÿ²ØÉü?’Ă—t3$m¬{¢LrÜ?œù„Ÿ“Ní„À0z~ñ(Eø_Ă_/—OÓcs+èü”ÛĂåÎô/₫Ü(ËÁǴ°„$¢úœçø?caw-̣̀©N‰'Ä)Ȩ¥|<8cé›ùí\o×/_¿¼^^ư–Yûß™Ncºÿ·ϣ÷÷=¯ççóóúßÿÓï¿ûư»§÷ß}üöĂ»——‹~8(T_Ñ́Ù«½Q@¯CREHKj8](¸È”¡„{ØôĐ™‰³/*·…º+:D2¾2@)¸ËcË̃²?̣Ú sM ¢‘Ä À²%S}QvÉ©mrø¨¹`ô¦ ˆ'Œ†mFx:1S_`nU₫ƠDnÆä(>AéÁAPG…œ4 Çl¿·èÓ₫Â6,g¦[ṣgQ‚NIö‡=Ö±aBU­Î₫ª­áEØÈ'ÎÛ*è4ń䌫¿¾W™á}˜ă$Ö,OäñơƠR MFÇ£œ.r³ùs0qrHöN»)–b₫™¡éf„"&ÓEÎ÷û–“Ÿ\”ù–'ÏóƯoJ•‹Ă;§×̀·ăªæ· #I CÍ#6m7^c¼‡+a… ¥.¯·1V2¬g{0¿/&¢Ú a‚¬Ơƒ̉µÑÜa©°å¬G߸ΧK­¹0é½ßn·Ûí¶í¿aøĂµ†măà]L¦’,Ïù|₫‡ø‡óùlƯn·[}`†úáf£TÆ₫7-°z®4A:ÜË`ộ̀å›§o&ôHZg9™ÎzERŸ™X=´Îu±À9J6ap ưËđ+ÿ@FùGB?‡*¥¿˜d0ûöF1¹WDNë²ú÷¶Öà:î­¿Qç/ÿTú¶b–£‹ƒ₫ĐŸ„₫́àÁa¾VTçÏJ…́¿… 5ŒUéÛƠwJùÇƯœ,à—σ̣ôHöç̃ïǻéÛ́û¶oÀ¾ˆ‚GY3¨PFơÍ2Üø蟧B̀ñ¸¦j́)lÖ–eià|ÍÉ‹f»1­yœ™‰ªß¾ßî·ëízßḯy4!ˆü>@ïqö¿K₫Ÿ×óvƯÖ§¿ÿÛ¿ÿæư7Ÿ~øÔ¬qÛ¯JLµ¿d &Ü|°SZ( FÉ–hst¿J÷²ààCÿd¶øq1]‡âîă—‘ë_ï´‘Áx8ÀpSÂL†ñݯÛå}[đc T`E0 ˆŸœÁ…˜²|G,…+1Â6; †ø¼á¦đ=ƒWâó;ùL›~¿ª*Ơüƒª÷ùÓi7LR«ˆÅ#ô÷ÉjK[OkÓæ¤SŒ>sˆ:˪ˆ³^œ˜óí7¨¤ÖÆI&…n%=lƠÑtˆü­Jäû$£J̀øÑÜ! rđă, 1₫üWTÍB^ÉC¨ûߣ¾#Aôo²´dIa!ñÅe·ñG$nÆ?Âá¤3tơáAÓ2ÀđÂ…kÚƠ¨:×?ºüJ)ưÏÈ•ĐZ!¸Ư©s=̀J¦}P¸ß÷@½}ï¥y€lhP÷̣Ï(uŒ+̀Æn41i™aG‰œÏço>~óüîù‡?ưp»ßd„5“mÅ+‘ص́#ĐLÄ×Åođ¶ß&ÑÏ¢©üÖôø½ĐúôX₫ç?ï¯ûỌ́´èr:ŸNíÔ[‡ÄSưG;á`đש̀¤¢ÛÁd)%©1Q3·áÚáà™°H}5£MĂ¤à¹³đ:/½á¨BÿBèß¿'Ƹ̣×G¦RÈsbø0ôÏ¿±¦m]WÛ¯ûă¥₫v¦È¨Ă‚A›]ÿD‡÷=›db@̉Ÿè(Ÿ_–ïpi>q,«ï é!¾©Å@đN˜UŸ:úB±|¸K²3{Ƈºv†Eüo=¨151’íŸÖY–$đD¼SeßwS[l³Ôọ́LªCƠŸÑö`_1₫Ơ[4•´ÀJ¦&Øuv«?Ädßơ­G-!«ö̃Ái!):øöñ]Îÿ1ÙeJ&«‡á´¼yd ơUíͶŖàU«¡Lø~°½ô‚%½kí*­¼”øuºÖ# 9730g¶˜V ₫w·đ'}ùyK bƒ4ư^«ƯÇđ´œĹz»̃n7Inz-Ѻª$Dô6 û±¼˜zØØ•7,~5á™é£ü­¡*½YÛu¢‹ˆ³¬k=·A0×¹@fæ%”fY`ôz :zÄ5ذ7=‚æ…Ñ À™9¤Ó?íôîkJ Å–’¾¼7E¤i[—5΃½ựuïû¶mô,øN’Ơ ĂF•*ƠÀ“Û=S6₫Ö­e–+à£Đv –_j•II°„™­¬†iÓ)í³‚Fîx̀rö9σúˆîĐ?Ö¤2 6Èd2P~K̉?ä}d@ü’OÀxÿR€^÷ñ¦y ¸Ïl₫6TôråÀ$BÂ5Ve¾!ưNtÿ€¿Pôï»üú½ṇ̃ĐçÈOÇIƯLU´YSO­ ö/ûoÚN-~u(­\J«±+cBo’ä³h^&Eû‰b_¿Á}ó¨?~ÅÏËç‘=ʘú?̣ÇÊñ€‹yƠ‡¦̃«rR‹<‹Ç«è»wï₫₫ïÿá»ï¾}ùú²ï»¥>±¤,±ó #;»ÊöHä+Â+êPA­₫_y;ÿo<à¿•«-MÛírÓ]¿₫üơçO?Ÿ—³‚đÓ$æópûăKÜ„Å|óûMçăjØúØéo3–6̀æ¶ÿêáÙÆ!(ÏQÉo8Ä₫ÿâ”±Ă0]ZơßC*S÷;«đz½×3ư;ÑÇ}cLJÀG÷ÄÑ ăg½.oô,ơˆ̃sœ&…C°•~aùrÀz̉¤÷0ẹ̈(ïëÚ™&#h¢³FŒ ÑpËåÑƠÛ‹ă\*bÙŒ|œâ~B—¿D÷]$™qRêß÷ÇE©é!èh#ïë’Dđ{©©9µ*C_…€–Ųưª-@“¥Á~ĐG€öh±”SùhµŒ;r’…Å®“ 6‹\ i™J“EGóUl1pÎ[Ë*GGIp!´ 6bœµjHÂƠ¤ó%ĂÚn*±x0»}H»qq” ¦¦ï̃½SƠ¥-ûĐvỨÇ̣ÆON:ÉtF,˜1È2aÜélôØàóX¹ZÛÑ»À̀ĐÔo4¼¾ "kÍWNÓæƯ¢u†ÇŒ9Đom(é™VlË~ApbÅ}Ôˆˆ‰îÂ0ÚÑp­‚V|Đ˜lÛöÓ§Ÿºơû~ˆƒ64KéÖĂ{‘øRmC±» {G-ÖU 8‰µµ15ª}¼l]%ßœ=̣Tuù₫ù{=°¸•{V5ëy Î÷ "ẹ&Z )¿oWÈĂL#-ÊN¡ô‡5À#`Pø?I1âkïë-†̉Á=Ç×"™îÜœ*=>3–ë¹0_ÎļøÇ>-¹i~Lq"¢tđÿœ÷Ơ´í—úL¥‘yÄđ^?*Ăû‡Á}÷îƯù|63̀[/×üÑ¥ÇT"†5l âLŸÉ›¥Üc¾‘C˜pqúUƯ)åÜ„ØÂlW+‚iẶ˜#›œÙ˜îh\ù5D“‰íˆaÇå²1q G÷K̃÷}»o{ßy~y9»‚OÀ”Ơ ÅùíĂF«QUºSM³s¼ßƠÿ`àùØ(ø3Í"=,[äHæû½Cøqưàô÷±.3ÄAê‡ôû›´ß}÷»ï¾ùNº|úñÓ~ß™îị̈”Ă.|/‹ªBúÓ‰ ´œ–j‹,û)hlë«CàÁoUƠQ£2¼iu ö́%©}¸‹C̀¾B₫GÚ—Nô÷½0p½j*£1BỴ« ư䈡đ7”ÚP\Ú/45AˆÛ­%ÈA/ƯQ³{Dÿœ ˜2UL:§P₫Ùe‘½úfP̃ú%"2&“E¨Â‘Ö¾í?}ú´Ư·ûí¯g¦²hÊ8&)üé?¢‹…ù'öE&@åb½£ÊYç9ư÷?°_Xܳ₫ÓumkßûË×—mÙPï”lơÅdžge Ăºä ©ÔN vÍzZŸŸ–uùüåsE,däwR¤0Ä#´ªà÷„Ÿ°)øù¨ñ/"Ú´ïƒGºü¿Üî7¼î4‡û«®LbrÉ}²À?¸:ÄàW'Y˜`¹çë.hU@v ”a¨Ó8C@ÂN„x‡¶Eyï[T÷JÿEúβ17=à@Ñ€IDATG¥ ưQơ›ˆ, £Ü'²%\‘Êïd%̣ïCY³ă?P¾3₫÷ />v’ïäˆbô´––È̀äsæpCÿFưx²‰ºßxy½üóÿüçÓzº₫L&àcÔiT W¶4†º‹!b<ú›?¾^Œ#߇p´éétjkŒÿ[÷¨™­¹®#áÏŒ¾×„M™˜œŸÎOOOÚôv»}ụ̀eî3GQDŸŸ÷û߉Èÿå·ÛíÁëñ…¸8P'ƨâü|₫₫ûßỡøñ|µ>Œ‡!e?d¼}D̃X„ ¶3|p/ÀÙ6“ÚưM¬'pü¨ÁOăÚæø®p?ï^ £«Ṕ–8ÂA®phs@Ñ…5éGÓ¢…”Ó(Ñ3¡œôœ\ßEQ°Ùë  266’…j=`c%†ă?ä Ö́9óÛÆ©ôwr´ ̃ˆ5k½¡À€mfñh;µÖÚåvÙ¶­œÏq©ĂÁ €–£ªÁ¸(öZ=’{Í´gü‡Z¨¿¿KkÙ¯À“Û]ư Ë+USŸÊÓzz÷üî¾Ư¿È!N†.NIë†ñơRVƠq­X–R´B–jÚ{·Ízï˲'H)SêÄàr„ºH—]wØœ‡{Đ²+c̣#öƒvp.xIÆTït»ÛX-W œ¨HÖBøRq½ÿÀµ®Â¬Éëk±5¢0@ÍÉf>k‘kÚ¬§Ï£Ćµ¤u‘;̣Os×ND›ú8£6 0Ubî¨Pjê£AèïCƠÀ=–uT>àJ̉J€đfbK[đ̣5©=ûh†‡zw›¶ô À²Ï9 Ù¬“á@T Fà8g6S*­ LU}ÄL ÁioÏĈG¤tô¦åå¸j•5¹´µE *D‹”\éë/ªh±z²êwªÍ ä&-H~Â@¿Xk.½“ôF0zq×Éơwâ°â'¤~Æ‹́¨®¤ ñ¬0°“¹ÄơóïØ.-ÿ¼©âµƠå̃‘kÜưœÊ6̉ „ëAj",Z˜!ä¿ï3ÜßCéhÎH¸@[ß|uÅÇåI˜d)a¡Tă–‘cÄ_¿Ơ"DIz¡8ü.—Kôi7‰]“<â(\7f-ẽ/2z€n «™:ppK~Ó‡ï…êí•B@́0ƯëH™B³‡@2‡faL†ß=B®¾P]¦mˆúëá_¾—)“N÷8_Ơ¯WøDÄÄN§ÓÇ×Óúơåë—/_Êm£+Øúççç¿ûÛ¿•~øáz»ÊÄ §1b‹Îy€ĂôTüÅᓪ§ûùº‡‹çÛ”ßñË€€üXß öhéˆF¥ĂÅL“Ë_׫êqÊ˜Ñ X-k8*LO Ëê|%ˆºá DÖ/ÀOh?­ÂH¸|Ô·°₫8,̃ˆKp‡¼î ? UÖúÇ4‹9t/ gĂa¦F’ŒŒ[oZ~5̣LƯNE³Üḅ ̃z Ø_˜”;³zIkNkà$Éb‰ÈnËF`Ü>ÂOáwïßÏç₫S¨¦VrĂwÔ¿4&4[qyi—½n"ÇeœIi½ímw”¯Î±‘&˜¹@ #ÂỬÈîDØ+ØA]l7Ï$ĂÂbíùEbDẺVơÊ~³ÎV_úR‹ ª[̣ä®lWï0ù‡Œ;¾Ÿëæ°/Yƒá͹ŸŸÍ́~¿oÛÆĐÓkd$ÀĐR¦CØ]|Á#îY8‹l@t™Ô†îèǺs1< ßÎ=d»‘·IE gÀ»Tˆ]̉§Âs÷O’Ôæ­H¹Z`² áÀ́ PE1‚2ûNưosÑh‡·đajawl>sW‰Ô^G3 íÚ5(ofø$î·‘ê3©O–ÀÚ,ă0M_°q}Ṛ¹]n?ưø“́b»q@·QçG’Đ/Cà_¹·—>@ü²Mˆ=¦!uPϹ|BëộÑCú̃¡đ±̃7´ü÷»Üö Z7“æ}I|’g5;g^‰!Ê₫SÉoEúeq÷Nœo_È9T:O¨äcT5¬;Íl€k_ư@–:@ßÄPC$;AŸ è+óÔ9„Ú ämrúÀ!äï¦BNDMq"Xó3̣l,àÜûK ¤dDuÿÎG̀¦±ÿÓrª‡bn‘ë<Ü*êÍ7À&€~³ ç™Y™¼~ßî·ŸCÔBˆ< Ä1ˆ%7¢œÁˆÑ«8„$ÉîåÓ•#< ´ËÀê¢ÔhDV̀–eèœ8àƯ)̉¯Up ›ºS­\^/úóŸ>₫̀QÿÉ™”7øp^-`#›0#B$¥„yPjï{±k8æmE¨Ñ0J{Ê›ø9¤ăö(ÿ¯°†)5§°ôqº# 3ưŸêjø1¨ƒ|Íè{ø$•TÉĐưTk(,0µh5ªƒ3‰«-#F|¼aIH¼#ÏđʧØ?†—Ÿà&†_ÓTÁ¼€±*€_‡QDô¢Qb…ºưÍ,“†V©Îsh­}ûñÛå´¼^^¯×kÅtˆ¹-ÉÉ”YKR/jÑYTvỊ́•»Ưë­zĐÜ­›=‘ëú*­W2Ÿ́5̣&××ëưv÷ÖRî– ́kÀB­HĐ™R(SvF›z„Ûq,?¿`[íA6G9ÅÁUw0#ΘÅBÅ QfNÊàdQ₫†XŒ‰S!₫đ‡?˜ÙÏŸ₫üógX3_¥a)ư;@^̣-‚K/Áù©fÉb̃NÎi-ëƠ]¸-îkUP†ÿ å¹¾:°̉¤T:¢*×ĂÖÎÿÑ®Q̃TDP¤ec©~æçE #Å5BG›n¿¼Ø=́6^‰ÿ‚ÅÓÆÂ'…[‰E—ĐÿÉeÏYEb¤7Ü>g7­EĂÚÂcfFH̀ïÙ©H ·ÁúÈñáSº"­¢₫UŸªị́rÙ®Û"KëâAHpèÏ^m‰4œ | z¾ç¨KøVypú'@©" È’=n º‡{¡Øặ—ÁlÙ«ËoÔơRØ{Pû‘}Ȩ€j?Oà0küNèï%¿û÷G—_ư¤'@Ă˜‘±[–ˆwXD±/$8!öÁ¢đa@ơÙơ¾eÍ̃ß ̣2Èv49¶̣,m¹\.ü×?¾¼¼Èh©x•Z<ÍëG¢ "2f}&iA°ÿ%YΆ²f‹,]ÓÛTkÚ¼´…陂™ï‘Iº—;Q€z‹î’}¢Ô´·¨Fó%N÷."¹µ˜÷0P`e\Ÿ[ mUÂlY MA éÀ°"m—¾·ơÀZIS‚…Ó”q‡ø·n^‘?’Đ'₫G̀ADiÔ·+}%̣Ѳp=ÀT́[e©̉˜è_µªé₫hÔ%ć¿Í¡âu]ß=¿;N½÷ûư¾ï;(’! „9]büwª÷åF¿ü#´ÿ% g'û1€Đæ÷s@!Ú,Îø?éÉ W –$ưk+æO ÿJ[=Wœ êàæáyPÿqw²È‡÷NçÓơvz~…¨mÎzB»ƒÉªÚ_˜fŒÊ&&jd7…Ëp5#ɃpTö´ª6¨ Ô|¦{ZĐ8G]j—±4b©̣;xÿ¶‡$ĐÿkÔÿ¸¯ÖBÔ©€¶Â`ñÜȧå2ÀḤñP竌t̀íNÑñÁÉ¡?› ÈL%Ÿ·̣5ÄCkhtUöà*!®ï[¹Ê–c´0Œ"²ïû̃wé†î!₫> 'aM₫œ Đô‘¶tLÏʃ‘äëâ¬ô0Ö à˜À´á„ŒV”ḳ@Û(₫ÆA‡o”¡NßÈÛ¹åÔs#¯Ç£€…ø¡¶qxø±:¥ïJ™„#ú €l¨‡p™Ç¬t¤GHº”\6¹™¡OÙüá¼ ³CÅ×CƠ*á0é|-‚(&éñ †%aĂ÷>€¯%ÚKZ¼—8¡b±EĐ ÷í¶íû¾mX[ ØèfK7Æ0”µ*jºÉ¶èâ»`ï»wY_$z0•ơP u&bâs@§!ꃵᤜYà¢ĂÁÓ¬Á4€Ụ́-\¼C©“º΅ºcë¹W.Ùf{ƒr­ô=†|æ°ư»}úéÓíz{÷₫ƯßüíßÜn·/_¿\./ Æb›œÏâR™‡á­ÂƠf‹.¥mßlé úˆy—‰8a˜×2çé̉RNàÑjŒ5,WÁªŒŸ¢ \[Ù4 ¡ªèö`̉Zs†²=Â#eacÑT´́¢đN¥\ªƒS‡È&#₫'ñö1t®¼÷h5ƯÛ®‘iPO¬åäIl¤Àư‰8â5«» 3…)‡üô£Gwä>™Ê…ª$Rÿµ±ÿWê÷³¢‹Ó~¸€iîƒD½€₫H ø¯Îçó‡Ÿî·ûËËK$’óBÆĐ¡Cñ=Æ̃·üCø̣¡¼ưđ†¤’–ÎOliËD3ÚO0¶M[̉¿DÔÿrĂ¯ ư6r®ZøC’Œ 0ƠÀÂ*…¬U`zÏ"Ëûï—ui?7ȱôç½ß‹”•<&-îÙK)₫2„đÔ5ÓÄ[yăO2Ä&ƯqtÊ$óŒiÓ# @’ưüÔ|ƒ†ä“û7q|G€ßÅ₫AúOơ'T ̀ô'œmDôMÏÙ‰=˜Feđt°9Û¶É(“»¬³ʼnV|?@̃)½y$̀ L ü ®ö€ûÙ™ÁÁ3¿ ÿp¼ÎöăéeÊvĂ5_0sF6HE®¥®ó>N~3¿ ¾.ÆYàû!ùº0)2ß,¡ßê»Ç^A‚¾#©kvüèN±x X0[ÆÔ¦‹kåRV‘IùH*Ju¥ằöª¡HçaâÁÙSôă%ä˘IÈ1¶‰TÓHÜD<`Ô®:2ÑzÀS0xXB>3Üs€ZÄ1”’Ó¨bäV_ Ç[Ï×Ơºơí¾ÙXQÀÎ'oË |2Ö¨5¼V½•rÄÈ- ¾ikl®²²Yl ¡ͮÖ}»¬=ï\¡Ö˱¡ó“ăë³ ‹Đß Ư*Ú7@ñ€”öxg¹Ft \ƼIA4“M65E·£R^`p_}œKƯ.ßÓ{ÿă¿üqY–¿ù›¿ùÿá?´oÛÿüÿóÓŸX¬öˆ v¢?‚K[”~c™ß^<kf»y•s-¤ô –¶Ä›½6 Ië­«WB(ZnOK£‡₫€$«¦ô¤÷M=艫ơZD*ËRE»CL”üºt/81¨'z)yÏŸ4̉n‚+LĂjH™˜µđFzëÍÚ˜ Ø’ñ‰AÁ3E<Ñw©DY₫Xzx¸gê ?£­BƠ†₫£‡?áđ?~ă¼ú@u\ú9 œ‚ØN+ÅOHËĂeÔî8YßơÁä AÏ û+\íêCZ¨WJŒà ,[‘ ư·́Ÿ‡‘tıÿĐøÏ¨¸ư=₫Ză„ Ưr…ÓñîÉUe €ø¶ưđé‡÷̃_®—Ûvó¨ÿ½ß‘pÀ«Ÿ‡̣_åz3sˆ/IÍ,7€ ?"•ÁÔÿô ”¨íÓ_ ĐŸ>œ“̀zS÷ï[ó~_¾~¹ï÷̣úPÙ!è~ á°øozp_Ÿ¿ÿ₫wë²üđçn÷¯ùJP¤S7̀é10Í{Y^„AkËÇUôợºƯ6–‚ă`"¬hY‘Œ÷"]!Æ€³“–-i~%Á;)‚©0¼@̀“âå™:@µ´d_Hƒ"èơđs¿Yª‹ s\ˆ‡aáѾÜW`f°ü½œGNï“TüUß®rÏJ -z‹ÚDÄïœS1&K±Öµ[R€¦­Áè-:î—7˜/ÁqUkAßü⬭.2{‹&M ª­Àk+ÿ'.I㛂ÿÍ‘na€%ƒî>€>VªjƯ<üï/Î5 ’>*Ü0(ơe @4XRå]wOmt̃#C„‹–Á°s-}]³×××úÿôôôôơå+»%e¢­6BeŸ̉Fíä|Â{ œä– ?y €,¾Œb µ 05Ú*NĐ d>el뉬ßkw¼è©̃ïQ.ÜÊ©‹iM9#œ,̀ ƠnY[ÏBD³¬Nădê~”Zä-Lj9={́&!*+› ÷#ä<`}Ù€È?8°i³¹ø ~¦À¿·ë­[óøt8m­̣€ü·œ‡6dÜÓ8R8täü´) ú@Î_¥÷~¹\Pøë¿bï¼ÂKVcXơ»½χ¨>ÜæÖa4€H³L¸ŸNz̃]Óñß2ÿÁùÉĐ>Óư=€à¿e7¥)v¤:4†‹d‡cÿƒ¿m×Ûơëåëơv ¶Ï¾Ưû„ŸúO†/,‰dH77ÖœVă‹«J_¿|ùr¿ß‡{ÔáÛ‡£\F›±q¹F́Éă ~»®ë÷ß¿´åOúS¿÷̣ñÈIđäû•Ïḳ°9Ûªb•‰@̀[xtRà6‘à~ ~¬’` ™aF0ƒWöƦ®3çåèIâb¦)÷PĂ·†¹ÖxóđZ¯ÇŸ“R~t pà›íu%eƯă{›áE)¼́’üéiebåO Cü‹b ¾'ÅƠö¼fHµè̉ZḲ‰’§ÅJórƠZ´~%ÚZÙt] 7…'‘øÈZŒ|!uͤZDeÔuÑß…ieæa7åÄK=¶Ø.»ËѬ!Ú%D¦²W¾Yî÷û₫A›¢Ï<óa¾¨µEưò59ÖJ¢)¾ÀØ×™-.17 ÙP¸Ù ›EJ¿§/”¬tÿå”2ß@k­">œRnæƠÀhKlf^/î%Å(•4R'“ ¹_!ü$¿ùûC‡Ôt×S,uÀÚ’–7œ¥tÊqÊÜ©™­ˆX|ôé"é×’Ùè÷—œưä8ȼBơAE@Û¯|qøœIßs¬ú=R}çC ÉpÙtúj&‚‡D|"ÎÀÉ“~P¾ï» }²–å¶Sy+ÑưđFµ(g‡§ØXư6'1Ú€n®ơ™´§÷”Èdteü‡Eɯ{>Bếˆú?ü±‘ùÓç_[ß ùïÀ}O7ÀƠ?ù£@+BO‰Cơ³‡:B§Ujºk=ŒËf¢µ4ưF, ô;k,×àöÈÈ4à£è§÷₫úúz½_oÛÍX”$¡à%‡•üÅươk¨äæ^¿ó­̣ Üc« 楖Ơ¦x?G`vf‚ª–cQê´×E±Ăa?FúĂt²jÓ­@§˺¬îɇ¶O V#Vî ½(6¾BđzÈ¿i‘  $µrj é×?ÄïIi1<$.#ñX‰ 25ä¢X¾ˆ®¢'*§e߃œÆô!!S@ô¹ÂÙˆÑDÆ%đ1:¦I–‰{@PH#₫@à~D²À«;ªZ E2ªiC&pØhòde¹ÿµÙ̉$'Ùʯ²`À× B9 *êGIR+dEÂ&À1NB\¹?m9iî”jô‘p?DXYXƯ nnỘJè¬ûP¡ •’ ÷₫Ũ?VöPƯ F#FÊÔpèL!8ŒQZ¶̣JTS­¥µ¶®ëÚÖpŒ åN‚?ÅϯÿJQN”_OFO‹ØÄ ÔQŒ̃ ë'ờ–PüLÉÿĐ)Å-“u@‚”:X†ño.›v È?ø—n@°ÀÛÀùázßÖâ[¾Ơ»R]r:…ûelî»oÛÔë÷Àù éϾa@Xi’ưáóÆÿsëÜ8VöÄ‹Ẻâ9< ư³,ç°lêØ áç:{Đ&û¶ÿøă»í—ë¥ô₫§ÿzxÑ₫ù÷íÎëª`Ä¿ă»Æ²=mÖ€VÇ7¥ :cÓˆ0“˜óQfÅ”à’˜±d¶i:i`|9„|ŒPqb-j܄njˆ|üøñt>½^^?₫\s$Q«ƒ3 %7¹ÁhN){ÀŸŒ£NF8hÙçA†b|(‘Ú9ÇRÙg/CBC£åÏDê.r»¾@¤í½x)½£ Ñ¡¨_=5R1³Ëạ̊?ÿçÿTm×ëµÊXaÁ₫‡œe ԟ܆`5hT.}lđÛ¾÷ÏŸ?Ÿ×óvß3’wUơéü´Ömß®×ëÍnJ$́‚₫ 2†(£ƠAÆíÆ×Pë3ƯWÊ#›Ä¡D·™!â›Ă¿=)×Ưzë-dÑ9Á{ÂÇå°‘ï:?½ÿđ¾÷₫ÓO?h>†̀ó₫î(»¸¼f°bñ±<µüˆp™”LcwgêĂÔ\s=lKk‹uTçø/¸XVb)X6W®k€°f©ĂGv¨ 8TqÊ %z[ee)₫wt+i½aư Ơˆ-̀£m™¨çÄT[›˜lû¶í[,‰\BJơ¾‚´ÓR{̃©;Íàuxư+.¯l¦»Ơí.ˆä¿ƯmWQí*&{Û£²Ô5—Áq<²°̃Ă‹f²{åܧ"jư¡Ö'9)ÅФ¡éA}c‡È‹,>D‹O,0´ ç»_çcÂösˆƒ<"+Æôe1@Ïæßu,§̀!à₫ IÈû̉s7AÛT ‚bˆD-m ¤‚²ăØM=†1öK+§‚=%ëáS­ÈDLl¦¡søÿW–ùúĂqÀVpư™›‘âH@å³€ˆbÿ£ ¤ÿ©̀÷´ÖumÚ¶û&"ŒáßƠCƠ/vrË&…˜ø!íeC6ªxSƯ¢~÷Hú'P uKp~D·dƠK§3¶;`đI|Ñú‡âçˆø«̃€ƒzeE:"‚pŸ"] úgo²à8%»éú£ï¯÷÷íÛm¿ù€Üû’ÿÑø¨ú/½Ï€1UûẠÁ}j%c:dœ̣6‘Ü€ñ?A_0ÉFT ¦ZyL̃¾EzïÛÅͨRf°ÿó¾¾ưöÛ?^®—?ư럶¾Uqç¿; âÓDñwù]tĐcƠWlƠ9nưđ1Æ₫Ă©Ì OwîƯÓ&§o/ >NùE­µóùüîư;OL³ËQ. ]-À™¤2i§Ø¹Ne”ä°UT×;ü&xƒ†ïz#ü?Í[†ùwjƯ¶¾wyÏƠí¦×±Î¯×ëŸÿüç¦í¾ƯcT́ÑmÚN›¦Ig‰QôàƯáÜuổûÏ?ư¼,ËưÔ#H¶ªYäcœç°Ë^…›t›ñºåhĐv@Æ“: ifóØ¡B11rJ#”˜BÈ HkÎCJ ~¾®ë»wï{ß?₫ 2{¤¤7æEd¡06£ơ÷9¤ûèô®m\1,é[:îthëüw±ïw₫7ä r1J¸9ñS…¨©øû8§ˆÑ†>ú¸5âv”̉˜-I>ùï.{°üƯiéáÀ´^$r)¡¤Uû^ÚιK‰̣.r^ÏÚÔ.¶í›$/ÜH9bVpA=¸̀oÇ^ßR̀‚"û‡Ø¶f#'NMµk¨ƠÑ3ê 0.2wCù‡ ọ́€Î8n"ħ™à€Øªí™¦5éu]—¶ˆÉ¾ïñU=úH‚ºøÀÅG&ÊÁ@è–jù„Ç“/5(r‹ä’Ȇq½…{à. ú<ø¿5A\5ΪÇIăt%] ÅXÏƠ" E‹®XûØÇ׉₫^´ºÉæÅa+(¿DNj”ơŸ¸$ØÁTÑ đ;(a¶Ï‘đăoc‘ X—u]Wí{—ƒàÿ»ÊîØĂI!^ JưI‰ºô±’ùßË €¼}ª ¢™Aª‘să°”„›ØZºiФ₫³ÔO”PËrj§‰ÿăî$ÿö)é&ù‰:DzRÆ>@?%…ëŸßÿ ‡'_q¶Ïû‡₫¥ªHĂ ®Ñ´‡ÔÏ®̀éNy¤x’Đ?’$5»­ØD́TP2©÷pS„¿$å0£"<|́₫÷Ïü₫»ïÿ₫₫₫ợúĂ?Èí/n²_ûp"S¤Î˜ư? N¸?¶1°áư"Í6kºqà$„7à`ơ"qo :2G¾=r₫9€Ê¶o÷íÎj2q{ưן„Ÿé"ùÂà{ÔÉG±|a´ đΤÊqQT~ºß8Ôơ`“®&û¶Mï$́ºđM×/â‡ë—¯_”c;f̃Ư3iă§Ñ‡?´´¸Mÿ¯÷₫ụ́sÚßV•»¦é½ïÛ̃{‰®àPa,¥ËÍoM äÍJ«’˜d %ÇĐëi=ŸÎû¶ßïwäC@¿ñˆ@\³Æ¸Á+X$4^CđÇ+È3…Åû°j™¨Z ÜQ̃!̃ 5ó%©€F!C ÓïÄ É” ¢9qúF*Æ’Í4$; ÆGe½Aơ0©-;ˆ‰Ú:•ó²8 è×Àạëˆúž$ïĂ¯8Æ* ̣‘ö̀ âù8¡­Z}˜Ü×O¥N($=ă×éœr6ô°zz“ÑD2d’sáÆ^%eC¢Ÿ̀øG­¥́RÅq>pß›67¦>́%ó¯«ÿÿí„Øÿ¤øÎqq£Ü®ÉÖơƒk?âî¬î.ĐÿNB₫9Ạ̊ïÛ½ß'Ü?9<8Fú§152uzÙœ™gñrư'•‹—K™ª—Ư]è0¼DU.đb0‡`¡c X⾜E ÚP̉ë_ÿ‹¶´çççï¿ÿ₫ẹ́ fù×$Ü̃zú³ü yÓn6"pœ´³üO#ûŸÂĂÚf­3g?—‘¢Hûàà„3P,Q1«ÛlÛ·üQ~ß"‡ Ka¢rWđJ”ÁMq’cÚáx€à°Á{̀Ù\…) D«LA´zR#?Uǹ¶íP]Åk)– đw—GU¡qÜZ@p#A=I÷Ʋ8&«*­Ña đåѸÓ‰½}¿&úŸÖ'аt¹]o˜e?¾ù5MqIp«²™cOƯq€~­…¤dö€cV7Nˆ+ÀÅ9-ñoóµÀt¨ pp`b.0Rä%² ́)™E¹Ñư~·l2ˆÀİ­̣jcút ô<ÊưÎŒ]‚Ø…Ÿ9¤¤>¸’’í–p%}-KR5~t(*+(é6s·ÉpV&'´Ĺ¡0UPMQ¾r(„ÖVB½©Új«d˜ÜïÚÉÖ> đ0Â@çHÜ ´º¼‹}Û}/c©× C—S)$Œœ•ÿÔ+¯MwÛââ§9RѸMÈ›.*^$Đsu™ª©ŸÈ|̃ñ¤ó̃ \ Ù(J“–éỤ́Z®d©×U Oe`₫û?̀º1±Óùt>ŸorÛm¼F)0’6ñ:böÙ*8ªi5è@(ȃM“ G¹M·$¾mKU ±¤ƒâË ; ø[JB±¾€»„Q̣üC)˜ÉX Đ“Œ×ÄKŒBNJÍ̀Vo«%T/•ø•„Cg•îïËԂ૸‰ …£¶³Đ'±}¨ …¼ù¢“)·mC–ư‚¹£WC‚~>t±'Ë^'*@{¯"ư:?Ơđ‹+€s„ƯăBà'kg*¹3…åpœĂtú˜G²EÆØ¿,sƠïÈûẉ:H’)08$́%ö́hæk¦ê}÷Ä.¿{ßCö‡ånw¼™e )T§KÊzj–å•TơÁó<¨Ü $ưçå̃pưuûAs|dƒ8¢ôă³/Ưv»ow¯=­´‰umú|~̃m}}5³OŸ>ưă?₫ă}Û¶­Ú²ü;ù?Cnm÷D1—I *©ç…eM8…«P D؆Ú_‘†)4 C/̉D)0€T2Ø̣¦“uĉơaHJÿdëÊ°ÚøÓ'0Å¥À̃1!QG>!'́2­ ?$Ăñ'ú÷0a,ÏCÊ¢†:}d”Ơ(e +̉Ê4­@ØåñZ™ÇZRH´Ü-”‰üƒPt̃4æ´n“Â1ø*Aw0«+œ̃·–ac¥}4ƒ‰cÿÑ *Fë_ uù:•y¡óÍÓ@‘Âv‹6= YyMqÙYà[#SCI8D´®`ú¸5jơ¦Ëù̃Å‚×J•À$̣j¤8âƯå,r2Ê”*v̀¨Ù/ Ó‹/O•'S¢€?ëíđn­Ó–½É:ÁbÜ—ÿë¡LgƒHOÍøÖ|QPƯKPÓBåÈÛuÛÚç¶SOtÍ8S Ơ±Îc÷£gÅĐ¿̉\€ÓhË8±°«x ¯ÿ›±dÿ­ó“'#£XXœg²Ê”ÇÀ;-{ùQ ïÔê†Ư„uU>mï×ëƠ,ƒ= ผ¤h<¬,̃(€•ZÛ˜txe:UŒ- Âöt²W€ÿ«Éá”·́À˸4Ö­bGñùé₫ÁJ ă:4è寥>9‚₫¾RÄî—°ËA$C°̣5Mñ¶b!'ÿ'(é2„o' ×h6.åu|ß²m“¨/ÁơC12y>|œ!¦Â‡YY–\ÓÅø7syûđ ˆô’ß’ÅL¢|—¾Yø]f¡j_ac¬6ƒáÀ?$íư±à₫pÚ _ ˆè9}U@¹ăC‹™?Ưª€~¦¨0è¿û~̃?½̃ÿ&Ù"-;’ïºt~R0ª4OÑ·Øem˜ß̉†úrvªæµEø_T ¬…~|dÀ;|8M¾qN§Óûï¥É?ÿË?_·+§‰ü—Ọ́ñăÇƯö×ëkïưóOŸ¯·«™9ií8ơÿ«8‡ïŸÈ?îÖPŒM¸±S*H¦Qç4̣~Ø`º =Wj$ΠTÓ§vrSœË÷àt{o=8ü_ˆ°4ƒø^•6đu×u‘­oÛ¶ao °Ă·Đa^r.†Wl|›°4^2¢K±$rSŒÅèƾgXĐ!‘Â1<ª@̀œ˜^Äỡô: jÉ=oà)ŸóiFd’úèVѸñCüuThÙ¯Çíj< ”Kv] ĂÏW2ơÀâơđ sBÁ²+0ÆÁ²* èpb!}3G…|çø_5̀d÷fj₫e‡»K†:vë0V*ˆñ#ZqÝPûƠŸOϧëíúÓÏ?q́À¢!MöÜW¢u ),‰‚́ÂX h¤́Ê&Û*ëfæwÑ¥ºKi†T7wbT̃é@äcTrlÏÈ~Œü‰&ÏmÜV1#ô»»·ÑG¥Â]VY!Ù)© ¹đUœôŒ)†ºb£¸‘§¦¼&q¿Ăjñ2M1đÜwv¨ ·˜‰]n—m‹¢J¸–tS®Ü@Y0*hăDË9‚O"dK§è<“«u‡§§++Æ®E8±-p|ô È¢x,±µ{ܬ÷}sUơHœ«äÄ9'̀M¡øè‚ÚßwëƯîA^Ạ₫•œŸUG3xˆ-_„êbÁLĐ1o mY–€2ÄüâÖôHø_}[¡đ£D́%NèĂ}±ç]­HÉ‘Û9q÷+Pb|HưW ₫ô—½¸ZË_=ă‰\‚`f³̀ÿTï»èr̉“WT׋­ª,O†ÀưylQÿµÉ%8~NÁ÷¼6¸Xq…h¹ÿ¿íÛªë0Ưàªè•¬À†mƠ|:@`O`˜g-¶O€’.ƒEÂÊ$•zG'%ÀRŒ́ä‰̣ôüôí7ß̃n·üqZ3ơÎI”øq2Y2BA1 ́o ~ƯØăY‡AÊIχ…:rà†ñÔK––Ö°Ă!— fu¨‘µ@F®üw’‰”ÁejÔü«å’ËW ô÷́@D¨ˆJJC¶Á“„+Ă2̣°©dŸËÊáˆađˆÄh‰’K)c¸w # (”@Ài‹Y£₫̉Ôœ‰́ë–Ê㦠ƠÔ'âÛǘp¢èßOU&8idÜ’^¼Ë àcËCˆÓ’·“ô8>DJ~‘ñc±œ_ipü†]¹Ù̉–÷ïßw믗×Ûư~,•²`=Ww…W¸÷”¼©qª:§Ü+£xRT³€³<‚‰+W.#{Ăó–R1ybd ^+Ơ@e'́ÏûöA¯åXB®H¾z¬pN¿t:PÔªơ„¯_SS[tAE`SN&'©NÆ €¡âHDđ̉mÑä-ù?¹Óƒÿ£ÍSÜû̃v¿ÁÊÙbưä²ñäI ‹ <[X˜ =fêƯû¯÷~7(ưÿjiXaĐư'™N%»ÚĂƠèFä}¾ZP‡rabeè퉈Ê_µ¿Éüÿ#“̃Â|;’d8:§ ($+Ä[ øuÿt@ûÔ~$Ùó)ó?Èká{N6q<Ơ—…‚ûn!…älŸ¦í(đ_ŸRó'Ä^˜ ߨ»-äá< eQ́ ÙËĐåwư™È?#ƠgÿÛ&MÎçónûíëínwŒ*/¿˜ÜôvÚF7à¾û“Qíª+`îưs`ÀâÁ#̉gAÂ13ÇỶ+X'₫ß—/_₫¯ÿúé¢Ëiy÷áƯưËưº]-ËĹr½Ü₫|óEơø3E~Ưv|đ˜¸sĐgÇ›¡?¤±íưÀu`)ö~‚UƠoAmh́äYËHá™Ù»˜Đd®L aï(Äh)ÁVoÎn_5EDF\ü®mÛ¼`£<™”da7€“!ĂŒÄ[8Ä+ Rcåă¤l$$¯I•dî‡MkÖĐî§|qưté‹.?|øÿá®·Û?üÀă9ƒ×|¶hø‚×c$¾b:ÿXjÂñl–ÓĐLOñ·Ï¥«C©u’ßơñ*çÁÉ_*@jΦÀà3'CL— ‘^”₫­¸gå$đoótˆ½$T=Ï‹ßR±óF rp¶ÙÈäüâWđ*yÇ «z„nes1ÏeÊƯÓÑÍ*¡¸Ec'6m×Ëuß÷{¿‹dZ —đbTYecßO[RAX2Æ5Çf¨ †„VWY£Öơ=óƒ øè~KBîÀëxqB¢̀·Ö¼¤µA¹SƒK¸«µ§ó“.ºïû}»Ă#u/áç| vĂ Q‹aÇDÜ(€¾kƠ•…¶|V[oe!ô|0ẤظÍÉ’waOUèÿÖ̃) 6Ư×çÔ ˆÙ–U"₫çp­£è™’îăö15 YDé̉Êàè WưRDdY–÷ÏïÛ©íÛ~½^_/¯³ú{Pƒl¯)ú$Ù ̀ÛÅ.² Ÿ€;™Đ ¨‚,‰‰1O#V¡h eCÖ{¿GÍUéưŇó‹P!êÀK¡ưÏïâ"gsß̉Ä¿£r‹ăx.üeéÏ I);è†èƒ)­Lå¼Ä:â;ô9óïJ~%Hÿ%cO„–’~Oµ£Çu 6ûu²Đ'3₫ø‡[uj'~Ñ«` TƠhLĂÅfѼ4<±,n üŸ)êÏe®ù³Yđ‚P̣ËơÍ7ßüơßươåvùù¿ư¼Ư·£óª¬DMÑdư‚£R²§çgªà₫q­üŸéGà`ÑRˆ}U6m©˜VK€KoÑû}¿¿̃^»ơó»slḲE¤ï}»op{€Jxúọ˜ú?øBDấǴ/­e–·UnXÆÚ¤p>/ïªè Àÿtk1¤”ÍÄ€ÓåˆyƯNw±îç<¼”â‹kN±‘y‡Ú0 (`.iÊ“)(?Fq tđx5«M@æ$€dS!Uèœ̣û Ü;+¸µ§óY[“Ÿ•¹9θ¶éWL±ám<`%‹˜mçN½!ëIe¾}ï“ÔB₫LưwOàü₫üWóW__¾öÿ;¤Ey™¡sưqï…æ-;saiµTºD­óàP¥¯¿è+€¢¦œØÿĂ"¥²:W*S”Z@C ̣G9†!ªk1è|:r¶ưßú(b^«‡‘QV+³+B¸j:ËDÀÅp|4æ?p<0 aˆ?ØÍ‘"<Ÿ.× 3èGÈ¿‚|8₫yx è3âç6ñVv’W9FĐpxq?ÛO6;­pØÄIÿ7Rp™ Ɖu8T‡‡™]¯×OŸ>í́×p¯™GwQ(j¼å¶´¥-n$$₫ ₫–¨—Frđ¦¬ûHø™r¼†±¢˜˜Ë*¨’¬K̉ÛÑ́H%̉µ‡ê¶ˆǴåÙ@Ïạ̀†Óè½÷C†‡²ÎißÚKW-Rok®#̃âyœ¡ù˜=₫êѲ™6&ïÜá–y¾ñAÓƠ¹åar¿eÏ µ¾Ûzí₫~Oï´`NJ2=pkJE eµ¦HÁ”™É ́º}“]wØ̣ëâÓôàá́ªÈw5—mAî*Ù™ü´¦íéü¤M=4)â;”\×µ[ßdóäz¹îëî5ûZ0lAÉÖÚY@ówÿwß|üæËç/ÿøÿü£¦ư0“©ÿơcBn¨¬Ùø¶ÂÛØHÙ€ ʤètÿ>¨ûÖßÍß•=÷»7ü¨?¸@ùd·ư¶Ư¾¾~ưùåçmߦE~¿¢W̉ư8‰h÷çPï̃¤˜*•ú?.ÿÏ‹ ›Yˆç »)à0ƒßŒ{Ă½¼¾l}»̃¯(Ă—A:x&VÑt0ÿºj=ÿ6å°§&¶̣cÇ'AI(FÀF¯sfC¾¼eđq±û*ÁB§ˆ$¦1¦¸:TqQ)çWÑ2èµiÖ°1ëOÜ€&pđ+ˆÏPU©ÈlặNæhDJ[Â’‰Ÿ~̉•P½Fqªe¢g«q\2ÚøưøéÓ矦¯ U9f9˪Cèú€ÁuY–ÓzÚ¶Íc´eu9?nâ' ¾ qXü¥÷ç8KÂ,Œ"‚ƒ_”ăæ‚&’AÓ‚ù3oÔ ?"Vm=QI6áfqG’ÉU¬Æ 'x3 !ÎO¦…yŒVå$“››T³Pû.6å%jÀóW’ixÑĂ³ÁD+NL¸4ÉưÜ5 ô!Ø´äÜG+k$ăF p₫цӱp|O§gÙ+@d\ØÎV^Ÿ_3³±ä¢(Ọ̈¹‡À©]À^¤~T±€Ư¨h•́r4ØÆˆ¹—«È§EÏỗ//—»ßLØŸ§&*hœwêƠJf[}¯cÍM6T<ó°g .Ë |yWŸ(Zö|X $?Asf!90¥•ÊaÏ…áTL SbÜWo«å-*SA¶Hi@,È7)S*9w¹*Ạ̀çöÆågưÉåơâ·v¿Ư5;`̀ÅRI­ÖÚûç÷ß}ûỮ÷?ÿùÏ÷û₫‰¶(2mlÚœ[îµC’zD~" ø¾Ú›˜Ù*¿î¡øç̣\!Æxÿüù„º}úÏqJüˆH?Ê1¹̀>€ So«x-Ç₫‡<üZ1[‚™+féÍnô'‹ƒ{úBرª3üF ¬6ȶ²MnU]–åÛß~ÿƯ÷Úơ´|!:ó'†Ôcü$ûñüÛR1₫¯C"£₫¾h jT„«½Đû/ñŸ>ËöS̀«×wÛÿù_ÿùÇŸtsRp?ÿÀư‹F{H¬s‰³ÓŸmn9û‘e*¿¨U’áÇ,+ƒÅ£¢|Ö£'ÈÊđˆ+ÆO1¹(|8 aryàüå­r%|¸ûvYS̃qÊ|°ÜÀ0ß8nă¼‡#diC‰c#F!sÄ>Gôëoiiú[n‡|¶µ ́¤ØJ˜ Z(º6ö[|€rΈ,D¿âc¬:"m‰§±€: fDà€¼óô-NVZRÿ#h\0ØŸMCÜ1+MóPû9gnóĐr\<_;{8ƒ4tïÛ¶YŸ—)†ÅÀ`¡é0Đ½dprp©FÄ̃Ê€³—•ăÉÍÉ1I¨;u3XàđÚ²< eƒ*Ͳˆ4çÑ‹ëqyÁM×îNR/»‹é‡Cq$¬Éb¨g=Ÿ A!Âë„F“8˜‘áƒ=Ø« ppUVä–µñ(ä\ O¯^|€r-T0†2}â1K)— ?„¾~ulH₫[y#¼e6最b9‘a`^ÂsxË ›¸Ô¡Œ€#³ ö‰$â‘mÛ¾~ưº,‹ª®mu8WJHn©,A¼Î*Ó^£eëRûN@;i©ÔƠ+Dd‘ÙŒ¡Å›ˆöRæPUˆw+LªÔˆSbÎpT‹_牓©]¾¼´Ø„¢/XÓQj6¿4„€.ặ8¦“r§…ă8C̀ ééÂü·û¶¿¼¼Hz€XÆƠƯ¤ù_.——¯/>†áèf¹°ˆx[1Ä]ÙÓ…ƒzv’­OÎIG–LŒè¿Âă‚ËôĐ?ÿĐù™Đÿ±ú‰È #,ă½ơOæ<Lód‡U2r~Ø<…ƯÉÿ÷P¾Tx÷¸Sê€?&ô©°.ƒ±;{¢÷2–QÑ̉Đ³ŸÆg@EĐÍ%~‚Ư¯ÛɯpÀ'Ù•ă‘<ÑñƠMZ¯æ²«®¿ûx»Ư^^^¶măÏ/4Cá̀iö]7Å&™Êô=Âî¼–*÷2ù·–ưà&MtĐÉ­Âóú73ṢÁí†]H₫§ü?§ÎqÿG‡>µKsî8hÖ`±c}̣Øb~äGYæk/XƠí…äQ™çMÊ©åMḲ8—xp,‹ñ¥¼68²®Ä‚Yp/qÇémW‚Öè2ÖĐɈg ô­BxÉéwWjÿë`8wײ-«#§̉á±aÉqvNU7ÛÊoï’N,i”“ŒïPÖq—Ư¶¾ơÖÛé/XL¢²o»ƒ¶Zl£qÖ䤙”¦´hX0w?pmÙÁÀ B¤ Àߌ×ÅFëÚ£ÚÈ„ÆÉÈ¿Ê$Ù`^0 Ó©·6K ›LÓ°q@ÉăW¸ŒxL±;#HM£1ë÷+“l›Å#ξJÁ–´ ³ïÑ— ̃©Ơ1WÍï̀^¾¾x }Û•ôX*äüMĐ©Íó6\€‡¶Oĉz÷äĂ/9̃˜”¹¿¯yÚ+€«¸•₫̀„Æ @2p0Ú!öO˜Ä瀑YĂÿ@æ‰9©vÙÓ]<0y8"ÙEÅ®GŒçôîÇó’ø„àdÜ?~3ꉃ¥ËO?|zùüơv¹9!}Ó*Ø/Ë©¥̉¿®í̉ÀiKI[J₫iÄp=€₫¡UïZF¶#ºÏä₫’üÏço₫I(J¥µ˜`ºéÁ₫AúKq́ơËœŸÁHüºP×[ÂVTº”p,k…c›80Ê—b‹•Ö'Öƒ{•öÆá̀vMơRư5…,,«iµ́„>6Ç₫©¼d)4ĐÁ!J‹S¬\ưă×ê[äp63\ 0đ[‚{Ø}̃n…ï“óÀmæ8œvD¨B¢¥¿4eăNæ]l +çûB*’}*Ưœ=kÀWDYdÑ@—öưwß}ùz½^·mÎNú"E3¹‚ïª`åxrs Ås¤söƒ¡âsÇđ+¢?ÚpxMă¯4¯ ±ùœƒD-àCç/½Ç¬ü®ŒÏeÇå#ÖĐÂö•–ÈØ‘Ƨ|Ѧ`%r¸q O”Z.=ÊÁ–áë†0ùäÍ̉ú×ZưĂb˜¼nŒ ->‚¶W(´ë5IVÆF¿K÷K¼p6¦ Iëé'H„F†Aa]“Đè Ư-ŒX,¸Ú:"(Í×Tf«¬½í0‰V§„‰„䣿Á*µ°™Ca®/ÖÈù@=†ïèÿ ï%)j%(jZú-rh=®„øéQé̉]'›Èë|dÜÆ‚À†Ư§g.ÑI®j ëLĐh<’°üà~ê0mC¸B¶½G”\œÖÅ®l áXẸ̀3릪̃ôͲâÿ˜ÄxhĐ,Ë…#S‘.kL±D&đv½yKă½ïœ˜̣q‹5@ÓÖÚ̃wơö窆ü¤ÓXÛh´÷KÓú‡˜"d=IêÇ5CÿŒưWá/«¶33¡îó»Uàµu¨)|ƒ˜¡eØÚ´‘?T« ÙX‹ 0\èùÀV÷ÇÛŒ$>ñ„sXœ-ÂÇÑƠ®¦?₫9TnŒÿ ú;ûEˆưr¬¯hCáD|=ä ơ™Ô.fˆSÑßïû|±?P´Ÿư^!ÿ>°ÿ]éxDÓkJ₫—? óü–;pío¹Ôÿµ­ªi_Nu2"¤J\"¢ f¢ô`å·ŒHæ§Vëc ˜˜<™1:̣‘́áú©ïA¢₫ rº© Ă%!2z›'Ù´ bàÅXØŒïG¦ÓDd̀Çñ?Ê> ‘T‘Ùàæ’G˜yÿ öƠ„«s  f2¬đÛn†”×9[W™#¹y ̀!Q’æÑ(©ç-5±Ç-…êP1¤–VÁ4ø>ÜƯbcá­ÂLwPï`Ç5GZ´pØĐ€q¿¯ Ö¥µÅc·2úgƒPa0%º3œ<àlĐ ₫‰‹dŸûqëdư ăỊ́đ̣è¾&s¤ÿ+KBà'0Ó´L21­@À0̣‡¢ûuÁ1Ïkö“Ÿ†71†n¬¤d¨È).w13G‚`q¢u!~NZ«Ø-ra€Iå£₫3i#Q å_8̀×-8å0}J àøç„mçXGFgc÷d¡8̣” ôđD́ûη€éÔ´{ ĂbCn–%à™ ¾@:Â1®qß‚s}‚{ѪwÛQ$à₫@8üióhd‰F¶¦–O+ø*¢*Ç6HưÈĂÂ35ö'|f&¼Äz˜8WCAR¡ÑM¥G @a˼Ç*&2©nèt³±}ªˆœ6i˶6é‡urƯ´ơÖKÜ)×yË̃…1= Đæù¿ åyÇ\3{X;₫«!—̀̀ŸđÎG-v¨OrÊ?M€QĐ˜ê·Á¬#ô?®î₫QÄó°èç7:Fè́m«®·,ơ3x’¾R˲Ô~8ú8˜öÈ÷êîá8ÛÇù<₫gOÀó¡‡C̣öåS%aÚùdC ¬@̀t¦ ß³î'Ê+À¿ßîßú ¼$&¨Q̃]V÷ê(öW°¤?UØƠdè_5Đ GPDÄIdÖŸ>O´È₫ĂúS9)ŒIù¿äX½8œ—™­Fœfˆ–‘àĂ₫Hô₫£ª_ö¢k¯ååhÙ@z1 ZÈ/¸U åL†đ₫* n ©qÜ>¢́3 ™ÙxÇüƒ³¼‚kÁ…Ú5’¨Ă˜ƒˆ0ûƯư#‡$$£Ơmă‘ó#x;Zö}½µĐ„ué}ïỵ̈/ÿr»ßn·{5t£Åa,'qØ —ÿ41*é§a]ăÇÍ€§A † ×S₫ªŒ ŸĐ?qø<Œ ÆYQkÀÍ@qjÄÏ4eaaÏM@! èú,¸åÇcIêủ3³“k5fÉo˜êÆBơ•pD̃cËpŒ“̀t–gH4‹cœÁPR,v^Ï®|²ï{¹à©Ã¤M“®L½ (od̃zÀ¬ˆqFàŸbŸ°Æ-‹¶ƒh”N/’3N†Æ\´A¯+™(O„f‘ôqPFpz×à́}צ̃Ù&¬œEĂ‘™a@i© `ÍÔ<}!R˜̃c.lÖD"ä Ï !äá.¤Â1eɳ¿,‡À­½MS÷9´/[FüO²#X”>÷PTwWÄo_S6t×]{>ï{l‡)$O± ¬4NC±=‡W‰çFÜƯéü ́ç§§̉¶’̀÷HÿcÚ2̃"t°ÏÖ :í>¶ÿ‚È×X+¢@â {£^|cưS¨B$ƒ£Í\Ëz§ÔwAÈ£½áƒiWÑÙ@8¿8úÚ¼)¦Ç¡qY.6 ülÊ*Ñ6"¯ Å$ôri¯ ö/%ç?8ă(O³6D’¤œBßùC‹ÖdÂàIơÀ²ZŸ!ơ“è?t~€-ÀÚ¤%Ç î×,és&UhüËZÿ³€₫¾@ºăWĐñ6x)IưßlëžÁÔ·öG7_&ưW¯ß~ßûîÔÿâüØvÛo^CEŸ…>q³:̉~åZÍ~̉’ ÷ÅwZ† @±}üy+ê?¼†×²̀Vh-»¡ WI¢Ÿ´­z è^¾₫öâÿÈñH†aäôôÓéÔZÛ¶Í ‚ÓC©ÍvÓ‘¹GíÊßÎ%wÜ3¢Å{W7̃u€BmŒ%Œ~ü@ Ñ‚_Sơçè”èçè-ó‘đ`§3æÀd%¾Ÿ/t©…À& pGu1ƠçèĂđă!L«ù?\çàđŒ(Xœ`₫ø‰̉´m¶]/Wod6Î4b́I¹Âơçê­Óqđ…h€¿₫ŸúoưöÁëªÓà Ô‹€ḱæsæVñhû) Ù™»“X' *Ôí¡)Ẹ́ĐEŸ’WH$q’D?ư‹ù+̉mÙ»J²ăêG˜¿;¦ÿåaé¶6W%ß·ưAl•Rd:2pŒXÈŒü†Ù&*̀-fJ“ å$È9j5JR#QƠ¬ÓI9`* 8̀ˆ?©J)kăoB*€#îXhpÅ7‹&âp/%“¥Á´iQ·Å.‚ä̉”© T0†Â”·d%jñ“Ă½X¦O]zHªDÙ̃̀´%‰Ø²¨ Uíµ¹â_¼¢¢=ø?₫u₫Ép4Ä÷ÂùÔ+aXlœº‚t3ÿS³£"‹w•ç<³á@)9¸Rµå%çhƠ§ç§¦mß÷}‹vÈ(˜A_ ÿF5ơ.cCøŸâÔ–Ô¡₫!m [ø~ñsJY@§ˆÍ‚o₫j÷¸k!g$ü+´Ç‰IûF˜–t È/V‡¯Ö< }ZOß}óƯi]÷m}¹ˆ¤ K„$á~Ó¶,K1y á² ö¨–á̉₫óƒ½7êø>ñVªü…ƠR©½ûf·¯öc}¾L,´>ÑÜ÷­#-¯H…q?"ßĐWÿAđ§¤~Hî́öCl7M³Q69ºüJQ˜8fÿ ü¿¼úÏ¡?ÿ₫§¦śŸ@?’©Óhơ?žeü·T°¿e0öĂđ5ÆÚÿp5Q)ÅÇ$ÛM¶>’Ôß›̣Oº”ÿâ•̃ạ` K#ÿ/ˆHkí¯₫ê¯N§ÓçÏŸ?}ú4ÿV|̣_₫r 5Ö´+ó<YF‰é/ˆL€;H£¡c¸“özÚ ÜiÿrÔ™C>2eù́q=%~YàÉê{'Àôº%ư÷ñ.æ*#ơ‡ ¥× ô9|x¢²§0sL’«P•¬-èw R¾½a‡Ü ,˲mQÅȣʷöÀà›²¡íÑ/{ uöÈăDÁđc“‡†₫“À™^×ÓLjÄfĐAĐZ’™f.ä‘x¢Á‘À‡ ½ß̣›/Ẹ̀¨œs#ˆ,âK=’‡@øø·Œ/̉µhmÀIơ–i¾¾ ‹÷Bbw´Ø5‰c@ Ç¢Áá‹~aÁ(´Azù *dƯ6¥_„́i ó¿\Ă c>€¢§ØqqÊæ¢SXú–¾a£‡h9 LO|€¼Œº˜l†ï­̀çäàQ¹ÿ–$ÀÉ9Í+LºöE/"e‰̀¨1MA^oPŒÿ„ñÜ"Qà̀é⌠œ’Ç©bù¼ơ@¼<Ä& àå{P³7Gn‡¶*—BùZj ’ ¡Tdkíư‡÷­µËËå~¿û@Nm̉<‡ƒØ̣̃–ú8›XÎvó“4jh4"µƠñ×–ÇFp ZvûÖÑ,®CAÅ4åSàß=’PâfL““̀ÓvZÑøÏÿé?üøáÓŸ₫ëÿơÿsZơ¾£ºÿº¬ç§óÓÓ“™m÷ív»Á(óưPáé]âÀ9– ¹Ơ-öXèü€¢-Æ\Æú[ß&Ç h3Vº.Ađ@Y`@p¸¬~GG̉ ¦-~]Nz*g@`hơ¥s^%¾Ôo\é<£V_¸MưCâị̂ëĂbÿ¬đ“ núk³Æ?’ơ¨@ô=á…bdjˆ²¯ÜÀü °üà U*€\®9‰±̉r2yúDâ#cPvɇ$ÿăyFưëu¢U(Wïü ?Öüt:ư—ỵ̈_¾ùæ›ÿú_ÿëO?ư4ù S±Dí²éÇ̀¨`o-iX’Œ‹&Q¦:…>Ht¼ÂĐTPÉ„ă]küÇ¡D!O™¿L ³Æ5¶wá›ÑÁàŒG÷ïŸ|°r24Àđdy äNâ& gnúUÁ ºñ+–ă¦Û¥?3€´˜éÿŸ´m’$ɱÅ@@Í=™YƠƠU=OÎ|#…ûÿÊ’+\áÙ{9¼Ë™î®GVed„?̀ûƒ5‹ê¡lTJ”‡‡‡»™> Àh Œh¯ÇN£o|ÂbÚ©}øđáË—/9€8̃Aß9§Lİ"ßfήÆ¬­Đ‘`ÁĐê(XMC¿”#‰Aƒs2M%á ±!ƒ8c-D”¥O²_æ4$ 8$Mo ´̣‚ßû~c«ha€~rY‹G*ÆDæĐ»K+‰̣ĂJæ¥VNLHS\} v@Ÿûz7:¨œˆ}o¬ºÓ,(Ù±Ú»#ó¨Z諈©Œ$`“l‚«Tד\8ö{eÜà%î‚—ë„\ˬ‡®}]tqDhƯN¡°Íç¼,‹Q®±u¬™±Oû¼DG¥Ô0‡!6ăfXv˜Œ+AI1§á¢Z<¼_Ïl>ÿ PƠÊiÖ¶¶̣÷ ¡›l>É–ZúÉeƒĐI‘ÓT—ấH9yNqË(%‡™…ÿ SĂN¦x`³ˆ5åÔwqÙđÓóÓétÚ¶n_¿"è—"¢êç¥Za°IÉKî\Ø„‘ ipD’æOË`Q×ßly–ñ µgy"ˆÈ)ÓyIÙïíWÙHÖ_W… ;+~êÉYاǧO¿ùôñăÛ×Ëy9oº)²6V9Yq¿ÀbЧ›+¾A Ê*ĐŒogø´I…K À1$4¨\ uṾRíià~ âhiF¨ 1ƯÑDEk®üÉH€dĐøDè›ñù¢ωDs‡₫›b£ÁƠa2̉ÄN§Óúá·ß~cÉ̀˜‘cSlÈ Ư3î¨p óÜ¥ƯÆhGnh~(Fu’Íđ’L"}Úúë‡ßå­–H'dâhäW ëwü@sÀÖ‰{Ú‡Y0/ ü Ơ·₫åḉèNy€8yîđư ŸÜeÜ×û¶m峨F…¼¤Y›XÛ¼˜}ĐLH̃uP8½ c¨#đâÁĐnY•ÖH²æ{;‹¥ääÖb‘°rå#%t́r̉âP%†:J-À#Îë3âNóºơo‹¶³Ä¤̀£4áT\¼›/Ü ³ u8%€|¼¢Ü*6ÈXK%M¼^$øÊM(!8jm}´ơÆa#7ÆFḯ¾wц11™7Å0ÜGÎr(xµ`¯—"9³Qtx$ñKă‰Jq€Ư,ĂÍkÑs£[—F¡½¯÷×××Óù<¼bO±f-sĐ³b[ ;ë “S kï–‘âz q#¢¼ÿ®½ơ¬VœĂE;x¬”"8q6/.db'wROí¤Äô½~0Ó½½ äâæ¾è¸äøu95i×ËEEn—Û(ă#$÷W®đ¯C›­Í[ƒ”ÍĂV́è‹gwúL̃°˜QàßP¸=jü}Ị́>œ |?K;RH?¸¬ê» ¹V³öƯA‹̃É¥ÚœN» K¬¶â† ơ₫eˆ°åñl̀Zÿô—ªÛÆÎ(‚Ÿí–ÏlC÷?‰₫uRÊOëªư¤JÜéø·œ–¥°ûû¬_/ơĂ¥?‡£Ë™'TX_×6B̉ [₫€…ø'cÑ€ÈéÁ_I…Ai³j y2úf¶mÛÿ÷¿ÿ÷_~₫ù¯?₫èéxen[îÅÑBÏpä7íiqÊ$’s… !‹ÜßÁTå¤À°÷Ấ¾MáiK¨7’đ´\’ÀưØÅR'úd~€&#~lX”)tÀ3®Gv‡9₫ ¬_ ₫„qÏl3 ¤q˜ˆa¾XD¡³o5­¦ E5ưÆ-É\dRåR¡~Ïp5¼h­™Jp¥ ß&‹ü`4lä ˜«́rLösAÇLJ¡b)‡ ¢k "9À¬̉ùq ^²È“j]./q2Tt´àŒl· \†:(’̉ ƒ₫Ÿ̉À´ä̉©j•Í7±̀<Á“>Èe(¨¦-7pó0ûΪ€¼­·ß^~[ÚiÛÖµ¯)6>³H&iÖ<ÈĂZ.̃k £ÔÆéÛ$áÇƯ¹̣Uª#ˆäî†Ô`¾¢üoOù¨(Ê₫$ụ́Ơ=Lé¹²±W‹r@Ñfµoư—Ÿ9No¯o º“§ƒ½¯wS—àlX릉–W0—S5¶4*9BĂâÌ6̣}Yđƒ.N€₫pgè_aܾQ,VkÎë¿Do&§ü—¶¤Ö? +!Ø0 ơHn¡îpP‚.¿nJ¥´úªR~ÔóÙwùE=P„†øg»ù3ƒøßƠúÔPđ Ơû/?@*{$ûÁ"tè?€Ú€d:•@Áư#ư—ûÊáZÇ†Ñ ¨öIFЧt{€Ê4æRz£+/Óss₫ÿ¸mÛûoÿ­µv»Ư°A|Q¥'Éê¦)‰"ÔAX–̀Fç6©VØ—·'{¹åNÆœX‘t‡qV‰ÆPĐä5èÿĂ]/¤åăפI%4\ưg3ÛÊq€}¨4ưÜË̀'èp:NËIDL—°oL"Ûœ4Lÿ ‡‚¦w•êgI²Ù0Ê©Àđ¨Œ_ˆ¬Ûú믿Êÿ_|ưï₫V£ú8´Ó`îù½wËÇô'{'!üĐ ø‘µ-­k߶ͶX¢ÁÁ@ pçđ ¤àŒ!­JËf³»N¬̉âu×d_üˆeŒ́̃8Âø©zÈIçˬ¸Ûă~̃8ûkü%e)GZ­===ÚéơơƠ€ŒÆ‡€„ái2Œ¹„¢M·`Ă ºù˜\M5HœÆqRŒØ|đ±×D—²q”"-ED…kÉKDcÄdÓ-Ç5˜†BÀëKHRK6Aơ2&ÆÂc‘ưi²ë¤ăÑ0£¶ƒĂpÍIDawEV€ë/**~üá±€·LpÄÅÍ"pG¼‘ªSd†‚ûå dÏ/à‰F@ÖÙÔ™5FL éUÿDEº¬¶¾¼¾ ¬©>¨ '?­‡ ­aϦ"nZoq2jt„wr@ܵèB ¡W´Ăñ́ å~̉-²Ơ$uwÎáè;ë|jO_ú\xÑ™₫l85uø O`[·Ÿú©iĐ[;q3°HÀ¯mÛ^__=G¯Ic¡ÄFƃØ!î%æ•„ßT¡…₫eIŸ@Æóă(đïù¬YæÇëiD¡‹Œ,ă1K\¯•₫SưßÎ ûóWÈpƯUSÍñ“®Züöh]́ß÷E<ïÛ}³ ™¾û·m›âƒơÜïÿéüĐH<©i¦­t“TåKÿÏí̀Uÿ‘Qô?K©₫™̉ÿ(‡Ï,x1%SbYµ&© Ê’¥́'Æ÷!ˆăA‡Ø”ö~2è4|!ZU5³Ëå2ÓH¢¹Ơé†×¨xS­Úèn}Ñ…ß9…>jÇ¿BüOUö*JKׂ™Nè^vÈ#‡GiŸY*”‡.^́XæäÄdq\¡à~~Œ}º*ˆ^đ̀ăăăÇ·uûå—_’E[Xÿ“F–“̀x. _’£ùJŸq”¶@ ĐØ₫à₫=‚f'gøu[yyÁ9„ơ½€2¡¿CäÓÊuè|:‚¤u:Àœeyx/…Ѩ™‘1`úÉ× ,ÿĂ#J̃É₫âœÍÄÛ̉̃®ok_AIåădŸç ʃHJí±´Ë#¼÷W%Dk˜ùŒ<Rm$Që©ÿQn%Ú2“UÁ~L¸@©s¤…±Q¼ ‚ÀƠÇ“bçÓùz»̃ïw–Uäâ!>‰^́;)L̃r®ü@ó^qè×›!R<̃‡ä°l½K(c“ÀIF£R­R™>Î…“æo5Êeªªé*ëINÅ%(éÇ‚Cª£-æíƠx²e“é»44 éK¿‚ùÚ«o‘/(Öë™ö.Mµôm”6råSæ£]}wP“æÚ ½…|Q,Æ© ù»‚EÈ}:W¤EåzÇ5. Ÿ§QÉ;íüơP ¹Ÿ¿në¤Rö9Mµ^MDÖˆ:¦> Y^”#B·í±Çw´ñ‚5°°ÖƒTCYØ€đY&vJơË,`¹ÿ¨î¬Ê¨̣ÉÜÿ€¤m¤;àđIm^aESo=2H À19Öâ‚ -GN¡8^/x‰GÿÍĐ¢"‹´„0*ú÷hèÛûˆñ„>$s~4÷} §–Hö…à(?ƠÿºœơÜZKé?*`ÖZŸ3“+`À ư#ß×ÔtÑ&­ßúܾw»»ø'Ưïüe»¬ßíÆª¡[¿MƠ~a#:²?£T)÷«²?àÖ¶Ôû¯m¿N§ÓẶp>Ÿ½Be£.Èé@üÓJ``öbplÈbĐÏè¿G()|! 4\̣Rà¯=êå…dˆæ7]Ú""ë}}v9Ä„¬£’ÿ€₫é O5Ùư¤¦|¤¦§~˜đprn…‚°¹ jM*…S‹£ùi‡«B¥sú₫oö"pAáöç$jpÿᮌh/˜‚ôh HˆøxXj$JkíÇúÓŸ̃^/ŸùŒÍŸ`´¥‹Ú{D,È”ƒG5s̀ă}8!˜¤̉ÉưkÈPQd ’́r g>́° ¨&¼¶}ƠBâ¤[kçóùééi½¯œWVHvˆ¢#/Ô}N%‚o–8ăÏØAâ+‡ ܪªÂÂă²G`M‰w\̉qg6ú4›AÅD&SÂf¤ö­çXœÊƯ|i˜#-@`Ÿ£¬ˆÏPlTPËÁr΂ŸÄ@Ñ”-W=RPZ{xxp˳nk˜åơóëñ‰×ëU\1o !Múä„ }–:2Æ. Gk…ÖÜ@] (Ú}r?~üøøüx»̃¾¾~½\. ›R“}£Ú’ïÇQz(ô!̀ỪTUtí«Kw àϤÜcD9, AJÿĂî!̃̉I]¬Ñq4XiÈÎ*e“â­Í‚øéQ)úL©êÖ7‡¿. …Ë4:oíNÂ(?î»”wíÚ½£V®RIÖ§ưbK <}øôáÓăĂăưv¿¼^|5¦}¢ê’¤QÇ ÉHf˜€±tAS&%¦4|€(j(ÄØ—–îŒ₫ë±̣›OßüƯßưƯ²´ÿă¿ưÛåzH\d|”Â&»K§+²B§ă*?ß r„,-ủ|—²H,₫aëFŒ2¨ˆl_K'8"¥ơ %¬©½q6pĐ$.€H̃î.₫ö=$3\6³¾ơu]½û:ê²,ÏOÏMwt/„t‚„ͧ5uó)* ”’ơ6UqP‰‰‡}'«e¡ˆmTS’­Ù ÙùWGdY½*ªz:–e™,ä´#rØ9’ ¢¢§Óéz¹º8g^ñßă0~Ÿ½WĂ•mƯ¶¾ơ-ßxÙà=đ4°qñ}|Iº‘-É4…Âç·´¼`̣“±ÚñƠæMQSnX‰4‘3Ç\¿Ú̉¾ưĂ·§åôù×Ïëëj’́€_sâlº¯nưr¹ỗïÛå(Ø¡IĐ₫îeäxNÂ'ÔL’…ge d‰Q4–ʲ,çó¹-ßùÀVvÙosÔBĐ”‰ÇE["¶`ƒ#¯Be“²`,Ä÷Ú5VSđœ¥Íñ˜áú¦íùĂs·î 'bÍ5/‰$›Ă›Å‹¬‘‰?öü`ỚË”Áå€üü@\e•È?nÚPt“­Y[up+̀óîEhï¨C牳bëJdŒAvu„2ü;qLº·è%O‘öM Tĸơ˜¨©µS“i!+G|YùôVHH9h”#˨©ÂwœÏSIåÂÔ?XÍóN b+8! ô? ­(eúj"*– P-u)îˆư–¥¾ÊĂ=€ö†¾hcΈêà7QƠTüw3¤ü:¯Â$û¹ÂOß6Û̀̀_f’€O¨VÔ„x°°˜øWM¦™uÿÇG:ơ(é£Ôß·íúûNiÖmQN§–ùhwƒ…¨ÅèVÖ¯ZNíÜDd“mƯÖ»ƯYư.¿¬*ȸ÷»§I°q³+ôPư™ơ×#úŸàñy9ŸÛ™{~±ôÿéüôéă§çÇç···í¶‰ ',º´eĦ Bkû2©aÄç…đO¢†Œ+|îGÁŸ 1ª4…½ÊĐçp M&`iËwß}÷ÿøŸÿ燇ó_₫̣×ëíÊU<@Éèʶ@îHÇÑQẀk j$•ú“Í}k`‘5âæy2&ÂUó˜’ÁÆG‹˜÷¤œ{» yRâAÁư4́Ó/áWäŒL¼fUщ1ÖÛåíó/Ÿ½/ƶi{xxø₫ûïÅä§ÚîAR:cyĂ {ÆAµ«€!±éc7gû ̣wÖ@95ẉ€2ê1{¤¼¹äu¾Áù3w‰¸HU}xxX–åv½!ΓT¾“û1Ú-‘€ÄÍ>#]ûư~́>îvÛˆá‹6Ÿd§*̃$= ²Ëȃ²­bÀÖ’@¹+î„ "PF0¼ÄrûS! Ë+È«»u?Åàz|||}{}{{:FÊZ̃“"̉{¿̃®ë¶z@ (̣â¢ä!nùéØ C“4‹ƒf^ÆQ5‚5ôÊYƯơzmKsÓ|°øë.`ÔÈX†́ æ–M¡Å¿k]Ø[Ă‹7Ư%;æŸÜ¢­¬÷7À3^䥛ăỌ¶[Ú‡ç¢̣ơơëívĂŸïqp8sbß¾=(ç^Ö(PÓ£‹-”0M¦Ü€¦ÍsîƒJƠEqLbsfrăöóâ«|.÷Ô6âs­æÉ0ñÏ·Ÿ+"Û_%;₫P™R†0Ä™ªÊ"º©×̃qtêË77)9́Ïç~Œ‹F.¯@f!¢g “3ÂgSUlÚ´8ºñ£ÀâưCÑr•Ñ?$ƒéWª7̉s–j< ÿù$¶ø-‘ƒ,œFÊS§_!É@¹Ï₫m”ûdÅ¿¹4Hj’€Wû!¦jrF¯™BÏ#ç̉rÿÿPŸ/ˆ¸¸j©kI%,¹R“D%°D‚pO©ü±TơX·Ëưbj·ív·ûm½q&Àư÷!`TđÇC6Ϻ@sáƠê₫S&ÀŒûU3v¤e?¾,3¥Ë©úÖï×»K]t•ÔÿPœjĐÿm„ùZβœ % ±1¬ÏŸóÑ `üh«%)œ^íµ•e,ïø­ˆ´Ö>}úôÏÿĂÿđüüøđđ0–X ­2\p¿%‡‘ÓÊfÔb£/˜„è(æwë!̉7{$…@XB;?£L“…]V#̀hÄë/+b›tCFÔ…[q‡<®¡Bó̉eƯVwSưÅcêIÊóÈÖ #€ÀˆF4ÄHuâ;$bV‹,i"hpJÍOh͹½W©4¯D¦†Ü¬à[ö‰heOªªwÜd±Mq±û’CĂŒ !ùëƯNÔúäj?û2ÿhïƠ£Ë¯Q/[Cè/́̃“‘6ªTX¹ Ù̃+ë~j¶÷B²µFsd?«x ]ƒë‚²<Ùí«¯×ëơåö²öơr»°°g_øß+{̃í₫éÛOíÔ^^_₫úó_3å·oSgÁ,ö>~Tư/™¾h@ñU7èÿơËm¿¬Ûåơ²Ư6 §‹“¤‘₫«$’‰z˜³ha®É9vo­ô Óá4̉3iCkL€Íq2ß1¡/_^₫ëư¯×˕ϤqGGÁ“ĂX Ÿ|àzF"EĐ³ÜŸ›”wbÏ+‹Ïù£Å«©G{̃¯æ+™è±çè=™.]ó}Øn ˜ăue°S„cz ÷tÜ`ư±B0€³¼ë-jN÷̃o×›ˆ€kÜă₫´`@Y臜̀èQ¦_ƒJ×.ÜЇ@Àœ0P¢  ôà(}˜Ÿ~ÎÑà×Ä̀®ëê´Ÿ†f`+ñâ>à¿êv½^OË u0fVQä ]Æ`í>{5à´Uºgö£Â£‡(åZ"ÖdÎèrÂgå₫¹+tçárÀ9GY!¬äRÏä°‚jÜg"HÚ˜¡VV>ïñ­o?ưüÓ—/_®×+êTrƯR¼’n“¯Û$A$PN%Ư'ǯ)Á11÷é ˆôÖ½ÊêCæ‘H±[Ø̣Ü•éÿÄóN„癀DêÜ¢K×0"2Êăȼé°nGN ¿YO2±h «(9Eˆa6Y’îׯ¯miLÿnd^3s¼(–P AQ¢Ï¥â]†.HÄă~ºñôsÀzÛ¶‘lĐûx C ĂM?°E±¶±Ç™€Ïƒ&6‘p 5ơ¦PI¶…w 6Ú`a¢̉ă˜}‹D&^Åÿ&̉åv¿µÖœMĂ{¦CB20nÎ T ü pvQ†èv˜'sÑ!ư‡5>%MƠư§₫¾ÍñïèÊ+¨—ÂêR ü˰q·ºÎ¬G)Ëc:̀Ï>Qø{Đx\å'ơÖư´LfÍŒ X8ØA bNÖœ)©ºE²/(<­é­%¸%ôwåRu7{ç‡e蛌z¦ÙÀË60ư·~sq¿§ù:ÖŸrß/÷Ÿ><úĐ?ÛöóÜúí̃ï¨ô?yA©8'4?ÉúSöÓJd…®I¨L5²¨»¦`÷¥Y·mƯ†K°P'àVr§:Tø‚ƒÁt«w°&Í@đ‹ÈĂăƒlâU’RD™â|rÀṾ¢Ç™˜,¸‰™ưúë¯ÿå¿ü—Ó² kÍG;åd„̣µEä ȶ̀̃ZpG|=ƒ̉°x€½‰á@†^/r)&ƒ¡ fÈC>m aÙ4µ7rà¸ßYó´B*/à—w»^¯÷Û}(aĐÄ@ÿµIÈ đññÁñí£!¼>Hl•Ê—±,‹Ă?²î'‹×j’®Nº¸¸ fxÎ@ÏS%"Däư—iú„^ïE"KW#k›ë\…5Ẹ́ÇI>møx̃ơ©ÑQ¢TçŸPLGƠ×ËUU×¾–E¸[%t@1X3;X·*béà¥Ø]uưM»ui#[Z{ˆú˜e÷%EXû¨›äÙƯ]»ôUVoë6&bÊ{̃­êiiMû,]ÜêùđÖ›$í)Db““²Ô€ùNḉp5ƒĂ’lă£QÔ$Ï\°~}«&³́_cµó®ïï}‘e8“QèS\–Ö% „Y3ḯûv:·³º́gÊ÷…́dJö%JXjÿ`ưÁ÷Gƒô`âÀKÆb ®ÅèDSL!•(ö. ÊXŸÅưHÙdR(7 û½3„=$SJMÔ;éÚ¾Ú©ĐŸ)ÀM¾<å:?F8[HĐ" }™$|›¾Ḿ₫jëm»BŸÛz7ªư¿­ƯúèçÅ-mmíñăăémqƯÿ(x¬yï>¹J%8ÿY ~ü °IZ4ưèŸp?Wưo\ưsªüăß—Ñ’BCóusf“%•°—đEQ₫Ơ×ÉrZ¾ùĂ7÷í~¹_ú-;₫¤&Å-Æh²AÓGsHçåååơơƠĸö?Ôw¹Æ¢«ñôn˜cî´,$£d[¿?Q<&Økă^)úöåSvƒ€<9œ“AÇàH€ÎeY´é¶nÀ Ï%1ÖLÚ±|̉O©äyF̣¨ `ôÎZ¤ôÁ™Ùơzưëg˜)¥S<¸&+)ѪօÏy9Ÿä´öơ¾̃ûÚñ£–$tlÉ)²1“P0cÄ#ÇÛ~U£đèÁŸä Èx¦IǵyA7ö́àûô>¬”àÏÂ_bxö›dËØ$˜‘`´N¤5s™Û„!J0@'÷”%À:mtÀƒÆªœgróưT]ĐÀµ”<3ù ¼ưE ¶Ûû¼ùœ‰ÍÀ*«ÄđV –̣ƒäƒO;Öś‚œ\“eY†Ï77;ÀÊ $hƒ@äïé‚ơT¨Æ̃„Åmb²ÊEîATQÑ$uùAÁXu=Ù ‹ÓÇ”2ỉ¼._KrTƯË2S# ®‰!»Ö̀“ơ¾&ửåÙ?x>*âåÊA0­ji“¢´½ "Ih·\äăUF°Äß…øÂ¹ó‘Àj•ïÜ ‡gryâÊ*aÇç”x˜¬ÙÏCºy"ÂíáíFÂøQ‚ơ ÷™¸™ÔKĂç?­«x4₫²ƒ:r”ÙŒ±ra•™̀ ̀é±=ªƯ?ˆ‡^I=±TTá4ªÊ¢ê¬đC̉¥Ü|‰ J‹Í (œµ¨Sf;´¦–̣H Ơú-Ô>½8ăIøØ_é/€„.?ˆtºceSVƒ’¢]§ÆLLüÇÏ‚ŸRé®Ú3ĂƯB¢ Đá^Ư¸ljM…ô†ÑêËÆ¿̀â Y¶ưêQîÓŸ±,÷¹Éọ̈ö̉Û×Ë×ëz»WËíû́Đ?ƠöÙuàÔ¼£ÿéßy«”eí¬¯•Ü€á¦ÆB¨ñ\”T„˜cP€̣™JnỪŸÿéŸ₫éº^úü¦€¡¿ …óíi!qÜy4Ù­Ưy°«ÍlÛ6Ï̀&-ăÆĩ¯¤mĂV…ăçØN›ƒ$ M#ë—Âr¥K£qẈ¼|§'‡&–VÚ6á¤?Nmi}ë#¨[+¿ƯƠä€IDATÄÁׂ,˜˜™=<@¤-Üß PlÛÆE ùÈRäS €ivÂpe|_̣G †3`Y^ƒƯ¾ñé!&V̉œä0JVoÓxŒe‰ÔC‚cx†Ó̉¯Œj†₫&ÉѪf;c‘ù3¯:G°jˆC+ÄÍe2Î\Ô<=ÿጶqÖƒ0½r©¤8`tƒc²å̃OKx¼Å°Æ„Đ?pö´™fÆb¬¡O”\¢O–ê·ÈȇÁ:ôB~P(j+¼•t,†<øˆIáí\T 0z$Ék•Ưrw©I1MÚéñôèṔ@ñ?ƠùA¾/ê{ôĐĐ|èO×ÊM@™W:¹Áå ùù ­Ẹ̀ç8à Ÿí+ưfX}(d†æ§Ê?ß Bé„c®nMÔ;‹°C¡áƠ~Đê  ß…@#ï¢-(÷ €û3¶²5¢?hpÑŒ­o«¬á`$øÚÖ¥Ü Фùé¥)˜?øËùơơ×ß¾₫6Đ?VaxDn¬!£üẸ́Ƹ/8÷_Ä?̀ư×$`^±­5oÎëáå:®¶åÊZè¨G̀=8ưñƠ3 @U·¾½|}Ùds€^’ƒe¼Ị̈b€Kd.ô–1)₫1ăÊÏ4_j¨Ü»7kU^i¹æQæ5b8ăjy±‡óĂÇOEå×_½Ưo ‰¥î}Â-˜ q;1ïéÓ²\ÔÑ¿D°Ă6,€ ½F° H.â·Ă·hÏæăăărZ¶¾½¾½ )ÇÚ®ùN¾Ç]óđr‰L&ËI~Ơ“6uÿrJ:ÿ#à?Iñï¾»[ ”EA•Q̃]UV.ăăÙºăŸ?><—³ªöµ{5†D®¢>J™ø»¤ô:Ÿ“N˱Øeüöø₫ăÇ}íŸư <”̃“F2bØnœµlG°̉Œ’ª-*ºyz»¼ưÇŸÿc“íz»öŒ?åâ„¥NÜL0(ó‚iåơà·Êd?ṾKBt)L7j®0‹`fÀqlOËíÉ·ƒ—á¬ÂúÄ=&ÁLgck₫\ög₫Ưß³[¿¯÷ÖŸU“é?4,É’b.ªœˆĂwf»œ†mvdf=‘Đü ¼`Íó[©<<<<><Øåvy}}•h2/2”ëº.m9-'ÀÜ!OHV§́Ï£äü̃hTà^hu´¼­)(Óí¿wĐîÿÄ8lï_ªÖ:ˆÉm£ƒ2¯„dîc´Út !m: ÅàÂqåÑØüq’̣¼ÊrZÎ糈lë/» ‚û®ÀúNä< Ë~ñWÜó̃€³Ûc‘• '*W¨RÏ#[€‹eEgïváä« ÆôæH€QÍ6yĂ”QQÑÇÇÇ¿û»¿??œn·›×ÍA¨"76ÅùélÉœŒ$J‘ç§ç§‡'éry½€­ÉœÎM7£¼<ŸiưÜ÷\¦É+~xxxz~Z·ơr¹°Å.+pZïØ½̣âJ“ûúMQœ+̃cÜ\Ë^Úœ5bÆ¿»¤{´÷aQqá—Lé¬Yº§Io†°̃YĂyèXu•!BÇtLQ—@ö¼±4²8 7—D ̣¶¥®‚ïS,y.—ÁG¨•‹|Gë­ \2|ºÙé÷18=´‡”ơ‡PN‘̉`i 4è…“nÊv›NpZÖ÷ót7üAI‹.‹̃âo-p/‰¿£³ï¡P!]j~‚t‘PJ‰”|ặöµ˜½ƒ~}Óäˆ̣çdk‰\ *½ư«?@¢ ¯½~³†•̣́Ú?~ûñĂ7¾|ựן₫ ʼx«M¾¨öÿÚ×íºÙ5Év”k}z>\Tă0]tqƠ²>?=??>‹Èír»¼]ø|†ô Ù•ü/”+eR]ºv^Îüîúá‡ËÛÛËËË89q"†¼̣å‹U•ơÚKníëzY{ùÍÊ1Öè¼fïÛÔX̉3értNƒ‚JÛ‹>€HYLè²¶H́&·0^B=¿±!ùß(~âEN‚%Å Âa†3¯Í2fÊ>öïØks9x|ÍrRHsÅ^\•?¹®+h¶'ùø} |pk~y½¤÷éèưó/ŸO§Óåz¹]oü¡] „ Ơ•›‚ÉÑÙ+ÿ]Ÿ`4ø=˜H¡Â¤`‡kH̉vÔä9zŸ±0º Tæ’̀i ¦Ë˜ÁbHúŸ £RÊMÂ/ª“·à₫ØÑ˜î «pç%²&€úQƯ™‹‘¢À(FÉ5 ¹Ö₫~ÖvC”4oú}ÏXN°¨BN Àî H9ºXÓxüá0ÀñħÙ{!Ñ?XÛâ‡o0·¬:„"K[>~üøñăó<<|‰h OS^X&yaPePûˆ2t$tTƠ‡§‡o¾ùf½­¯¯¯>­# Â5ù₫Ä"m‚“ütî*@“Ø´=œ€pñ¼_ø6am̃s†îÏ&́eÀl¢\ç}4¨»{ç HÔïỀ`Ó.Ư×öf[³6đ›nˆ^–êpÓª¥[¨%ê‘üù¾Ăœ̣óLrm²µ>dF)ûèç[c¸Ưºv¸>ˆC×G=2E®º#¬+¶kđ7†©·–Á¸f_T¼IOçå ¡C8™đ-s¥÷o–,ʃæKcQ±}ÁP-ú–±Ú;!?IËΧˆ2ªÉ'—ú#™‰éM|OU€p¬B«:ö üŸbdé°Ça ¥Úäño9&aJ|̀Đ34Ä÷à?‘(A+øÇ]¯×¶µ‘PA&H¨da„̀î)B7$'KL¸d>&ÍNü}éF;Ú»ˆŒ•,µ£mÛ~ûơ·/_¾˜Øí~«­‘‚GÉÁä¥LÇ$¬ß4ȱ ¼çtƒ́ÆpÜI öá¡Óü‹”V†¿%<ÅÀ‘VW.-eT©uN„–á…³R EZsÀúF•9É3’¹X~8z¢0ªÁ0>XHœO «‹Û™\̃á ÇRvxëáy™ñ”±!r¥"f.Í ”1æéZL$tA¼§Èî`iûó0/qŚ*à&(9NçH””î >›ëº¾~ưÚväÀ0Í: Q‚û—ùD[HÀq#~pƠè±K`m€í–è̃†+Á¬üG¤̣ưv¿\.9Ư5)œAmN\)ă}Z}WßPˆ̣–̀2ÄCưƯºöE¯¤MÙh­m²5i£Wp²6ê°û ÙPùûܹƻX-:Ùx›s4 øK´†ñzƒ'xÆ ,ú‡»‚OÄíăƠXKP‚ÁŒ`Û"‡d˜zè́´cTñé˜w\²ŒD…›”ót`c¶(t‚Î\H­B‚®ñ?qÿXĂU&A!©úøÄÍç Lđóbùg‰~ºñ¸ ~æ¾]øGÍŸÈîƠ~úàhû‡WT×tlàí²dzk‹?ÑÙ7ëöñßĐS9ú|Ǥü)¾cMØ:7¡¦Q!Íá©æÏhÖ»ƯÑáëçÏ?ßúíóoŸïk̉üsÍvlEpJ@h©Ö ÅCJQvªKpy»œô$"}íèöƠ¢k/WưñÖ ªñ¸µ±tá¸~ưúơ'm·ûmØÙHLOpb\ˆü°ƯưáXF™ÆÁ‹ "µ Ưrö“ÙJ"ü(¸é @u7ª¿Óê ˘N}`¾aé€<íôFâ.̣¼ Ç ¢={4Tü·MËISåvó¨5Đ­Œú³H¤Jç´ÖĐ"ŒÏº­bNè_1“ä ™´ŸîÔ,å™X¥1Y P*ï•Ư ‘²„ăưL½£¨Ü×;̀ØS"2p!ĐO­wVr”G”¤i5t ăI‡KL#/Z¢.øL&èg–FÉ\ß…¥aÆ._–YöÂơb²8½±æá’áJ̉ó'36³Aë&bC'ZQ¸®ưu„H”‚úîøö{p° R\衈 Û­ßï÷¥-h¬Vư Ö₫7áAN{"¶±;ȯđ0NL4Á©dđ ˾ÔDWĂƯ’È8ê‹$‡¯³xăaTó_̀Î0áèf%"¸™4m×ëơßÿ¯oK{ùú2ªÎW-ÜLaL[ÍDó÷H%RŶ‘̃:l—̣́##ñOÙÔµëƇé¤nưz½¶Ö}Đ7FÊŸÂ.Á ́VF ̣jc`̃nX«ÀÁù$Ùü±GtDɤÓr’l¶É¦]{Ëäạ̀ koĂot ¨÷óßæ¼ë„û5«•Dùvv°êXÔ”>COØY ̀RíĂ âÂÔ;ºF€áâjµ‹=V]Đ%¹h_0XsG¢)\j§†¢â9N+Œ€Q5EZ~… ]PÔ¿EÖ&‡[qæ‘_€ùîÉ4€[(ÉÊ‚ß&0²rHtjâĂ%YJ'¯Zóg̉ü$h ÙO9EØÄ6K˜ ™;úHZmÑÙJª¬æÊ@Ø¡øo§“Œt‹Q¸F8Z謧æˆYTüôûZmtûr?Kw2‘w[×mưó₫ù·Ÿß.oè₫Ë~Âô‡D‘^^u²̃ÿ¾̣ϤMg@µß»7Oí[Ïø ưDÁŸ%;ÓS[‹‚UütưƠåíÍÖnQR&ü•²ÿ Ư;ÙṭT́—t5%̣­Ñ óű'Ù[å'Ê—Fë²›ă’Sé¨#7`x¡’¾ÖđvÅÂ{0¹O';-ΖHáâ{^¾¦Ä²$*$r ïŸƯ0 ²ó˜L¯gCœ±é(÷ ñk¢"‚˜̀{MÆjr„<¨ư-»q …ªf)̣̀‚}`ZÍ6»Û7…w†x(ŸÔÈëĐRrÙ&æ½ü–y§{)¬aư₫¶¼~ÿ£eJqñ*÷‘Z-ƒE;¢üù8œÖöt́X–ç'LS{ ÊưƠ₫€‹o¦3‡ëèÀ€*LÀFäÍ–’óÓ¥k¨‰ê®+ÁlÛ¶Ûí–Û³V÷(…ö Ä!ït’ú䲯’ƒq¡Ú̉dx£ƠQ̃÷m‘„IH[¨QD…©töđΰÉP¼³ßƧ®AÇ…ïÁ:ă5½÷·×7‡ ˜q‹R3°óI±`% €n}­ÁóѺƯo^=ĂªµÈd1tÁ£H(úᙲ­Û*+̃¹i)Ö-z\Ùy7̀ŸZüReœ§¬6í½¶ÁˆÛĂe‹½¨#70̣€µ{8T={¸w/"Tüj)ö6i,nC_—đ”( À¹¹“ 4Ÿ)|¾‡ç&’\₫Ô5Ÿ1PT áäïî§,ñ0Ǩ+lH¿‹•„hUÓƒºôÓi9ù…¢`""(`7¸ŸFÛ®ÀYUUJ!Dđc¶²ú ¸ÿ)́•oJ¯;,ñßËưŒ#ơ|^31­p^áê¤̉ºµ³uå ₫h§§ß̉]! Yúk ü¾Dø{ẦÍd'úßqÿ¬à_·t¶¾ưüËϦæUĂ½Ø@ü¶Ö`Aÿ»Œa ưèOöÖo@üPjñë?ÉưvGđÄ¿Ÿt.ùR?%PL…ÿƯƒÚnÛe½ t•Fè´ Ẹ̀ƒ¤ü‘̉#ɤˆ™Ü¯’ßê=:œ»è%óeLóø@Çà·ä˜j"H B œ+ØÁqzY 7m_(l:Ÿƒ³M6Nè¬éK”³Llå²,˲ˆÉ¶ml¬g´JAÅñ˜ơJ¦™æ"ƒ»Ÿ11Ù¡T*>áàœăÀΓÛvö©:Úù 79-˜A!{p¡Fá;`4A@8¿ă#å$ª,Ër>Ågÿ4ûç÷4"ơÓ'*W)]M£xâĐÿá }?¨ÄFơQ{̃¡ÿèÀ`ÁÏÁIáv́đî¼ïêø”¯f‘ ă'5¯g¼¸´ÙbÍOĐÛËiY–eÛ6¯…U6¦åª›®§¡†\‘†hËl ÚYôĂôªÖ1éŸđƯíä8’,˹*ßúçÀó¹DA¥ÚjD%£‚4–æwjëó ³öƠ›û"°ïoå9l·y‘û~ÈË@Jœl»̉IđJp8ƒĂfÓÁö‡'œ‡Bk®Ú~×çêÅœÆÔ@â/k£eE| Z5ƯÚ6̉|RÚÈ ö× \Ïh«¬ÑæUṢ>Öû‘!å6[“¯;ß7ürºØ†%/?< C0²K¥¹ X¼=‘»ÊÆBD7A@ph¥}X™8B0¿œ–­e1.ôD?ÛÙw5€Aü‹0ë–(ÿ¤âdL“rçÁ8âG₫­?’Àề×S²¯Ơ’‹́˜ØÜÙ×f­?ÔeúyFL@´+Đ?îđÄw₫7«Q}O<@¸Â¥dëITàÇHô?بôŸí{ư—ï=%@.èElƯk~Æ‹m"û°²YÛƒđë!âŸjÁ§‚¡¢'=—à₫kéÏTÿkíœô¿”aÜ+d†e¬‚„ä đÄôÑ-Ô>½ÀưM£ăå’°\™Kc‹N—9˜‹ö+a;€ê²°ùhÑà,#Ư0èa—‡óƒ"Hq̉̀¥Đ˜#1z2v¢Ç[6/5kQ›-€@µmyI•\zzúđáĂư~ỵ̈ÛÑ´hl—Ë)UƒơyộøSÎ ÛLû9{OïŸØg‡¨8&€IÄgüíópïMxû€œ>4R€¹T5©™ˆ?àsIưW8Q̣}‚4@À₫ƒ«©Ñ2ÓúW»[(Q?±0Ÿÿø‡?^ß®/_^’¯’¤{ƃh¡æ•Éî+}*d#T`úmnI¥–m£ˆßGr‘EDl‹\ˆ¨è:´.‘$0¶Iˆ¯’†$蜲±$)h4†ó‚Ể]xµKˆ‰%„ Ld~øđáÓ§O·Ûí¯?₫u¾±}ñÉr£Çn<Û:v_÷L3J˼2噇)ƒ $xÊ`3dzܡĐQ˜ÿq§q5Xâ°“§ØéæÁ§“O+U¡Ö¨‹2H’„F¢cTZl¦VáM‘Ê1}©áe%CM[̉/)!…nđ$†‚—Êdϧّ ƒî} e4´oE†̃đaÔ u´ öVC]æ‘G Ç(ơ®ª(í—T•ôX«ÖÓmæÔƒÁAƯg¾£Xψ²úë±5Æ?º âlĐ^ÖĐsJù£?@œJă¾Đ+€¨»$ÈjZ°D*§Q±WæÁ }¦I´P¼@],ô? ưÙ Te`"‘`ưÓÙ0ëÓ²ÈR‹q{2q®Hü¥‚Yơ_: ºHÁsŒ1±V„·¬µÂµ%›ûfÅ$IÁ«€†dE?à ñÏ?Ëa¹¿t/äï§lơEưïÛ}³mÖÿÔ>_[߆æg‹î`=ơ?Đúd·ú ;ªêµÚ‘³$Ÿa‡ "Æưçå O ™~­ôÿRèÎ\÷ÿ†ªe–/×±Àæ}]œLK >ÀĐüHÑÿ§7ƒ€5kmYZJ82‰#îƒ97-j+xˆ ”!úÅ>º,AK6™i %Ỉ]&Ïüüx₫Ç¿ÿGùóüùz»& …;ªj º“-<®×°{z*@ññkNh “E#₫|̀NBkÍdó;à ˜x2{R?ç­^ÿU ^3Éç… "£äw|+̃À:F[k½÷|¦₫gI!‰#%@üGv˜y0v“„ÚüLPæŒrk ˜î/º|üô±ky}ùúöƠ¤ô)`₫Â7À²©s›¬Ù̀©íT¹V£'@:D¢c|x¸ }̀›,Ẹ̈ôüt:|‘L[ ÷eâZä̃ô{H™¹`̉ØîY, ^áØqÅ!G¹̀I“SÈúRÇ Fxøo\¾‰º¸§MI©0 œMcXm*qê±!y®ÿú ÎP´Zi¦ IÉ€.¤//JKnMÊ´1E2Áë“—#Q₫óâîD›ó§Đdñ¶ë„½í£§tqÖuë›j sĐHˆᛑ‹IÛÜ-„'^"ïÇŒœÄf$ƯË–‹abܱa§h ̃Ç}QxæSü!«…Æ6»Áâaü£èÁ²ôƒ#˪Âc9–“û[(öÀÁúi Ÿbæ™C% å+ e›8(€R}s̀—EN¾—zĐöô`DîDd‘¦­¯}[G“¯ƒ:?¨̃É~c$…Ư©Rñ_‘Ö¢Q5æ₫Sñ fתáD½ÿ!úg—Ư–ª7Ü?W5uåÏAÊ/7đÚ¨Â÷üÚÊă’*àè¿÷iX$ZZ`üñ@ü¤‰¨dVƒ₫)KY¿Œ₫‘× ơ¿“ư¬jÔ£º´Mˆœ ¸RJ›C¾~© bŒ;®½Oă?Vr½)ixG˜¼÷qR­BTàĐ×̣«̀%Ơļ\ưÇÓétj§÷“ W8@C¤è%— &"­×â(ú‰₫ªç‡³l Tkp?Ȇ8xO·àëº^oWï₫Ă³cfä¡›lNÙ8@ü[ Y¹$Â(ær2¡ơăö"ơ;}B¡ºă®³XI€æ6&Ư_$  «M$ê…Cö€ƯêT¨5ÓW5È'•ï[d?njNùƯ™Íy¨& “ï"&îà́PYÚr:-NBỡÑæ6ñÎ5c¶«—OR·ù2u¾¼Ü(n2Z̉bU„J°OUôă‡r’Ͷ·ë›‹:ÀƠ!YÚăbTqŒœÆ̃äYă?h ̣?Jíëê—âG¦”² ̀́~¿_¯×¾ơ„™XO>=if›leoÑ.à˜’„€„ư@Ÿ‘C«#!´c+ ¦v¿̉„M(!i@ÿ±°-A˜e²…-`·Ơhưœº́ÓLÑùy‡ß¢XĐŒ̃L6Ùđ†è+.Ñ4Ăz³{‰ùâÈÉn1& å%Iî4c²à°Zec½ëwÏđÇͼ6¨I÷|ö¨ơ[GUP9›mb#‡Øé¡‘ň'‘âS¥ "Y9éu»Ôçèkº_ăº® %ƒ)*˜g(åê@&'T¢ÓÇ.½³ø<¶yS“ ư;ăïA19–“ÿY*₫Iûµñá̉§Gú#/ ØßvUO‡oˆ̣-Œlđưnƒ¬›.úôøÔNíơơu½­ ÿ‡ é'x"Ó*••M”*½Íå8‘0Jô„â?»wÅwĐƠ£ö?±₫-Ú,@úß”DVD¡å`î„̣§[2–ưỖ½% `iÁé)nưæNÅ£4nyFH´ˆ|˜̣o³ MY0Ôø­§ùzÉÿ‡ö€N^¥Æ?Áư¬₫‘«‘<]£XĂh…œ€ă¼”+O\JÄZ(ư«?9âK;Ê¡@̉Êt¦ =:KÊ1‰h%[g …’­%¬MÚĂùaiËvß’ûÜƯ¨[!¡ê%# m°£Û¾ܶm_¿~ơû½̀XÙĐ̀ëD2̀œ˜\®ËNÍD)»‰,™̉‘á¹1i^Á.ĐĂŒ́qFO|8w¿ó[ÿJ/z”É¥1ĂÇs‘J¶ïƒƯ”*z¦lt$ă™”‰ªv tlF¥p¬æ”ÓÉÍ781îñ'Û¶½¾½që">}Æ”}ƒưà?;ÏÚ`…TÛ̉n÷[¿eQ/ ­”¯·Óii§æÆ³Å½´5ˆqàií ÆC”ḱÈ·ô7©z§˜ơ™vV+›«ˆÀ/4ô1s@ïh̀U₫>÷çåüüñy9/o··µ¯¬̀.Ä?ÉIÙf•ÜqϬöQ-6€×¢‹FĂZôO•₫KË*zeVX §B¢¾̃gAY¨Pæ:₫™ûŸ ₫Đ“Cư_Ñ?ÚĂđŒ{‚oÖ*hÍ¿§óó™($">bŒ_ưMœï¬ÿr‚¾Ÿ“§¡̣pç¯Qs)8±)+Á?Øm”s";‰ÈPQMÔưd_ W8—¨ÖÑ"×–₫bg5ª=ǃ+Çâä…:BF5áá|>{•@Ù±×R@ÏÄ"ÀMV’«Ô øz»₫ûüûذqù–C=ª=dÇñŒưèÑU½^¯·ÛM£€½ÔXAZ 4ˆ Đ—¨¼‘*ô ù'fûUÁ¾·€ £™‡qKzR˜Ë£™øc'Ïóo₫jPÄÏCÏ…ÏÎñ™¡!÷ôZóØº….eÂ3_Ø2~µ‡Vy6đ F›ÏW = i¼‰o™×·×Ÿ~üév½ơ-ăăØ|¾Î n^ƠÑÍÇ!kl°è€3³ÖÚ§Oß<xzùúrÿån=¯ÖB4¢ª—ËU]ï+H a ¨»ÖÚ º4Z7@r]Ï =wP|L™ª.§åÇ·ÛÍ;¾1åœÈClŸi?J² cD)öö{7 P̉¸C"97pv`D®l0àU ³·œEÁRhAäQèă_Æ<µ æ‰k˜¶d¹e2^á¸_¢+Ö˜) í±ÆÅÇ%¥>r áE°(ºZøÉ$î}`@p¼xĂôÇ,+Ơ¤!¥=oH«:7/}¤ »̉èb­QỲÜD̉]DÄ‹Ơ¨©4ñ`÷5²·Aø¶Ö<1 kßú¦]=VàoÈ#Ă³9]^’\Ɉ́Â#´à1¶̀yMä¹Ä–R̀–ơEHª OX̃¹ñŸ“›ĂÆ29ESY626ET461îp‚ÔŒiQ̣M’‹3lnöÙ„’| 2ꨨDƯÙ¤T̉ê ₫@Öz»÷û¶n·ơæøØ$yYä Jaer¤„p?#~¸Đÿ ÍO4úeå?£Đ§Î€¿?¤ÿG&»+\æ¿×&_›l«øÎù¾[ß ư¯ï%\€>_¡O¸˜(ø3–JUöH*9h8#SUaôôEĂ¯Q)µ-çvFÅÏ© P©ËÜ´@rÙ“?–äü”[â?àWÓóxṛ°Ùœù˜ïpøDa ̃¸‡‚₫ë׸qQ3»\.‹.^oÎÁwkí´œ†·^ålï̀œ •Đ´P•`øüb\§\8Ÿ"€Ô89tÖ!àPĐ€¡lmün— ¾ä¡fÓ—5¾â ‘÷^¯P§ G'¢%ÿØŸ’€>„@Ø28æñ©ămƒBs‹­öp”̃n@䭢Ƣ»ÄĂié)}VdQ$(HWEvûsvx§+ÈLï“n)3³ëåÚבÉë-ç+JƯg«‰9’y±l¦«%fKÊơÀă]Ú öưW§åôxź̉¿¾}í6 G̃n7A#̉‚dŒàeQj ö³Gc¬J¨†Vẃ¥Ök÷½(oçqûṾ€óÈ“bˆTtDzù®Ë3o:!D{75ïî`U£ă ö7%j ç§<~ˆ‡ mɉOǬù$¶¼6,-¥®Oø6“#”$÷r–œèÄ8pÇÅÓ8U`>Æ"³39ˆÉ%‰Og‚#Á=·›(S3ÇZµzƒó,f㸮‘gmR¬–5̣5b,`QY˺-mAg2SË€€7đ ¾öv:ZøđA¸n‚²e‘dOÜAᤸÆt6OÇ„Y®“±Ái:|®±•³gn£v(–&ó¤+ăI¸"ŸDó˜8§¶´Iö3ñ({ë0̃Ư„~́DJÉ" ß·K×’¬ÍÆÎfø™é‹¬_vûúv½_?ÿúYT̃.õùk€æn<Ö`JÆÔú |Öh́%p„ªûk²ơCÁOu<'åZS ]Đ’™Áù†­D½8¦¥€º¥^́ßË­ "?Ê₫Œ,^ªóăG‘ŸmƯlóêŸ{¥Ë~@Üd½¯{(ĂđØ]w¨EđÓZqbôxxÖŸÛÜê₫[ƒ₫ÇắÙÀ;è®æOküx,zS˜×́ÁcËeÈJŒ2­Íf÷ Y1:;3¡…Ħy\MrIMŒK…›U  †_ÛºY yŸÈétúçúçóéüÓ?_^ßÅ€%k˜ {77‘Ñ$ ¦ Y® ‡…ª•%,́&@? %÷‡™QL¿AẴ4!눡ÿl»¦@¼*v×RĐ-^Y.‚ïQÀ77QôJA‚5'`-5,à¯9?œN[ßn·Û}½sm(̀2dÖ8Y!§èõ¨5بX/£Ö‚F̀q4A8 ûtẫyöă“ …Éëê ËØ¦ ú{ª¹¼®p¥x‹‰–Slđdơ}Ơ™]/—̃·ûzK²Pät:===m²½]̃̀́~»wé}˪¬S P—i¡ ;<²Çßë±PW₫8¶¤Ø&bÎDqƯÑ/ù:±ï1øC₫Û„G"Óë³: ¡đñYˆ0ȸ¬Le¡g Ú‘­ĐÁ̉’´x<¼\Ëfme›»½̣†QY´C[&kxRÊYÔÖvÏ£(Dá₫«­đ”t„ÔYÀ ¢vœ‡-lđ€ŸF‹4NÓ½đ"ÉqØe­ü̃6|OtóÂïHañûí- Zc˾È h̉œû×h¯6„…V|Ó­uׯ9N4ÜávËA$™+0Uv§•…r£³W˜J₌@¯7Ó"̉·¾®ëH ˆJ é–ï,›ä1 ‡Ÿ‡Ϙd¦!¢sñ`“¿.\Ơ§§FE$Ÿ%™ŒT¹+o%ˆƯĂ€Y¿\Øg³í~¿¿^_¨h–£S?ïŸ;×rö­VåOôBn’=Ñ’øbÿ{¡?ªư¤ĐN\2HE½îµ6ơṔDĂd™é6)¿ă­äơ2ô¿m·Lóí£Lèÿ$₫ư¯́¾nëăùñáüĐÖ¶̃W¡ cÍ=‘Ÿ J u¬Ó€¸¿œÎËŸ½0¥dE;Aüƒ¦uÈbÇ©Ï ÖlĐw;@n)Ư{á₫‘†ÑKIÙ|²/Ç6ÄhW6F•¯a: ±¡|lO¼ ̣ÇÇ ×ÚĂĂĂ¿üË¿<><¾½].ooa$"pHgĐƒD½^̀yÈÅ…P*DùÔ<*€|ü·C ?®° ±¸|L1M„àÿk#Ö´Ïç¶´u]·m›"RsO0ÿ~èc¾8§¯¾3ßuđÑöáùĂÇ×uựåË}½‹ĂÍ̉(Ö8 €C~vútA•ĐŒCëhvæy!X_~4’³–ă°Û à>„øyñ+­]‹‹¥µè§sÿZè®û9ÿmd8ë?$@̃;¹-Ú†+?jE 8Üc•b}&Ö'Us“ÙJ¢—ơŒu;Q₫ÉMgª¥±à yˆ/‹Ă¤đ̉啌”kú×ĂĂĂ7ß|óøđøôøØZ˺"½–7IEéFü1¾Î×ëơr¹äđÖ jRƒ$À(œñ“]cĂj!Ï(Q×°ki:öÚ ØDËLá.–eù₫ûïŸûí·———ûưÔ£ÓR7ÀCÄÜsNÀ¦c²Ñ%¶F‘AÆGé§>~ûí·ë}½Ưn_¿~MA39É•Êf¼ÛP@£M ̉±2«ªYË1gÉŒáQLº•[y /û„#Ố‚W,O¨ˆƠ XÏYàÓq: ¯ÓŸ‹dÊ8'ÎBÜû°Ă4AM[ï}[·¬ĂZ̃&)”=ŸÎºèơ~½¿̃=YcØß &3oÉU79̃XÿîúûcÀ¡Ǻ– ‘Ÿ́ûí–"h¸Âh î0MÛáQÎŒí0_Dœ¸¸ûhA–XÅf+øÑåjY[ùƠǘ₫fϯF>•,Km0‚0ØPjIDoÀêùêï¤gOH ˜B ïư[Tû)bă^19Æ‚T>w“²b‰<%´V{V{Oÿàè¯ff¯¯¯ÿÛÿû[tùù矷¾@`Îơå%€€Đ¿•jK[>~ü¸¼.oooüJaŸ1ßdÙù×ú#EWá%z3:çÈ gt‘i`̀%ÁÊ«êéáôüáy[·Ëår»ß4dúÂ!]’1@'éĂ7‹̉ÉxnơUæ…9ˆưTZ¦"r»Ữ^ß¶mÛÖ ç÷ø[jt*#"₫á$Jˆ25p ÆÉZÙ,4 ‘¾d% Uó›N  Ó·hŒ0±L zå̃bgKj̣i%đüáNÉSˆ [ĂSÙPƒ5ÜúơrítVb>¼mi>}¸m·¶´vj_ß¾ºLTä•M›I;=?†¹^~@"Èà2ªŒÈ@’77 (d„æf,»ô\¥E§ḈúèMNnÍÑê! Jq‘`–Eú‹y|ÇŸL;FA!̉`Öœªcù‘4ê·ª¹ƒÇÔÉ@5¨Å—=¹Fă¢4Ùô]E¢,Ù¥#¡“êĂ˜®Z¼1B²¤¼÷—ù¨ Ơ±àæA‡§}fhnz8t¤>#£nưM^¾8̃«,—$¯dÄö̀—JÀúÀÇSëHctœlCñ¹k½mº©h³æµ€Ô« /C‘Óé$*zSÛ¢w,°Ü₫:.àƒ²'D-TnV†·†""Ñô@J›0lŸ±® ̉¾nëÛåí´œn÷ûÄ»̉AöQ)¸́wᇭÆËHt:NÚt½¯đ-Œ65ƒøÿ¢\:ÚÖÚăăăé|º\.¯ö*ÿöŒln*µÍF¢Wù´ơ;ùVÓ|ù_Yßaj9'uàE´Ö_U!Î^Ẓúr`Óx€̣ÿ®de´:܇•¹}˜`ËJÿR<øË(ߋʧ?|zX¿¼üöọ̈V^_p;0À&­¯Ư‹̣rÊ/3ˆ8öđª‰¾³Cçl(ÁéªÎåŸÛÙë~2ôO¡?{2Dÿ̃€{~©ể–1ºV댺ʕïóª’d‡uË„ï¸]f}ƯôØ¿˜·×·mƯ¶móâH‚̀`*>ƒó×Ó¸áƠ­ùaéL¿-¨ÑŸÈ‡̀[}ç½µrûz0óă½0 ¨kGÿ ‡Ö4D}•£ÎÓ5P×éZ'̃«´[ïk/9’Ö>}øäÂKiz>[kºEcæđëP̃¾xzơS2À₫g]¸;,’‰5`ô NúÀñ®Âzp´ üj̃€G̉—²=5ºY"x¶Àiyˆ›ÄØ><>8óå!ŒàWR¶ơRy$y¯…”Û„²/xÚ5̣©–IÁ_’–†ÿXÈbđ¢-Wׯoü8™thW$´=₫R»R>”ñ…̉¢@üÓtË;_˜íÚAđçÚ°œP÷ ø·ôËß+3ºÛauE…ÉÊ&Đq€5OÿYƠ»XW–×°̉mÄ+si‘%ví­;{¥ª[Û¶¶m¶Y$TLđäÆchüH%üÉz·,èdé’¡7X üù¶m¿₫úë²,Ûºñ›ø9{:Χ³™Ưow£ú]Ç”YƯÀ°0†₫'å"?Ưz[ÚĂăĂù|¾̃®ỰÅûcxO6ø{fqÍ ÿ1d,5₫‡ƒQcưng‡Ï¤N¸×B4Ä[£Ê೩¹/¾3'ÍBÿIñϽi¹pF¡!¿å̃ûº­ÍÚº­(đo’÷å¬ê₫ûê z‹ˆ»o¶Î?üƯ›ôíß×_¾ü2¤ÿ}ËÁîßÖ7́K´ e+ƒh@Ó†̉"J¿æJÿœ€êIT!TEƯMzư—̣ÿ»Ê?p±øôJ-/Éëá Ÿ‰çj¦,¼̉,öq¿?É®¦²äṂÊïDÖPÓ—Rq1_«^̉{ÔăS6ÂbRuEĐ'H_Éï2pZà«÷~¹\˜cö †…e{è? eÔăm-Ưîëưv»­Û{™+?‘©Å°Nx"ÂÅ„)>€}ăOÂF<Çéæ‘ÍñÇëº~ùíËår¹ßGDØXxđ₫LÊ₫…G|ÿkL%î¯Î¯OdÁ×Ëơv½ Ư*b&œ­HÔæX!Ö’†_G ??r&ä*EüzÂA”'íƯ;=øQwḮX̃Áº¬)‹g ÊëÑ›́¶Ăñåñ_°à×XTĐd@Û²,ÍƯGô0¥öQ›3™©{‹t¸Î/~(Z »%y€ûÑ`Gɽs¶ÿ†b¿½â…¨¸×—›êk ̀ÉOÏO½÷ëơzßî¥ơHJ7IÆ̃)˜2xkŒ0Ÿk¥QƠhÂúWÊ?Î…gj;PX~d“W­ºmü'Ü*!₫n ¸o‚†-¹æâ ‘DÆáååe¤æ¬Åâ|zzúđáCßúo¿₫¶®ëø r6fHa¢DÁNúUù1€×·W„ QôÜøq–Cø_©œÏçñ#ñ¦eĂTÿoød‹™­¡́G»%¦ÿ«ô¾A‚0Œaj][V+TÎbª[ï…êp§¢ŸøÁOÊ~ ú¯ºFÿL£§2íÆmÛ¶mË!ôï= †ˆßVHÿÙpú¿K8=üđw?H“Ï¿ưâéÂù‡µM₫a€O†˜$y}°#-!₫€û’ÿ1B¥~Rd¥ºè’½~Ûy8ËyôL@ØD£ö¿RFuˬß̉ñWÓ—¬gETĂîZäêí»6 €æèÆÑ§Ü 54ŸéW1l1᜜N'_“·Ûm²³Øº ‰9ÿX ¡á*´ Èâb²D Ck§H1ÊƠ=Pjå«ôơíu]ב¼Û{"#3æ¨d’˜K;R·Ú«À뙄iMKU=áTà)€Ä!×ëơ¾̃ }B‚Ÿßû\¶ÜDyvêøqhIPâíŸôß·»ƯG¹Ï^”?m¶µ{ûå×ϦưåëËAúoởRR(áê¨p"Í÷ÀØÁBx¸wn÷Ëɾ@ÿªp@)ÄèŸJ²§êÄÂ!ŸĐŒ·¥ñWư)ËaJPü ©zî”÷̃ÛÄ7Ưû±¬ªb¤2‘²Ó₫ßó¸îÜ¡q rE’0hÑ9üz¹zđ±đaï5P´á»X”₫›o58ÀX¿ M´‡ëœ|¼₫@^ _*‚ivBM…®*σ&|üzL ÎʼnŸæH‚âJ_.྆DÇ" —I…²´‰ÈQ Ö±Ï è™xT”ËSâœË•Àđ""«đO²¬5î¸%;êđU°l\j¢LZ®ă®¹¦SZßÊÇëưûDHă:ÉEv‘ñ2¡2/³t–H 6Øư¨Î̃­ưúơ¾̃]Ÿ¹ơMÑ,XmÈhˆ»DeÔ¶( äƒĐtÛ6\™¿2}`æSĂṢàXZ ₫Â7ÀÁÔ|g¶6{†{ZxÛ(99̃}°°¼ë\j5ƠÿƯúÛåME×måâU”Ă¾èÈ›Ôâ`)_ờŒ‡{†IaEˆ2hÄ*Ôæ¯b«¥˜,\L±W*xƯí*Ămƒà/ŸEÅ|;'sgÚv±\«±¤-—4F˜éâÁZ”®J5üœWÈ ÆSTDÎç³kú½Ă6Cø‘–hÜ®¢=\ư>Z†ê±5CæùȨ¨ç øw¯êOf§aSWRe»ÊÅbkæñéÑ}‰¡̉ád2n9äëæ}µ´`nr¹Ú„QH+§[_·uÛVdđŒĂĂç–|76¼'T*ˆ  ß;ƈ¡ÿđ V{yy•Ûí–LR°£!â_»l̉­gŸé @–bŒI€Q“I]hůT(†ë䔬_(Îu™ºzMÿm‰´ÄÇà₫÷_P›X0…€'¡¼l¨đ3ˆÿ-Êùo÷Ͷímû?₫ÏÿÖ­ÿüùg.:AV’&{’|€ïŒ́%µ–ưÉ$ ÿqWúÓ´ÔẶàúŸIö3}Ï‚ª»J .₫I·-âÜKmoKOr>ûs‘Y_̀:MÁ®äØXy2¥́…³dÈøW"/g-Ø‘ 4ËÖl1£ sEéÿyºÅg+Đaël–5ñơ)(¤½“<®‘ÀÔ$³yzÅ{ÍóÓÓƒrÑÇṇ̃˜®¿|Ơ_ññ6;oÿ‰/¬rRj>¼bµûU ¶Œ•$ â?¤̉DTlè™wrƒPcy”&Tô½~zº»y”hß³~8̣óŒŒçư®–eùđôAEo×[™”`|xf§¹æ÷Ù/­ƒÅ†K%Æz€¬8J³h’&&ƒÖÅmE‹ÚÖ¬÷Tx3µ¼ÿzzzz₫đ|¹\^__q®ñê2ï0zt#Á8g™ VÍ₫2µ7âÂôG—ʬJym¶̃ûơvơº+™̃̀†gœg³MÈY#eÈï|MgWLÆn¦#!§¦¦=`äëÑ“»â?x«ô7ê‰Ë ¦`ˆ'ˆÊÓăS—~½^¯÷ké à-ëÁǺ`U ›•ùÊ₫̃ßvŸ¦c潌êƯ2€gb­µóĂYEï·»ă#È₫Æ:RøL̀¢EÔ¢\óV6#đ4k®üG?W78­vbƘ£VFÁV‹ËăăăÿøÇ———··7¦ëæ¬Á¨Äô–†Ü”3i‘£”ÀU½ß;ÇÛäyßú¶Ư6&\ømA"¤¶$&Åÿäz»bûŒñ Äœ+¸Q4•·|´³N€®\nÉ'áG)2kíl”Oß­ç‰Á́€ræbđ¨{3¯dDrqúëM}ÊbØạ̊N¶´̀c5×mimifvßF‚iỤ̈ygcßs¦—µÖN§“Gñ=̃•G4…Ás998âÄcgö‘ÇÜ–&*Ưú¶m£Q@ºơÍ×,‹ñDƒáXV|íï¤÷~»ƯÚRú0ŒÜ÷¸Úy"bæà±s]WÄ‚ºvïø†́đư‰ùúöz½\—eé[Ÿ?BËh3áÅ«¶×ăJÊŸÄŒø±.+ÄÇRä:?éår1Đ@HöOá´ơCƯ R´JŹâ£É@`-cÙU+ÿL½¦"SŒTp¼,gWVæËóÀĐ½¨ÆLÊûÔóï£ .¯Ÿ"8 Ól›ŒTIl”eiÂæÂ“R‘Ề_¦­–Ñ_&V¸đbö©¡†¶hu" ¸ÜB4˜V =ë₫ÅXëáN½rß&¾<0mÚ¾ûî;UưùóÏ·ûmï-ˆDAxº́£@xzë\₫Ï|ñ‚„̣ơ†èGrTª"r¿ß¿|ù̉´I—ß|øđüáz¹¾|y,ÀdMs$„å3±†K:“·àö)€i$.å•BR7Œ,đ+ß…[³ÓrÊëç₫Á´#̉ư®+6A*-`äpVOµ€Ư2…œV¼,‡;̣Ø=Üj¯Ä¨’/¬qÂ‡Zy§{ÏdK®cå»;miÓæR …’?/6³–¸TöđAiư±l$#T“ơ8gf̀i&<€ÀAăIáB¤#o+‡$G•àøÈäªOO>~0³_>ÿrïwƒN2”wèrOă3K(ëÖu½Ưn+Æ4‹”BO|Á~ ¹PĂå*j̃Ïg¯ôÿúö*"Îèû‘í¾Ùæb!´óôëƯúÖ¶qX›ºØ`U‘J›Ëå², —Ÿ–¨¢6Åjàuc¹ªî2âè£Ïq“æ¥Ø…ˆ©ÇjÄÁF́Hăw¸8OC;eỦ#Öñ_ˆ₫¡ß=U@Fjv¹¥›9ÿA~C-ÇưüÑQÚŸ¹[6aÉKinÎLEÿÔÿHÊH†R_(ë7äû†JÖ¤ç:?ƒ®Ölœ’ô–"‘̀Ëœ6v—¾œQ¹¯÷mƯ¸æOBÿí …—›₫f¯ßhà9%t`ëÚW̃ÆÈÊ@Ia(ßÉÿ âsó¯–/`ơ_Ûù¼œOß|ü¦ßûvƯä.™ăK(ß[(L²øTȨnÑúwLndưf ^C á´J¬™îÑÿ΀¥ß‹+î/¾ăyU©o–̀.o₫"q &ñÏÅ’÷aë\á/;â•̣ÿxAåĂØà&'̀ø̣̃Ï®Ÿ~*dª¦‰OˆJ˜È~>lö> ×8g_%¡‰Ñó,¦ n!ÏæÊBMă™ïRf¼Ø'ÅPê₫ ³™( ¶˜Æ óåÈ–÷,=_B́ơù—ÏƯúm½¥÷È™ÁƯ$r~˜>„\äà‹å¤ˆSÅí`ß †ăÈ?¡œ` 4đß:[÷–[§óét:ƯÛ]ƒđÆhó¤ø÷\ü@Ï»J”Åáä[D!y,‰XÆé6dlµ̀¿xu¿Ö›µÁi¦™fLÀTBăáï½\ùù—Óg>ñX3 µtd CxÀ5æ% ¹Rn·›h@´S†}ơByá±¹c ĂÎï5̃ƒ{̣XḄÁ¼ïútbOgƯz´î6r§̉¬µ&*ưEœ{ că ‚¬çḘsó*0m+63Ë#‡Si"sÄB 4V¾Ă÷Ñ‚/“Ú»tSór=Kd0§²‘ÅÇpÓ$«{W6g£ù̉=-§Çó£©-mYu¶ET£X'₫„ ăÄÈ̀Ó@¼øív:¿Å‰b€<‡dÓpTEÀÙ–Ö›©=œŸºu/ªùtY×̃{ßtóç7Ù’₫×L ÿ…ü;3ëưăË WÍiº45&9æ¿ü¢‘íîå^j+"Ú°Ơ‚'>C=t&Á¿Pä₫–%Pü?®Í?nÅ₫-‹Çù'!‡r¼, ‰—\́¡öëU½“Ä=’ưˆHA«­ÈưgLÉ\êgĐö!w¸ÿĐTu¦̉ÿR§ 6:|åŒë÷ÛYÎK[Z×̃ïœưfÛº­«T²Ÿ¸¦ÿ³H¨è₫ñô‚øˆÔ¬_ià&¡ă?N§‡S;¡¾ÓaN0àé(Ö© zư®·UVÑè><ơ¾¾]/÷̃.U˜d ücßæ·'Î̀èC5ö'9â¹Wß–258¡À¹ÈI˜^yüe©ddxÍ«¢jD¬—›¡ĂQi<æ¦:¼Y~Ăi|/LÆÀ˜Ø²DU‚Œ˜ưƯÅGèQhƠ_7óÁ å†UQolâ>÷Ï'ZƯ0…n’ÔŒ₫AÜn·!oZUÓÈ'+ƠÉé¨.ä{sªH<˜îèhØß‹r¤›ÏœOMuëëívë¢* lÙà»;àÅkå.ri–üd¶Z)ôA¿ñM·u+Ë~Ú§2ZÂAj¥¢́Ç;³]u‹áưFDd̉*% T̃Z©Bñ{ËC" ¸÷$Ë}Å4¥t3œ©ôƯÅmæWNÖ››™·C»<Æó% ₫S̉³¦NÆéà°vj€3‡§!ÿˆÖ`l7̀̀—Nçô!i¢sZke…éJ¦Y"ïđu:”ûó3#€QªÀxG+^øXâu ĂHù_ÂṔß̉È~$³ÊÖ„°É Sºj‰´Ö´=œŸ̀̀Vó^€^ưúŸă”_ªD™¥~âÁÔ÷ÊƯŒÙk ª™¦mi§óÉúB÷?Ôÿ\¾s×ö‹;yáo(>€­Èüó‹q‹#µỐ  —VdMø>œ><x8?Üo÷ÛíÖ×ÎĂ‹Î%kưŸÛYE_¿¼ª©¬²´ÑÏ«TûÙ‰¬ôlè²Zn‘ŽƠûư'– ÛVóÅM¬©>øĐûz[oæyIJLLàáÚW÷Ï+™́ ¤Đ´ ·đ#Î$©u˜ĂFÇ÷¤Q Œ"& –̣t6³I²´xr3îŒv‡$ÿ‰¼sÎÁ,¸<É»²?“Á²)”•?"Ÿ9[œa¦9éè÷TƯˆ!¹–̀hôáư}o‹ư4¶QÅ© à^^‰—±eÿ₫\y.A<©5ÁqzlФÁƒ°RS¯€Î©ü(B3“øÎ™bÍVÖít×ü<Ă4Úo¯oëmÄ!‹Øăóg₫uwäïfn?Ú4)Đpªzh̀%Ô½̀í)—Ÿ'PƠ{ß¶í@ÿMnTµë“ …;QR)–÷¨8å¡NCÍp-§-û†*ÓLJÎ;U 9ˆepăÖMÓ`pa`™8ö‘èœ!B̀³øo<̃pàM›ÈóăÓùá|»]î÷»¯¶&b´G̉ŒLEovP ` ÏÂÈ ˜,²%äO•Æbc'Qü]·Ç‰¦ÙçC1]óưvµWSéÛœ,Đùà¤Ư¾œđL23»éÙï²i6UgÖLèˆç= 3Ơ·~»Ưœ–D’4¼”‘mK|ÿø~$¬Å£C\¤sx9ƒùđc+kû(í?¢Fs¥ƯûpÍ Z¶ĐˆØ¯'M„”Ÿñ§"€–Rư« p€…°g·í(üÇ2 KÏå₫#–ñ•˜#…Ôù||¿î'²ÏËù»?|÷ÏÿôÏ×Ëơ§¿₫ôöúæ‘Nêơà€÷÷iÔª‡« T9”å1¼¯’’ŒA`'§Kw¡Næ₫Ú ôGÊïVDA%]ØHđC΃EÔ,Ơ¬UM\6µûEW=ŸÎ?<><¾Úëv Ä̀úS¹Ơ¥-£ÛW;ÚIM__^KñÇiÖ ₫‘ÀÅ´~ñ3ÉœÁ¶ÂÙ€ú>?œ6ß\ff¶uÓ¨ü“Ë>¶@:6{åZk*er§cO#©̣5»¢~UFïo¶´M:[¥ÉPâ0°`̀扸ƒx˜Jv’¦œ´ _ËÀà́ß]:U= Pf–%§4Æ>#µRa†}È[U—y^đÑ*…[‚×đi=&”ö~¬Ă**´%-ÿ\*è,CGÊiÀeIh¼sÏ2 Ùù(RÁ¥ä†Œµˆ¤ªơÈ-á đIÄùÄ7µÿÚsT €º̉“Ü×{ß:vừ«KùÚ ®ÀŒ,û9 ÎÎ^úê–@„¯“I•c¯ü£¡Ö™= ¤r6i†ÏJH‚ƠâăÅrm´n³„98Ø̣¾Ys¨)s™Àœƒ6u-(‰’–Ÿ[¬_'½­‘æ‡m¸óŒcô]¡-T,„“y@s‚€đÿw[mr‡–Ù'¹iÛdk̉Ÿ>|üđö¶|ụ̀¢£c”¨¤«FF¥dBÙzäŒ`å<'…wBâơ»[ôđ…7V¸æŸ4ê₫68ÔÚß«PhÖ0;}í×~ĂË´t2‰’꣦ىü`íÅÅävÚwtX @i—ø̀ s“ëv·7×u]ï+†y/©QÿÇG̃Û>4kHhÖ< `äx€fY(P+LiÛù ̃ñû_s©g2×̀"Î KmR¡OéyZÖe0EN[ßÄHá“D(=à#Ṿq%ÂLyDÔ,Ä)¿¨èâM¶ ,đŸ€ÏĂÍ„)Edv/€¶Ë÷ơV¾ËéÛßüÓ?üăơr»½̃ÖÛª–ÀSjïA‡/̉¦g΀wù â_‚Ø3 c1¸Ü.ºêåv)5û7̉ùto¶” ôgñO|Çn=…îÇʤªơ)ÑÆËt[·›Ư¶û¦Ñaâ!̣M¾Züñ,øán_OO§vr3‰‚?\—I£™êIxϸ¯™ƒ5O³¾½~ưºY¿¯«/́!³4³ưƯ-Å©=´­¿nẃvÀˆá=tÓ ‘ é…“ÛÊOîÈđ©èi9µÖúÖ½›IYê„/óyză`Qé5Œi]Caw:ËBt>đ@ˆ"¤28AFâAU1́7ødIó±•c8ÿåÔOÙut`¤pœÄøx%<̃éƒÅFc¸Ï÷¸ÿë•äŒïsÊ49e9Å?̉‚ĂáRqă UưÓ½XMK=Y±BØƠDRaA[FDÜëÆrJ–(s>ϸШä?ªăÅzK” _Ë5jùvÉưÅ{7)ÀÑANå̀ñUE{©̀Æ! [; ¶jëè4<ùíœĐ_óƒq>zauö „9¹ÈC¡ª“ôçÆÙIyܦílˆ²Ç;-‡áNœOçÇÇÇóé|¿ß½ j¾N¸Î±øM|‘ó6/Ê6¿dR`‹̉ !ô( {"×ëU›®ëªªÍª‹ÉjƠvQYµÂ`<Ăja ¡›MNhNÁkHäv; óîo蛤!7*Æà°ÎsSăB1-4>ØỶK̀'׿Ơ#€Œ6 Ÿü¶­µçççûz÷ÎYyXOb$²-¼ ±¶s_ïŒ ùÙô?FR̀éÿîµ4½Oy#-8Úx€ªJä 8×¥l¼1Q†k_,¡&Ññ6¾¶jHÿ‡Ưđ‹à‚-ª€á˜HÖ£N ³¢ÆÂÑEDJ¹Oäàváÿ́’ï[“ÓâE%5ư= ?ëjOß¡ùq@(̀7¡ÿÊg+U…?µ“6µnĐäLư¥-§Óù´œ¶Å€ºo0•ô)ªó“u­ ă)ç hë›—û|»¼ué÷í>D;(í_‹üÀ€Â'e?¶mÛ¶—₫#áTŸP¹ñ&Q8—WzX1IDúÖ¯—ë]ïl¨ø’!€̣ưû_N£ă¯£ÿª₫o­d<ă/>-'5µn%ë·Ñ8Gj²ïÆ©y`ï}€8*|.¶u{ùúµ[¿¯÷̃û–É'},|ø¹fæg KJª{@Fm¹‚₫iÿcÛóu1Öæç'W fq†JD!³éœ)½rök…zUN´ßŒÎÅ­ ©P‡àøëw1kÇ5¯¦†YĐ8eYDÁ‹äîÑĐ”OÑw/ú`xR̃»Q&uovzĂé™ưt(đæ&%hÀGxYK¾Ó­ÂyRêưă¡ Â\%vÙ ú9~-wô7æú¡̃ó£ü}^ù¤—ØksaóC÷™ơÊyRà`¤„«bŸ6ͳ\‚B/0 ¦?c\ÊÓ\Äeäq›f³c‰gPơøÈ—hè6Rd$`"&ªƠP˜˜Å½åU*RœQͰ;‰̉à2ỪÁ˜ñxQ)„2äỦ₫Æ$Z¹¾Ăå·OÆÀ~¹^oë¶Úhe *æTÏ¢Ú¥˜û¦M¤uYÓñDG{ÎmÔ£Ă](@,ºŒN±A3yĂl,€içæ%‘|ͼ…˜`®Cz˜9#¿N¦çtÈÑÈW†oµ,ËăăărZ¬›wÎöcHÜÑ‘̃S8¢Î±ÜpĐ2̀…₫̉Å‹o2̉¾}؇Oºwƒö Sm¤x 1g6E„bª8ù¸Ç”{‰'0窠ÛªÏsɯÅ=¡’D0—Mb^ŕgO3q1ơñ£˜7.NgC²Ï—PÆ Ü,\4œ- ‘:ÿæÓ7?|́½}ùj«Îß;ºÚÖíë—×Ûơ¶̃ÖQÿ§E9Y“B 8»&_-Ễ³0oơäñ¿ÉæÚưuôÙ&¸?o©ûdÿ–2¡©W€ÑL-Ê&́₫|̀Å₫%èKñh{·ÛơÆ¥~Hv¿íanơEÍæÿȦhË¢‹ˆX3nÇÆé¿yƠYǽÈ.ØÇÑĺm½ßÖ{ïÛÖ×Ml5XcÅ“kêl²˜¥á§<ºÈƾ'§îÀ=°Ăáó8Ó‘„0^Ạ̀­é¥{ôŸ`Ñ ! *%û”LÜÊ;`ÇæOß5=…>Ľ:_äYÇÁ¶£ÿ%B S@@QHư‘Ǥ0O¬¡ÚébóNwxưܲÛ Z ñ^Ó&Ư™ñ*£Gѹ>-ª2ªø!3=O¦¶­Ûº­hh•Æ–Öw(§/j¾>ÿheÁ% ÓxÍÏᒖʹâÅ 3xlÛP/äóG ¯X¸r Èá@Mª·Ü#$ưOg@;Z¤óFtÄ´¦M[à {Yñ 2ùê(*êÂHöă¼À'î-¯79?œEÄ‹¥đ´íFï}]Wëv»ƯĐp—„[(^†† Tî‘i ‘‹%“ÚÊY»É‹ï""÷u½ß»“Û]¤EpSíÑø»5m²HÔM™æ+᜙́2ăỳ!V‘@„ D˜ÈƒÉwèxŸ]–Ù¢“Å̃…GÊĐUk<~‰ô¡Q›•èđ‰H’0}MÛùt¾µÛ~knIZOaOªè‹¹[ ‰”.C†L ĂÀ»¿gÊolpËiSqTù‹V×åĐÏÔ4¶Øz|ĐPë†ñẢq åd÷ €bđ™O.+mAẓäÀ±€uJ–ĐQ̀ͬÜÉÀH| ÙO˯&Å?–;ê'Ôơ(·,ơi9ưë¿üë¿üË¿¾}}û/ÿûÿ₫úơƠº9è?µÓùt~8?¬÷µI»¼^₫̣翬·Ơ ̉îŸÄèÈ%G­O¤÷]Ú‚• à`Ö-´₫Q́?K₫[ỐïÛj+—ïäªÿßÛæ3…?¼Û}³ñƯ„đGI/GTêb*¥4àWYî3Ü- ¼Uu ïÜ¿ÿ# §Œ¥PŸát…W 6̀.¼¯’ÈѪúßoq☾ÿÊ^ff¶Y_­o½›Ù&¶yNx á¯̉dc…“?àϳ½K„M¸v¦C`sư8, ,8Ö£gàRĐüàÚp6àL$2)…ù„(Ùè~u67åhŒ“Ơ¢À¦70ú4tT© Œơ9năOAđ0î §{ C0:±eL ñÓ©ªÓëáéà ÚóiOp×XZ2Kü¨¤*Áƒ!PA@,³o¿ưöüp~yyùơ·_‹»BŸ éÿHÊÔ|À3ßc?›iˆÈ±º¯í”.§Äz¬RDI Tøpù°&qôÎ4üïW:‚( F(?]ḲH“Ü¿£`9 „̣ù˜M0‚àà'–=a%̀ÄqŒëÀJh„xÉ’œ"–1F»\JP¢n^\üùt₫Ă₫ "¿}ùm{ÛØøđ6ôÇ÷ûƯ•ư°H₫&ºÀÍt”́d»_-蟋)A„¦SÅO<#Ñ»g`cÁ}‡‰% O€ózëùWèÆî®A”?XÉn~71¼á?́Y^<¹m¬jAöœ€X'=NkH “Oe>öÆÁ9vi­ˆÅd¦'CRX Æa»l] 3àă5‡e’àÔÈ̀ø9y¦J…₫t€M¶’Ä<{À9aEºŸ+ a$ÁïÎnj¾ñsLǰÉÓÑñ6È!0—9é8‰£ÿÑĂùa9-—ëår½ F_›©}üøñùùÙ̀^^^²[nlNÀù¡51`²~Ó’a„ƠóJër%ß5W‚ÀQ{PûÄ•ÖbÖj Î=₫d|†™¥âH§vzxz8=.×ËËÛK¿L–5[#ïƯgŚˆCÏe³+*r¸_x PJƠ´Ö–e±ÍÖme›€OÁ.ç³×ª…­J¾‰gÓ?~÷G]ôv»].ØÆ„; P¦x¤Á‰=WÛ”Læá¾iôÙ™1&º3†Z²±ˆ‘t,Êœ)WáÛj”!#¦.ßOµáUÆ;£7xˆX"[tdµJj̀à´$d$cÈr8 »y0DéîîU=1“MPÛ(/–«Ñ;g½]Tu]W†(¹Ô±È§¨¯̀¯ä«RÄ¢¹m\¸acû{ç`̣ÿF-ƒÆÂp[a£]´6.ŸŒ:<\Ă¥Dƒ‚‰ºö­ÍSØ¿E¥ô{%OL¾_¡`f₫³¨d]Zê ™á7)Æ36ơOK{.jb§Qơ¿Â (‚ø ưîß}üđñííí§Ÿ~ÚluQ*sÏ5₫BM„L_üí¤ÜM₫,n vs‘ű °¸ăÑ~ß̃¾¾]̃̃¬™»“Ùß|úæï~ø»Çóă¯¿üz»Ü¤Ëvß…́D–Óétj§‡ÓĂÓĂÓùt¾_îbÙXV¥H-»ù $:êuÄ?Ơú̀ªÛ¶¯÷Đ? }nÛÖ·Mveè§qă0+¬=ô¯¡ >’§ñ÷ ~óx~øå§_ÖÛ ¾•₫‡ø§EaM~=rf†«Ó{—€ÔjưÜ̃‹̉Rñ¿¶1÷Ÿ‘„mû³Å¬aákô™A¿©ŸÊ~” ̉Y¿p 0çv>-§SêpÿÏÏŸ>~:/çơ¶¾®¯₫+TP?¶67ư¥¾lđôư÷r”=Î3Ú^:ºĂµ ¯Ïô†KPü)ïÆà’^0CÓYÎÖêđWBLütGXc̀z‡̃ç=,+ơ¤á79N"Q úÈ͙έùׇÔ>ưêđb^Vc&{j¶…Ÿ9¸Îÿ»ÇÍGœúé61S{Y¶!çoüßư #¼Ç"ï}=<<Ø1çYFv“D{M ­—F¼Î C‰₫qHç$ܘ<ĐŶmûơ×_Eär½°ßü*Ơîß=}‰ÊCá-« ₫î>úưIÇå{Ęà̃9…#Oúy³|.4A*lÅŸs©Ú½‚“P+qØé­8Îö†ù;d‹¼j_Î2₫v?5@̀úŒ—ïÉ̉S­?úªÛ ? —Œwå{æeüv'œƒ;pslCi²ÂHw7@vWÄœ™Á]Uµơ¶É6^Ü#đâđA»k°€ëëê;8‹­Öw@4́z;†æßơÑZ¼/rwÄ»“ÄYb¢y¤o—–6·–‡í+ô«̉A½ó¾&´€› b^cȰ-íĂÇ*̣úúº̃W¼-÷1M0liqpI%΀ï|2Ù8¶SD'G/àç- d÷ )b:ÀY°y™¢¢y…Ü€¦¦~î¾SÆô“†ç3Ú»sÅ÷Ỏ'í ‹ÆÄ¡'‰ÈkJr̀ƒà7/:3Ô&föơëWçhqû%¸?QP&ÉaZ-׳‘ú†¨Œ ÔP̀UÍ[à¡‹Ë@ ̃ >"àĐÀ€ơ7Ê# Ê#ó8I†¨Ö¼mV–cw;½}½\×u½¼]F§èXư‘¸ÿ‘ĐtzOïè(0ó¸¼Bb›ÀÇXY#aÔ†Êü¾̃7ƯƠ`X¸ÖÓ$–#Û*!oÏÇ₫Êu]ỵ̈׿̀ ¾§‚T73͑и ¾£\r4}¸Èy7Ñ8Í› ưpLÓ“AüÜÆ¯àÔa»áăØ,`‡O@æílRR™ñѪ†y4Jüơ‰F<ÙÏF.ɨ;!HI¸vu…fÊ£:i₫ q‡S£ø°‡à¤Yº‚:©Ú¢nA:ç²Ûw<›µ­ŒO₫M “/>;œ) èŒe6̃¤E=ñ àÇ–é1é*"̉ZÛlóˆÓîyáQ1]tdº·#6j¢ó«_dÔôÆÿÖƠznỊ́{UÊL} ôJàVö!M}dTí”Ó”®„qơ.₫ùËŸÿr¹^üü`=³­û#¾T­Ơú`¶ư×Ç ư:[¬¢ø¥ jÅ/2Håûơ₫ùçÏ_—¯jÄÓá,§O₫áOÿĐ·̃·‘Ñáo«:Z@""¨ åW•°Ư(md élE÷o©í¹÷{ïư¾ƯYôŸô?¥üa„₫Gʯk„¢‹ïdÔ=Œ¤D^E‚om^–ÍŒ)2ĂÔæ̀]‚ÖÎÊ8púÖo—›Új£ÈRÍưÍÙÄ¥vèNư[c”ÔRVûL=́jo;NÈØ@<#BnAÍkǤs­k>WfG:ỈФ+$Î`¶P<à|~L0+ ™Etxk6‘uZ̃Ç̣ɧççÿñú×Ûư¿₫₫ëËưå @`Ô±k_v3øÆÜÊŒV•tMñIcđ5gpâÙ óˆad˜Óç59̉€°ILG:áWµ9³ :äiïARÍ›„óÆxN¦Aă_ooo÷ûưz½Jǵ«ô±=@c8>dåtưP>›9¤]w3‹œc>›1>îù‹Qáp̃)tñô`C| 2×BÔâv¢RGo·˜•›Z©Ălvë·ÛMî£;zhZ»ôï Gôq€:ê₫†gϧ¿}]W†4½è#£È ×,Wj d̀ tÆ:̀ñäơÀ)Ô´û|YäŸs³…°± à|ŒåmË6Ÿa%†¢NnÙG\©fŸ¬eâ§$Ü`Ü×ÊÏªà•·a®)ƒ†½“è¥ièÈZQ¤ÈíF.GÂAæ₫=°V€£ĂȪqEÈ~Â…9h;@)‹pVk|Æ9˜´äFJojJ€·âơ˜tK¬EÀl‹¬.D‹äDƒ0 c’Å0Ú  oà,óæ*¾06ÙTtÓ­E××µSûæ›o–e¹̃®¯¯¯—ë {̣rº ˆs Î÷ đ³¿fʾ@ƒ6‹h—ó̃Ÿ›lf ÀÄ<³anHö¸oưÇŸ~üüëç_~₫åv»M…}–¢€úÉ`Đ̀‹(ÎËÁ4“ȇ%ø)ËQEN—©0²\ték¿¾]W]G̣S[PñÓëb̉·¾̃Ö¾vyo¢Y°)ä(̉ ĂäTÓ‡zï—Ûåv¹ 7ÀR»ïj₫ ô»’åÿK¥ÖüL}ú6£Îú ]‚auYÎ~Ê5wW:OïïæE?‘ơ;¡ÿEéâ•—†æJKĐF}—Ë ²@YË ÷‡bF«Lr)NôxơÀ†Ưaj3-̃º¸é£¾”"ăWɲ¢€°W8£R’ơpË/@­7?¸[̃N₫yÔ5ƒƯ›ÏçOŸ>^^/#½©O‚$¹åÁN Ħ™AL₫ W."HÎσ=Êé:A¸ƯÊ_ ̀yêÈ+L#Öè\QƠƯ«™Å™*[æ'’¡/&˜.€¹đư»L bñè³"˜Ûôz¹^Ûơ~¿ƒéí%AŒŸ%|;ưœN,Zî.óË«†=<>œÛù¾̃ï×ûï ₫ú +"¥Jä?`͹NKôÀ·¡¹:Üàú øă¯’æ‹:‰J¬èẸ̀áü *÷ơ~»ß°-îoy¬+Œ€åÚ6ÖL¹Ấưʬœª™<o«º'Tñî¯p©V˜TyZEnƯ J9Àrp³Å ¡7ÜO%Ëå‡Â!<ói^ ̉̉_%I“ơ+ƒCC1/Î × K€ßËj+·́Èh@¨*ƒ̀É…+—t@'Ưæđ›ư.đ£7ц’MJưn±ê¶í–ÍîJ¬®³ÉOÆG¦È­ ®_?\#5ëAx…ëc^Zâ]œ₫άsÿM[kÏÏOOO—ÛźƯowúcdl^ácÆÙ7M^3û«¨dWæÑ“!₫ Ơ–g¼f²c·ÆĹÔGÙÙ’æ¸_âë¶₫ơÇ¿Øír[·Ơ éß©€dŒ+₫y[&¨Ä?T₫*Y›2€Œ@€ugîSL"j›Y3ÀMîơ+›¼üö²̃×mƯ¾ûÜ=p¾ùôÍùá¼Ư·ëÛ•Ë₫ô~<™Æ#2£ÔR;!°—ưđ?·Y¸ ¬ß±IHƒ>éC……n \™jR ơÏ÷ñA¨_‚¡œ̀¤@ÎÇÆÁyC`%mm7…lÎ)ؽå`:'œ™ÁR¨èăăăĂăĂz_¯—+ TïÛoŸ{}}½¯w&SAt†wJE"̃{̀W»ÿBr[='–‡̣áS¶̀ÎnÍ́V̉8†½]¼́Ok98\ßéo=Ă3[̃Ÿ7̣ù¯H#±ç ùk]×ͶöÑ ¶Ơ„øB¢Bóå‰{g¤FüơçG½èưzף͜|Đï~•µ _ù`ΖỰK¿àªÇ₫3{ SVN\É„lqZÔ;0D¨­|HÛ©éEƯOK¯^ÿÄêùÿ÷q1{g ’‹%àG^Ÿœ˜Á+ˆAé²r8&„„ \α̣-ú%Xøô‚KKYù£<«Ö%60\ª³e&w?Ôc©êOú~uƠ=°Û Djˆñ)4­Vsx"\£’1 ͬ̀Íœƒ¡†\D¹ø|ơªù·ÅÜËàüÉ‘™Z †y{î ¸G¿ÄŸii[ÄÎ}( ¼I8r™¬c¬Üæ—¾ =n§µÍ¶ÖÚÖ·Q)ȃ!½̉DDNËéáôĐZïAÖ;O%Ë«Mg`Wjl̀‘¥Đ_,½¸EÔzï£Ç™dn†¡ ́ï®I₫íÉs˜̣@åp ÈÑnḅơëW@«‚~£ZŸBps“x “¢H_j_Cp²‡‰ù¼dƯd”2µŒ̉₫\ïßă¿üô Xÿ­mªÊׇ³UܨêQ!Oü-U>]Ûc!ñ7jÜk=Á}Mö©Ñ ˜=̃0 Ù’ø¯vƯ›à~'ïÉÇ”r}>Ÿÿơ_ÿơ»?|÷Ûçß₫ûÿñßƠt€₫åTêưËè¥à£]êưSS…Rü‡Å?µâ?ä é^)¢ñÏ?²ëë' £ˆqQà' ₫jXö^+̉P¿ĂH•ØqómÂ(cù1:Ă!5Üïï„—K7Œé?üđÇï¿ÿüË/₫?{ )ÆO_¾|ù_ÿ_ÿëưv7*´ÇGiB;f"ƒm…]K@Ă&q©‰t-3´öÀßÁÀCSM­Ḥ¾T‘±Ñ|̉áÅÚă_0aBÿDß#˜›̉^5·§P˜7/›æü±†‰å¬T%#ø– •” qü²̃¢µe¹;Ü/Ávæ#™O£Ô7óÖÚrQD(^ÏÓWÊâ¬áå4ÆW^É ‘ŒªûcFE¿‡ơcW&΀? 3yP϶ßÑLÍ2ăÄñV'–*göÇ`ïLŒ{mà’>†¿C7haˆÊ;ÄrÂD”0‚•¶·=đâđĩ‘â<́ü2̀ƒ¶ya€€àhÁ;̀SÉÜÑëa{e°ÔPççîF•­)₫Vexỉ²çi°Î¸Y#Ư ó\¾51¶Sï§7H3ôë¬ơ§ ₫ ¿ækà1­¶ˆ¶đ̉³îÜNpÜX_ʃÀúº©€Ờs̀ 2¥Gu‚¸)Üç#UA¿ˆxî ,vn߀m¨n\„“ÎŒ©w̃ÚhŸợååv»™Øư~É6êq¡4¤•_ÀÈ—-IÙáØ>đñ<ˆïh V-C?ÆmBHŒå­"æ@Ư‡Y?+Î_Ḅ3$gÔÓ7ê‡ÎUº)MPXµ¢d.[H̉wRÿƠ¤ÎŸ‰ÿ² Đç`eY–å$ƒv¯À+ĐƒïŸ ₫¤e—¬X¬¸#Ÿ`Oö•._^¾¬ÛúzyE‘~Vû$ñ_³~¹Ñ/|¦üKÀ6̀h:€₫:ÿÈê‘‘ÉP@¿{-ÀC h€ÿôí7ß~|₫øöåm„P¢̉¿£ÿt ³¢zÿ́ŒùHÏi¥ÿE³ăo]- oRçCxæÀỮ‘ûOºÿù1;Œ/1é5Ç`onpNV5–½Û8¤p CË=Vù\—„)96ÁÅÄ́kKûăÿøƯwß½½¾Îß}₫n÷û=O}JÄÇqiaáó"¾Ol‚?.T ÀbM0Ê—mcÜêùÍ€›<Ü©O“NVà–qX–«̀)‘ÙBÀ{m\G£ghà1Æ$Á f³Â}öxú ÛàzÛIÅÅTáñÛ„₫µq=Ü$…¥T;TJ0GÉy‘^D\Ø—/_¼KcZ0Œ$ăŒ³½0‚?–Ỵl“óqxq°éúJ½́:°c©{í|K†…m_|< éÓGi¹dZG!ˆ×Çß²yä)óy…ơQl3môø*Đ.½ơ¶é6z w5±¾ö›Ưºơu[!£pH\ø,—#’:’Ñ Ÿj.¿69sO.rƉƯ±&‘(R |Qœ€Ö‡å[9-\nư‹4_!µÏÀOR¸đ$JCx–tÚ‹qr0!­\íGµíú” ưZô?‹dáÎd[›2€ - {ËóÁ¿“đA²ÙÖ¥Ûf¿}ưmƯÖÛư¶mÛ*¥¤Oñl½o÷¡ZW/Í6Ä?¤̣gÜïn»ÚIîØB<} ñ‰ÈIMÿPØS2Àdd£Q€?¶v»Ü^ûëơíºÈr¬ü‘¥ˆ¬Ü%ˆ–jƒơG}U†₫1₫À#ă¢ó 9”T˜X´¡ ₫ƒ̣ïQtJÀI‰i…¿5ÂJ¦̀ïÄé…z±ú[=800³‡è“©tœ‘"ƠdÇ3«”²¼Ù¡a`́•¼0Èx%¶£făñôcå~œ´Â:[?N4íÁɈíÖÅ»Ă+Z‚$Ó·aÊăƯí -vŸ0­ˆ¿ó5ÁÍ|’iHº˜<Iă_ñôæ&m‰; Ь k™¦):¿¿caU·u«Ă!:x>¢@Üë÷½åUÁÚ´,Œ“;ßÖè±ÁÁ(Y4h”OÍ <ú[s7uÛ6·ÿJɳ¿A"!îƒOÙ=8Á!ë7ñ ßÀFùXi ‘>ª@Æ÷¿´Ö=œBß‹¼§Xxç‹ç×ơC3];=Mïy°~êÏóxr̃;4¤ùz̃’; Ï9Ÿ&-åT± „—+„ø±7]#îOvéû¥‹HŸÁæ²Ú<¼eö ^¦>Á¬;,£)7 âđ”à¬Ö]̀¶no÷öë ïÂ(ÁàĐĂ¡ykUs0¹i÷h§Ø´÷î k<èâß¹'€7{P°.²ˆ̀ ÛS6-N™›$—ªÀÛgm4#k¥i€#4äd×ö}ÀMËP,m9AƠ€«áÁ$´¶øÎ‰ÔúÇăB”‚ˆ/P‰U|wđêđQ5ÚñFbn–ë!@É|3”'C€.£̉<„{€¸sψ1÷Œ-4æĐ‘;v¿½ƯË;Óÿ[©öă¢ Vû¸èPô¿ơ ̣*>×}#9^Ç΄r ß•Jy£|æû%R[é  ¦Ÿ₫üµ}½¾]gôß–9ÍWưkưKưs©%Íüï•vÖ¹óŸQ³9 Eï9ø¥ø+–¨å»-^O ·‰'‡OîïbX¼K±đ`ǧw*óL±rR΀LKm¶®ëåz¹^¯^€ú̃R$§UYpس Û¹ÿ™¯rNäg"Zh†dwl|ôTƒH̉t¾ë¶ÑÅ̉Ư»÷äÂa3¦†¬ó´g1½ûyßleđ'TQ{µ\̃.2ô9éy2B²óø K &Ïx ́^¬%DÏóy,$j¬@aÚ,[b.¤#Àµœ;óßZ L]M;3îi‘Đüàe@!q÷[„ønrií®mïl7w=&nj•“[”ôwŸÈă?¯Éú_ƒră°[˜,©Æ¿|âÎgó¡†<†Ÿ”@2YÄ3‚]RmÈ>Ă,₫‚«0f?˜û#SĐàhîØ#4«Ó‚çÁ¸dư·U-„Ăà?̣c‘êíOÇG}€<¼Íɹß+Ñ4©đaG&ë¼Sæ̃YTsÈKgûƒ÷ÄÎÂí˜ <4«°cwïàÙ†Ë7́h ï £«F&À…©´ÖĐMl¸6ÔDè00I¯5\ƒå=ÚùÑĂ@SC, Œ‚ưLùç‡óÉc²ea R?e±Îr§₫V˜·«Ô¬-(öƒBŸ>A ga~ÇưAü’ơdđl²€IDATØ ­¨Ï§<6pp¶đ+„3AZç¥æ¸ŸèKñO)TuÿY ÈVÿ7êưÓ±êØZ{8?´Öî÷»³¹á°¨ÖN^Œơá¨Í«ƒuÿơqûåÇ_FÖïRe?NökI°fÇlRù»'g—Ó˦!©wZ¨ùE}¬ Ơ~ ï‰&_ÜØ_d,ă·\Ø¢b›¡ÉÚX́±Wy'˜˜>Íc{:™a‘Ï̃,F}ñüÁ/G‚Q‘éüàqmëº₫ôÓO¿ưöÛo_~+eï*~²ĐX(÷̣•b.”ä•ûP€< ExÀΜn~Oæøq'éh>ƒ+ÜAÍzІè®^–%Jơ€í˜Üú¶p_Ë@µ´råJªÊb~+,{µ<P)"âÅ ̀_;°ơ-ÿ¤Fä¥*4ǿåuË·`–kF#q‚×ÉMQ”e3ßM³Æ<[å¼pD_R˜3·êåºưư1ïy‘À:§ —4©Ø÷uHüÅhthÀư·Ö\E=* Z6>V— @Æ~°qOÛL!ó3Å"íë´-Ú´€Â÷}¤ ‡ƒ³´|7́PÀqÁj¥ăqèyNé’DÉyOÖt$¤Ø^t¶T%ñíLŒ,†7¶₫xÛƠ-ñ†Å1@Ŭ§³ÇµÆqQp\ɰ¾Ụ̈(́:º:€®# ñ›†Ä´·èfAE7<›>ÜQ­Đ0™̀‘+ÑËÖ¦’”‰¿±º*a4=Ăó‹œ=KË/t&æ¥Ï̀Ê(›Â§|ƒ]D2öâ#ÜKxÁ÷r·¾µÍc´Ùæ~¨•0håsaB90®3ó7œ ëXl;¬v8¸_QQyz~:•á«.~̉Ÿ¤JÜÏ5p¨°T~P¦X7ÙháxJê‘`ëYÿĂƯ¦ ̣çgñÖ Tª4:Ü&`Đé_p¿t3sn>á;ûÜçg†́‡²~‡'°CÿœE0„_D%J”%=ŸÎOOOf¶­ÂëI磔§fNü-‘Úï ¬?₫VÑ¿‡V’₫—ˆ®  Ơ¸Md¼-ºx Ÿ¡üï\0 œP_µøFM¾€æÚ~±·&µoƯ₫‹V/Ăưü-­½qÇ£Ü̉8,Ŧ|’Ç´Q5’xprxMAÏC/ßj§™ưøÓ̉ÅÛ³ç5Ça;ËÔ,”ÿÉÁÁÀŒÀŸèlî§Ă`—Ĉ¿üˆÿØ đ0-:ƯX•óù|:¶m·¯GäSàƯQHI^¿ 'LÈ&W2Åp¥$ØÁåXQ†ØøàŸ̉/ḅ,VTA󪣅j“¶ÙæđÄ (Çù«e¸‘G˜/ÖíƠÈÇë₫#r_đ‡ÖŸH¢¦í›o¾y~~¾ßî__¾å<Â`N1>ÉCƠ*Úp tn]%]G 9×GĂtw/480bQ†¥ÿTT%¹´v,ăÙŸ,{ÈXºË²˜ŒZ̃¼7Ë ál¢Ij¦)PŒ/ƈ°4ă·eÇMy$¹ ™\ÛS¢$mm¶NpL ZùÄß|maµø=ÙĂÁíh”ÉgÙzÖn]B¤>ăEÿ-×\ÚsÿiaØxÖf„Ô‰ Á(%Đ‚“èœI¢â½2DsüÎöƯääđ8ä6é…&( E"ÂưÂà<ÑL庭~ỒMĐéÀ¯)]62›,OF¾<oÚ=M ä|îˆ'F«ú¯Tu0,]!Øî!‹½Ă²Ä9¼#²«|>ú ((à7²ÉơÇđF)d¡ÚÍ~â°3æïs’)€›MHî/ï9!·€Ç6á₫THQĂ2å¨QûINÚ”Á}£ó“4Åzö,Aa¾|‚ª¢ƒEÚ’QV2Đÿưôñïơ?đ ¦>_̃7À¿;^† Ñ?…üN‡„”Â)́ÏpE#đú\ˆWJiÊí~[VûÁ¿¹°RÍHµqÿYc´åŒ¤Å¾âaÉ00(÷Ÿô÷¤ÿS÷OÏŒî\;F–SN ûlQ̉³Ù7+ÆÑwfß"ø.í(öN½¶+«₫lpBA₫̣z [ ̣ØJ̉âGà>ŸßZ²‹YçY5Ù¸j©§Qz40¥å$å^7mü₫"̣ơë×Ûå–gJkí»?₫ñÓ§O/_¾üôăOy¾NăÏø~ô¿3/Ø’¿÷V»“’!ÅÁ,Ó›Ø{kEvL¾Îăt j è´Ơ„iÀ9æÑî/₫`+È8́`Đ~üøñûï¿yyy}y- £¾á¯ a#¾}vÅQ#™6f„đn-÷5Ï5ÓÙJS¾É±4ă±̀³À‹Ÿ­ª~ÿư÷MÛË×—Ëå2rw€û¯r Äß 3Z}]ÆÊX-k̉rđ—ei­mÛ¶nk₫ư$q¡aô6­,›Â^W¡:æ”Ùúi⌔ñdx÷ó‘´3₫ù<6æ.&9-Hv¿ ΦÛ1ÉCj~j+́$L₫ç2ñ"â$®É±Ùk®bÊ`N ư¢˜ÁYDUrµåßRđD~÷«j;0Åû=Â=Yu\k"₫xª*¸L]úbKo¥ÿc„›ù“‰̣„h³3*R¸v¨‡É yOq³m¾H́ŒyÉ ‘P1!f´ưf&ÄÏC>T›\.—;"wÜAöKæ‹#Ë¥Y3/)˜·då€Ú@™¨ºs jÇ̉viŒ5Qu~¸Qhß;L£È½hfó]àà’e ÊM6îöÅÔ>°¾Ëư³ ç¶®ÛºIAÿ₫&Să0ÿ—m8wú»u]]‚¦‘ !îư‚”ßVk€’çÍ’.ưĂpÊ?ơưRJ|ú“§vÊ*LA®Í&>QjtèB¥‡Ix›|hứG0jđ+,Z®W‹÷«Q,Ké?{ÅaåBÁ̉Ơ¾gÈ><xz~Z×ơóçÏû—cÁz O¦6?ư}o¡ôx/g)̉ÂđY{„̃à —MÜ9³ÿ\5ôÓ™1_@ÜÔ>P›±ó¸áZkí»ï¾ë[¿^¯W¹N˜́ûï¿ÿ»¿ÿ»ỵ̈—Ÿúy¢9¿ˆĂA©¹™MŸûƯ÷Ÿ₫¨ĐĂ+™Đä>ˆqˆ̉’œơÑ#M¾ ºÖl‘El}51ØO¤œó6u,¦¦µGÈ~¥gøoăù‡‡‡>x-Ú2ûÏe0-¤ư>:x »¬H‡ƠĐÀ `NƯ-g^î6r"[o}ÄîZôs _Æî?à@¨¨Ư%Üï®:£Ë²|ÿĂ}Ûn·Ûår⟡$«öc †©ûí3?µkåèD Ü=<<œÏçÛí¶¾­e¦¦4Đü#ç¤Å§+çhXyg89b¼_đ₫…è©5}M¶(-mˆ¾p@ÜBµo^n"ÉXïr¸¥zÚSHvø±ưG­ưg¥FK`ºHW •µ=ùÉơJ̃;×ÊÖÀïpǿy¶0…l̉9dtècïq)ÄÊá›L÷‚ËÀ‚áâZù^½|†*oT̉îù̃°+Ûÿ‰æ†‚†'Dc»qrBdÄâ;ÎqÂf™̃@¢::Ç¡³ØpQDEäv»ÚKjD#Ơü1º23±óùüôüÔZ{yy¹ƯoB‡™ ÿƠ˜ñ̀M¾²{0ú>@™üdªM4 ₫L¢óÈúÍn‹pµăc!¦ß̀­d­CÊÿ^ÅÏQësG1úĂlñ‹̀Ë’ pă0¤…OƯÖíơ₫ºÏaàÇ*:Êkbx…jñ3Ô" Ñÿ’ô:•ăǃ“-U•R¦U§r\@-¸Tüơd¼àrǺJ|ÿuü{™»I÷¿̣·đđ˜dq†́ŸẓшWÉ?₫ă?₫Ó?ÿóׯ/ÿËÿó₫$5‰§eɧÂÁQQi$ÿô¤l5¥“›ïh¹Çb£kƯtLß…"ơ ›$ CKĂ8Ab§µ›]×ơ~»oë–ø;>öă‡úá‡ơvkK[׳3ˆ¨v°÷g¡ïÀñ¶ä¤±‹LđG×dú3đ₫YÚ„,ŘO4Ê®ÅBÍpp|÷)˜ÄMÛùtnK{{{Ûdcbơ€` ̃Q¸A!40;—CÁ•ˆ˜ơ»7ªƒN¹¼ ²Ÿ *Œh¤”Àó¹25}Ô²È÷ô½Á¼…©ö¿dn€K2T’ơw”³ Ngà'Nâéî†_ÑÆ.Dà­èË r€W₫-«,̣öIé¤ÔœN*cËDiÅçççççç¯_¿¾¾½̣è%v/Zù°U}₫‚5ß™ï7̃w®¨“#,Ă¡¿Ưá&=1îXÖ›äé>Jî‹̣̀®Ÿ₫<î5ƒ¸<ן”e<îp”₫;E 40î(Ă+M oXÖ9 Zú?»˜ Đ3O †7å»̀rù+z€Îe`³ïxôcº‹5{êଔtT̀ê½x~pƯbÖl¯—³øûت¨k¦¢Æ°Óe$PÄûä.ĂÂá½™ #çg@®} £ Ơ_¸7;ăÊ­Ÿ° ërđP®VçÓóÓ§o>Y·¯¯_ŸŸ>}úôøøøùóç·Ë›H–úñƒ̣wôߢѯäR̀JÿS€ !5?¨ø”ó¨üåI+ ¢¥Q]ÿyלî¼ÙæÜï¶¼̃~·¾¡̉?Üí+~Böăù¾î$Dë!åeÁL¹$;æâưúŸñÛ¸wüèáU b>uÿZtÿưk­ÿ#T‹)’°ÙmKôßÔ=Q ƒŪó–²m`µÇẾƯ$=‰̣;EåÏ-½â€₫hà—orÆo{ß&»Ăß±Œ„<ÉÖÚóóó‡n·ÛH0ƯÉ6–Óâ.ÊpóbÆ Vƒ ă²}ÑS&ퟗӹ8±ƒ î™ÖMjª¢yf¹ø<˜`·ăbbĐpø›s±Âô@säM@mö Üêưøă}ë·ûÍm:Ÿ—ËåÇüë_\·BLNĂËJeLGyó[€>Z̉ß©̃1÷´øôÀµM7Ë¿rÚ·CÇq̉ă赸`«¥È««º.}–î–“}¹²21Daˆül› F8ññ„đ+3ụ̂å¥oọ̣̈2#ƒ D¹¨9;3iyèʤXÛKƒ$= Üláew̉,!)Z²3đvŒ~l”`áxñÄđÜg³Kê4½÷đ'₫Öuưë_ÿÚ{¿^¯I3I_÷Ô€#%e“`xßas¯ñtO?§ŸvZN®r!¢ ¥¯h-G»g:¤8£Än¶„´®3×yT7a”€Ư4ál~Áäè7  äĐ]P-ö@+£7-x Úœ m?¦r³ 0„k-4ß‚àƯ².-u˜èí™ÍAÖĐ¾ R„‹ŸŸŸŸ·¾½¼¼Ü×»¯̃lR«¡\jŒŒsÊ^†‹âS覆&L,Q1j±’ 5‡‘‹²µ'g-¬*§aÜĐ%*´øªê/WQíă?ëÚM̃p“ŒÚ|bÎDE)}¥¥™ÍG$’jPáĂßÁ½‚µ¯Cy÷{‚7<½ÑaeO `˜$5¹Ưn///b²­Û·ß~û§?ưéééẹ́v¹]o†AQˆ_KpÎ<1ơç‚ÄŸe$ ü‘uê@£2ÿ\x^¡8ª ô™Đ”‘HwÖß<œ³;«ÿ·£̣ÿ̃÷·w(¸â'Ü ¨ÿ'ûë+Ü”}ƒ‘A+™Ë‹ă§Èư…Ôÿ- ₫`v4}H‹ôŸ*~bäg ̀Ñ€,´zÔ¼™IÁY'đ₫û¢° p\GaVÎÈÆ`ă?!¹È´Ôq$à# r¬ác<Æ+5ơIÔ8 YÓ·×·_~ùùåËËÄÚZTjÚúnü¡°b¾¼)¡ü|·É>Ôî_̀×™ŸˆĂÛ«3¢y#Êzrƒ®–ˆ†çÀó ])™N…¸̉̃ûÛÛóvøê½ÿøă///ŸưœÜÏî«Đó8&d~09 m’I¬’ƒßê€eơ‰™ªœ0ưºñ…%ƯǺZ¥đs10j11³¾‡'ÂÊ]%±ût_eä+é?Túúúz»ƯÖÛÊ0hvé\œ&Zpÿ»ÀB $ÇåóvÄt»ÂoµFÀĐ |Íh é¤ Gâ^2tSk₫đŒàI^ fọ̣̈""Û¶áöƠth­́Íáu;Y(Q¢4üpt/BMt™tV'̣ƯÜî·ÖÚº­‰ØöÅ1'ˆ†KåPä; üåoQv©X<*oZ¶ OÛê­dr|¿Óö C¾úđđ¤Rá8₫ ¼L&´.xô_1â÷NtN«ëjzwäLd[×éơ₫à|:???¯ëúúú ô_‰?÷ƒD@Äi-^÷cgB"I3s­Ïå«ÜµÀưÛüL"~;èó•úÔü£†Óq¢!»ˆ²ưô·ŒY²âŸ3ƒ•«…Jótê“ÎËù¤§ÓrZjÿ"ûÙ% pi³À•d₫Ü$Wôضb½%ßÇN˜”?¥àPÏ/É€̃; ₫x4î&5×…ñ¿q]†FP&9m5³Ÿ₫ùơíơv»¡ ùtl £@¶i²̣ăư+¿Æ®'—À4G¨Ù™/üˇö¨}§[È×jµÓï˜ă!´¶ÛŒ4D@r̉]«ª#!ÛĂö₫óÏ?«êLÿÓ P°AÅà/È~h{̣¥ÎHÈ£Dóđ9ï|M‘çœÆ•¨*Ñ)·à–F Đug è}é®ë:Ÿ‘¿‹„̣ÚÚ{¯(ƒ†Í¸p»Ưî·»H Ï.Âö¸ëS `¿n¥.ƯrB˼1§ƒ6̃·²55@}ôq́ªđ:i!pƠ¶ ¢W^üë¨ Áù¶áÿÚ„ûṆÁ÷[B ñuy»¬ëz»ßö^kÙ,6³ÎR7QÎ=ØÉưÓ| .Ñ=Ç!|Yu©¹ưªđ¬‡_G®*"¨÷üv]—XæV®ó«úŸå.ßñOs~8ŸN§̃ûeÛö₫̃¸¶n(D^Ö –P[Ü™©­Ẽ³*¿3JåùØƯûE’4í͉®ËCg ]̣ă¡̉æ±VỐ "ĂP ¨ùÿº„¢Ød,щÁ{'ă¹L“ùå^Ø3.ÑC ŸiENCåÜÓPÂ;a„đ1¬óT¥§er¿Ư¯—ë¶m߀îËz¶èé;AvGJ9»Hÿe9Đ\m&ªĐÀ…@¿0%‘ À´;f¶m›Ae©ü¬¿mîpùÎ÷ ₫x“/ä₫*öϺHÿưW“5ap̀Àô]"Ñ"“¨¶Ï@‚éÉ“Î5²̀j´că ¿&é£vc:dW{4Ôid¯'p@½sN¶íê~ú?xAô8.Ú3’Y\ˆ’a°)x—N$À^½÷_>ÿ̉~k"+N^$½y¹ è1¦Í_¸Ë‹ÁŸđA¨‘ÛóĐ&úo©L[Ö™;R€ÈOª, ßo©%S Ç`Œ"V.O ±[L.Ù49PGf”y ×ư3ÿ:›{0U- gÅúåe<ª[·Œ‰ÆFÀ‡Ÿ<ÀÄơb„NSV\X†e„n‡<)C*ªM#ÅѨô!¯¾j EåjØ$,EFíÔz¦2`-çỸ 8H‚KÅ„=zàø cĐÚâơ&³¸B¹́©ˆr£Ÿ˜™¨‹ă÷јM yOL¥¿³6ƠÉ!₫‘áªFîoxÏóǿWEZ` çÍ ›í>ѦăÄdÄpIc…X=ư1*ñY—ËÅ.Ø«‰ÎÇïX5mKxék%ÁÅ‚«ÓË ;ß6>aÜT¢ö >°´$ó€¸~‰×p,Å´{;.™}ª9úAé ¹s5/ƠÓUeTÈ;-Â6 â_s§E! º‹́aÙÑí¹UiRŸî÷ûơrÍm¢{n·Û—/_ü€e{·ˆßç‹5Øhă›RxVĐô¸X•½Úÿ¡Ù±#ó4Ç„R±Ë2$ͤI³Ö[{¹† ¾MFï¬áYˆñæ­y›RѤ¸B¿_'ü`Û·8Ÿ5hå>zøÅûj9a2öí~%J|Z("#BƒAKkûí×ß®—kkíz½ú‘%†¦âŸ¼‚¥-₫'Lù'‹ßÚ¨êƒJÿP¤@îOư§¸µ°JBOy||üæ›o>|øp¿ß_^^¾¼|I\¸ḳ5JôÈÀë â·%₫P₫Œç¡²m₫×¾n²¹èß…¸'Ÿ/À÷Xs€œ TÑhâø¹×F2€ŸvÙë—”?'=ơ@¨¿\ 1E¼~‘€lơ$`¨:lă·:̉ăö6ië}í[÷;\ä§PûQúsȼ 'p¿ ÈûuhTF€€¤Y0t×d@Iñ¯¢§Óééééééi]×̀u&Ư? ₫ BFXú¿­«¬₫boơß`Ôú´₫'̃FÀß*́J(ë›"É™Ë̀ 9Êư¡–H¿èßơ÷p̀ÂI@Ÿ„lïƠJ_ÏÁx8=<—¶¬·©雹? éă±́g(Z­JüÉ ÈoyFù¸]ÀäCü#QÁÖéÿ1¿Hùµ²àñâéy₫¸<̀&‚gç̀Lư±Đ!ñPpÆM¿J Ë5YCµékH§/^1+á„âe _­D w²Cº?#°ê[0ÊI‹[ Ußçàëw£ô|ú÷Æ»ù¶¥·œÖđ|á4'̀d?÷4Rù‘?"†å€¢{O•Á̃Ô¼ă:Ü<2L²æ‰K!9“x·öû‹™Vüî$¾f̣fËöîŒÛNÄ\>¿sY‡sÇ\í¾5½`zb@[ÔêÖĐY5×ëvaoaÚ°ypxªª%í¤$ºzoÀ“,/̣Xh =U0Ü£ü¨¿ơ…;¾6^z,ä:øíä-P™Ÿ]̃Ư(×X. Té# ư¸_»3ëp₫Æ×·}|züöÛo×ûúËO?oîo©M+ןx@°ø3ñÍï©¡ ¢$Wnå–\7åÙÁºÿ ›'Ừ¶m»Ưn¯—×ëíêˆßwrB;ªĐܲkÖN­ơ¶̃Wî–]~m®4êEÊ/7nØÓ9Ζ5UÑ?BăG*ÿ/SO€Ú ̀ ₫Ñè7Êüƒø‡¼çéáé›ß,ºü¶₫¸?5ÿ*ÿ˜w¦¸’ÉÛÙof6âÅ7C+_ÖI&ˆÉ(!Û•øvÅúÏ­e¼&Çc²é|ÜZp†ª…¬Úß/aÙCódQa¼˜.•-ø÷qmù6›Åù|­Ä ÓrS´aúPṽCo·gHƠ¢—梁ü&¼*’ {ÿë]üï}…wñøøøüü|»ÜÖûT 6cÖỶƒç ̣xóŸưhßßc,¢?÷¤ƯÁ›́èåOă_&.îkÀúˆ€EE.Ö”Ø+ç=û*;®€¤˜|RNÖ`âÎơ cˆ¦°gùˆ÷" ‡hƠœ̃Ï*ïĂWxøÛ÷·2ÊØ^1¡Î£4=æ5)EaCÉ|×G;Ư]ïqGhg~à‚*q@aØy Ùê–¾q¤ŒĐ"2©ÉyUßî7U]ïë́H́GL3¸3»cyR*3Ơ3)«Ç¤î!ù%ÄOư©¯–ü0´."Å3¡m2ù:¹îÏ +À}¨fĐÛ ƒØ%wyĤKéŸ;¹ƯµäI÷q˜®ç :axʆ†S ̃ï)‹¢ –#rÀú„î3ă²è‚?@đ“佑%%€sy©́Ïî¯@CûàƒP±€N[×ơåååơíơíím½¯à6ư³Rg u4ư?Oë¶~yụ̂;ÊŸRóïi¤ü¡ĂƒÇ2}ü8₫矻_Iÿ·6D¨”"?£èç²SÿG?¯O¾ưæ[1y}yơêu@ÿcr!7¾j¶hR)ö"¿‰̃½à!¸¸ça 0ăÚ?à®$góOXö3ư HXM2ÜË/NƒÀD×@¡`e¾À Ôïs…Ÿ°̣äÙf‘¹¿–3 Éc•ϧ2ÛjÊÓW Ø@‚MˆĐÁB¨œy­eI¤]; tLN……?ßAvPó‡uAQƠ¶_|å83Dỳ¤ÿJĂ­£ú'B1úA–ùG±ÿhøµoô{ZNK[úÚ¢Iîé?»(‚Ë0ÄX0÷x˜¹DûB½'ˆï=ÅZSơO¬¦`‘3ЉLaú•o§½¿Bx@­́ƠxÏÙ đÇU3îÛV`O@?J₫—ă2đ„{Ơ‘óI‰…W<>Æ€¸ÓÍlđ’K+^D\¿§Ú—£Qó"²óM±†àzæ/y@$/שÓ%Óˆ\$5DUơá|₫Çø‡oÿđƯO?₫Ę̃?¥)¼'`—́Q¥Hr̀₫ È%.f"̣÷¨ƹÏf„ObC–ªƠĂ¯f›‰˜,°o¾ùæ‡~¸Ưn?ưôÓư~/á> iQå&S 'ÜÔđ$Ç–êfĂJù'”0Ç­Ü„x/Æ:‰̣wièeqZD*¤ü“ï›"Êö¡‡F3à•[‰ÁJæSŒ»Î­M̃—çb‚P*Ù́o8̉€¥"2ÈcÛ¦{‰E™‹TÜBƯ+zï9° ĵ (£>t,`Œÿg·– 2¡Î₫³läñA9Ëuûđw©4[<¾¶B6ÛX">ÔƯúë××ûư®¢[ßz3Ó¼eûb2ª`^²r¼?Ưÿ ÿUđ±ËêÔŒ®D1z°iÅ Á¬…5+kÀÿ:Úâ¦Ç¨–œBRïËáHÅÆ†Ơœ₫ÜŒđÊ&MơÊDđ̣#Óq°ä`p¬GUŸrå*^ÓÄFL r†c¾èbb]{·¾È2À:ÚúFÏ„Ü\™rW²‡o¹Èaî|:ø=Ç0;•ƒöĐÉƠÜ~Xư¬ª×H-u ̉ªă™ôđÔ ~<é‰ưú́ …o~¯x脌ÓvÔ;ëÖekÔLª÷Ù£Ëo–íß¶Ũ©î¿­—ëå¶Ưnëí¾̃!êÖWƠBư{æûFd pHdæaâ€é% ejo8À07!»¥e_ú^‡âH¿ø-wäB²Ă f&ă¾Ÿ¡á!=œ‹'H ¡¨]Âßw₫6Ÿ·ü1ƯÑÔ ăÏƯ•íÓ*F,ạ̀HlÀ¶_rB2Í3XíU^£4 ÁAÂư€Ç­/ƠÖöá{°Ì] ?L%“|xø{́uMO÷¤êÛ¤~urñ;®Đ'ÄÅ– ×4¡ Íø§Ÿ>~ø¸,Ëù|Æ›ZÍÄê;)ÎûE8¿,Æg9-½÷Ûív°v¹€e€ơÇZ“²Î•ƒN2 ”»5üî¼pXÀÆÙÍ`6B2JÓ´¢ÎrÄ»‡ø/đ÷d¾¿4ü’̉J¹Éx°̃×·×·f# !{3s¾/y ‚x‘Âé¯5bpÿ‡µ>­øÎ@6üˆs’Ô·$uØ!N¦‡©µ#J˜¢g4)"” ƠíÍf­º_µ́lR\{́>Q¼âÄúG_üåï^~P²0,uNZ!Èô¶GHn1…ç›"°ơœ;¾£ú)ó‡?YŒmÛ~ûí7»Ûz»óNÍ ¢ä”í'¥LÊjÑḉ'b¼OÈQf‚g¢ßH"““°ă, •;-Ñ̀>$È¿nooo×Ûu[7>­ùú̉SÊë &ï`1‹¨èétúøñăº®M¯ñ^³n°T&*qfw^„…øâæe…öÂÁ5P˜®\<Óÿ1×0æ₫Ûüuí’_nfÈû¦‹ ƺ ¤w²“6…ß_í¼Ëü(Û.vhyó–é+#aûA8Ff5Yơ¼»úY9ÅztI”SLÇÀ@÷ÂèŸ ÖgÆyBúu**Cº«a›¤¦“„–$¡ưAÑú“B ¹.dÇ:µÖYÙÏư¿&¯ÀÿˆS)A æ“A ¾s“/GíS©~ÖÿÜû}Û6tørÍO¾˜rÊ»YyŸ­o±¬(Å3ÎơçççO?Y·Ÿn?%D~Pø ôËk@óă1µĂàŒzÿäL)¿₫;+oëv]¯E÷¿ÿ Œ£:Ö†§è*[œ|É©„Zü¢ÉæÇjRo”ừ'YåÏ_Uö“o.å5s®0ûô¤Lq^ç6ZÏ”JËs”¶53ÈFˆ?₫–­p$$6HÓ¬i5 í7aAFÀ•¼F Úî4+;Ṃ.Ä£‘´ˆĂ].̣„àm÷¢×D@y»œ[»TüŸÇ1שoëöÿñç_~ưúúj!“đµ‰Å®›¤,~‘íÀ©jËÇátû­5Ç|ø œ³#dq¢¨ÛÈôeÓ¶Ù6>j4QQ #Ưuf|iüùË_₫bbÛ¶mÛ†(d¡cÁcœ€Î°IŒ@ ¬¥-^¥íË—/àG¹ËÇn×Û×—¯¬Ä a—ú÷@ºœ\6WÄpr{Êßû'Åp½§¹Â3i¥M¡@K÷À°¦ÚÇëZ[d‘* Ï]ff5Ú–«".’=̃2×t3¹‘«ZO8–¨»WÊüö¼Ø.²Ǹ¶̀׆T)öß~‹Ô¯‚êÔïÍÚ#{vxYÁ8đ ˜§W™É21S¨nÆq˜†Ú;‘Ơlé2Ü₫03‹s@=IÓÍ!³–¢8èÅ­ño&JBs̉ÓOĂ•cK0&çw22ª*!ôWÄüjQ?×GŒ…IF §ø«±Dça»²{̀€Tdo…S\m±Q Ơđº^Ơ™A?úµ\&µù=&1 …dơ¤±lxưsXÆfk–>ª¾té§ÜuÔ7¹]ÎI‘æD©øLÊ?¢€ÏTù§hư§B@ô}*ø3ÚÓê)Eÿ»DpDC{)-Ƕ±ƒ< Í·¼§#ơ©Ög6ëí›7÷Í<àm-)¿á@G4ùđ ÊYŒâĂ«í_₫å_ÿø‡ï>₫üÓO?¡ª܉b>́d(F²ÙVrÿTí§Eg€EôúM P”ö÷ÇÅƯ¡Á’iaÖ!¯Ÿ‹c¦a2%­^P;’€©™W:á”₫_½"₫]'üzíĐ₫üÛ0LvÓo>}óñăÇ—¯/@*‰ÈAçÇ–ÄQ]ăbG‹=âÓ±Ø̃Ư±ôa6€E”`¼¨»ÀzưỢ÷D5ƠX›¸cRÙœ±]fxQ†%¼H ‚³`îCIBÜX:9ÙX3N,²x@ÿ̉¤[ÿúơëízÛÖmp"­}üđññüØ{¿]o¶Ûœä 8Ù=pq~ÂIˆ•Ó´N§₫ô'ëư󯟯—kNaÍé$3ªÑ’Œ₫.ñƒGŒÉÔ\r¡µÀḄgàióe u龕·Èц•_j₫†ÿÓQˆÈô¯̃ûư~_×u ‰ÈЬ[kÏŸ?~øøơË×ׯ¯CœD&'ĂÄÂö†_¼º¦<øÓ)U¸o*ÑÍÁ@¸…±$@óÄßê agi%A1GPêË1ÁÚ.;®̉´hăMí3‹ªä&©d~`Í”HÂ"̃'5ZBRä¤đ5Ư¹8ÉU Rv·äŘƠWÖm5ßµ́P#̃­G‡ăV6 ä¥Ë,ÆÆmri ]Ô>… ‚E—º ¾."÷²Ø*øt4úÍ›u;°¦}ˆ?©Ṇ̃o$ £‹á¦>-9W*&aXÿĐôdœ#ªÑmͱ). ¯s¥¨Σ4h±VÙÎj1\Øă¸Íĩ2-¦Œ0^écÈß±L̀k‚ªªƒÏQÉ ‰Æó9K‚Vân¥k^]^$[Î2ûn]M̀LZ.‹Ä€S¹É*WÍC‘Ϊä›U |w̉ úBœ¬3ÖO¡¶æ·J» L.,lB|ØÇưô-#»v]üoÛ†0̉|¹×oOå‡f½[{7—- !Qá‹‹̣—Ó‡§çóù,¡Ö¤>”߸YdôGˆ=Xhưl§‡åá´œ\ºSư†'–]~…±Râ/^ !Dÿ@–@?ekƠ³Ă8g-K}æú?BPTº… ˆÁRü‡¼>aA|Ÿ :<¾Ÿ—eù—ÿá_¾ÿáûû·ûụ́µúÿ‘ö¯M’äÈ•(¨ 7÷ˆŒ¬¬«›}g82œY‘½ÿÿŸ́®ŒẸ̀Î\îpÙd7Ù]¬|DøẰt?8zT¬¹ë]’ían P=ú±æ>QI¹'Au½éª‰¨u,3¯©¼&z·jåäv2Z(È!=1@%B‡|Ălz6³ÚæªÇ¿˜›ˆ5J?½/¯÷±Ë†”‰Á`½?6Œ•C²®k¥``Đ>œ̃<]¯×ơºÂyí£Üui #îxÏ™ư í(úp:mûÖ2ÉdB„ƯJJ=ɪî5¸[€)­£cÇôß\3 yĐ¾GOgûÔà;a?|PE·}{9¿́ë<ÇĪë²̣b<q%½0»ë™¡¶z:=ˆS6Ë`ŒmHª½¶g3/Uë&©ơ‹—́¬!P8\7èü̃Ư“\ÆWÚ†ï~wFxùÅ}·å¬ÄâA—ƠA¨`“ Ø‹Kë¢í0cd!®'§-éwÆñ´Ó|0üR×MIûs-ôÊx₫7i¹Pu¢P:}Ë¢ˆûẶ´˜ú’z“à^Ó¬i°(V Sæ•ơ5Ë[{_60qºQQ£€„ü̉‰‰iÏó ›:ÖÛĂô­P½„₫e"Àáϸу₫¬S»h±ỨP÷ư`cLEwÛ“s£̀ !­À¨ö™½fÿfú¶qĐKxUê‚*v-v¼£Éfß\6pü ÍûqE%P6Ä„ê h”₫KB̃ß·óF"kÑ=êÀqïE?÷ û–³ v¿ÂưZágtl=à»S,P³+:÷UDÀjŸ?¾]o?~„a#p¼t—‹£¸Ü* ”ß‚Mz–6ĐÿR–ÓrZÊR­m/ú©´×2ö[P:‚­¾ÄG“Ăºl₫O[Ɔ{BÛ®1÷ÍÉf³Àƒ½Ă€î¡'Ôn›‚h̃üÏQÍđ‘ ÁE–ặ·û·óĂßüøÓZÛd̉Ùæé5½9Ø®üg̉AùL₫®MơO¡ëˆôP‡­:y¢aƒƠ{5SÓ`fZ|¼8ĐTnꜦ'ƠưÅXª}Ëa²@g:›„Jô­Å‚? gïÁ …üăº¨zNi÷†‘5»^/ë¶mÛ†÷˜@"œăË“LuRE»¯‘aơbI‹©½8ÓÑ[‚´O˜ÔJ—̃™=)wonøÉ ""ÛºqñÁ ÉMÄäv»]®—ÛíÆ²‘…@$·†¡€qùæŒdOºÇL£X̉Ⱥă¥S̀ø`C€º¶Y;ëOU5Kß5̀‘Q 28…b¥Ûi&̣|ôîñ'¡j¸0™GQ¶1yçĂjĂ,æ„7‰;Ó:¿®6½qFƠ£á1zûƯ2Ùçæh îy¯DÄh'wcZ$P->qî³Á¶„c.Í*êĂ@ëƯ~c{úo8÷¹À‚Ñm9è>yZ28GåÀù¬HZ@ö°?´Ü]BĂ!˜¹B¾%ƯƠ-~BÚÁßå|̉u¼øBØTZV@³ê«º.¾½}+&}1i»ˆab:A{p¡=^WM²£Ö©ï¦,Mû-ÝúºŸ5èđ‘?…¢ü å{6°Ä=:uøHÛp@đĐ¾°Cês½Óăú.ćÈ”?CÿÑ×­íøë=·\”+ú×Û}è?$û" :ÎƯ·ưÿüG3Û·]SX¿ĐŸ1÷—ƒïƯK ¥Å’ßæ ‡VïŸR~ëƒèÿ¯—ÿO‰“ŸƯχL’éd›Î",­'₫z0¢ü÷hP½ÿtĐ?ÿÓm˜D¡ûHø†Lc,ËRJi•Ñ©ÖJX“@‡î::’‹E€́̀¡ÉĐĂ‹Æm½!\>±J#“$Ăz\_Ÿ•‹!‚Ă(ê—i¤LG™Ô0 ¿„ÈH:ÜÅĂBO†…3FĐº¯ÉHeë Ö%bưL!Nbfv¾œEäv½µ˜l Ö„ËCí®É#ªơ^JơÏ0¸mÛû_~Ù̀j lZª›Ø_\z|}ÙnJÄúëCúÉ ó9‘ÂH Ku]æ…hl ¿”t³³‚’ÿÓ 73ûôéÓơz½^®uû,·ø²Ù̃}—ÿC<†€mî󵟶ø˜ô¶y¾o%̣Y6úK/‹î)y ₫ɳ~$Taæö†¶„rCeÊsó»§äÎ8Ó'̃€Èà¸7&Bn¸₫Đ˜‘æ®[5ä3Œ´Bj??×í™Od2ú∕0Ç®d¦ŸíC bñ.%í4^¥Ó%œÙ^buB7MïR{±/PµXÎSÿ°ƒ2è¨içđ»¤÷b“éu3ËÛëưßduµ¦Ö–·åVn¼ÙŒ¶ÛwïD¹1àrû-ÙÔ¼hyƯª¡Ùü „·²ÉÙĐiÉ7uó¸Óúe BóàEDd[·]÷ªî¤„ÇÚ S›]^a>©„†‰åœÂɈKó63×₫ÅR}¤₫ÿc1 O!³¡…ݱ€£ …è=éc°/Ë8&è„Hºˆs‚A?_§Íæáđ?g:pĐgEâ™ñ̉s“iá`ë̃xÆß”XùÖij"rz8ưÍóôøt½^×u…ôRúsç g‹mCÿÓ {]ƠwÊ@J:§Ÿ*¥[ä†Ù· &eá飿Ä}P´¿kßX¢)+$·è‡W?è ‰äqXÇz`zQxèëÊ*²ºqU¬́e?XÛü …€ÚV½Z.„È®»iCDxư¹„U™^¹ÿj‡, ëkY–eY–C9TZ%¤™N *ĉ ¹&Çk…~é%;QHÂ9µÔL«%MI³]QXF4₫ÂÖ<\U¼^¹ÿ}C̀OJíơTà-¸¶‚Q¯öCÎØNƒñªÖÿä*«̀ư¨8vWTôïA-Ü_µ–ä/\Ü?r´¨(sÿmó/]|—_má[ˆơ÷´à"Ü̉|Ơó1ZHß›̀?¡Ÿ$ˆé;km̃É {~ÙPûŸËU ç@z"̣Û…̣}ñèx${«ûw‰ ‹½‰ˆlûÆf†ó‚|«Q7Ơ2^FT@Ï€DÓÜßqƠLj:—ˆî$wơ;ºï%qg̃Ñ é^à æ̃˜[˜$Úî„[(3äO,–b¬xZpjÄ+‹©µ̣̀ơn(ßÉzü>®î=àUI³í|•1Ɔßv̉ Á´¥r¬ˆJÛbÆÆÛP¡O‹k|Ê*Nè4ÛËÚk=ô¨Ú«ˆ È<‰I+ÈÚBĐR÷lÂ|Ï»ü„Y~$úzûÙ×äNª˜̣QsƠ`(0¸‘¬´âGÆ…à”øà³:\Dq‰£?Aƒ#€5[³$®¡U££à¯Ø¶ăñøơW_¿ưêíñßms¨{âù”{f€/ &¤˜E=Ă^F¬íN-Á!Æö@X›xv  Sˆ•à] ˜v/–'tSkiµÖ·ÇâløèMjÿ¯–K K†àíÊ¡Ûm]×4.uWf\Dê† F‚IÑLG濨EØ_…e@­‡qÉ£â3Ô2Ô.mÖw H’œ´ âo3[€8¿zûƠÛ·oUơçŸ~^ו£ºü“ózc;r|öM'„(sÉÖß!ÄÄw]‹R;iÑBH/÷ÉÅ₫·sÛnüĂĐ¿£ûg Óüëßj‰Úê`¶°àaô^©z[܈µáđ\Ơ§È̃è-» À5₫§AÿÑí£SznG¼5@y·IQ:ư%Vö´®Ó²̉OphîĂmñ/5ĂS´5û Ɔ…UMèäîµdü„÷Ê‚íÚy("!ƒï2 ́ú"J+C ”RN§S)å|>³ư·¯R<Ïù­;= œÛÚ¡ÿ´ˆxÁPr‘⣠h¼Ă—(‡î ÷qUåÙ#PGùP¶"x.™‡aƠgw㤮5|!ÔÈmÖ€ µw«“¸£=Àh©Ê§ Xïdöă»…™€BŒ₫ÇnaEOæQ¿%5Ö¬¾~kê¯Ô* 1ºÈ…†ä×J.ôÀ¨G€Îơj)îZêO€\æ#.́Î5¯ÙZ¼»c` â  i¥;|]ÏĂÍ;v»&¡ÔÔ->R•ª$[.”©/ Ăª›$ă“éIà?ü Is倈å¾è{ß°äSC!NƒĂTcO‹y92é ÍfĂ½zŸ¨@oW©Ă»ÜÖÛåri Tœ)íÿ)÷º*ë1âè>ɬ0©mnëQ¬¬x ˜ö‘Ơ‡`m+ܪE§¤*ÏÔy©ĂÙd-‘æơ8Í‹0ßø”åÈ7¨2æ/ÈÔ nöGqº]daLíx<¾{÷n]×ÏŸ>×2ƒú9fÖ*4tÛ¦ià¨=Ú;•– Ø̃¾fÔñŦ¿$`FE™êÍ\Í ÿûH6$:Đl»î­ ™è‚ƠíñáñíÓ[1ùpø°oû¸ëÁ÷÷íÛ{5@_ Ç¾ Ä÷J>°°ïïnR2€"°¤„l^Yáˆá 2î÷ªÿ„ƯÄ7ưÖ“€-û7ơñ¬ßz7sK Mª£,‘éa Đ.¿ơæ…ßC)”¿Ô¾ôŸ°¶ »1°èr,GßíK¼̉(̣CU>± †FcÄ?#V‚ MºGäĐô¨Ül!³ÍzĐ[VdlW(ßâ¸(%Àá»ù GÈâûÓ Ó)ÛLSiÛs4˜ûú@H ưwØI»ªwÜADk'S5¡ c-6à`ư°₫Y¿d (ÁC9|÷ư÷ÿå¿ü—ÇÇÇÿ×ÿăÿùùù³mÁq€25&đ%₫0QébXQTP^Ÿb¹å¥Ë +n§†wwưR«û;8v$.‹§§ÇÉŒïÙ ’ê+p!?a(¦â}­A´Íûj¡¡Ê§ÅLqÀw %/áỈ4z|uƒz©Óºæ₫áWf‰œesË‚ù„.Ÿ₫A|"¸k‰ÆĐ0´.́½¹Ñ5 pư_e%ƒ‘€áî:A)’©UsZÇ/¥Ønơßz¾Ëæ/fyoZÿÍ »+[¥›âWK¸ÀỈtH¨½ätvŸ–Xô₫.­z!C|í¸í7‚PAÇÑd₫Âw ‡2z|xü₫ûïÇcYZEBÆ™WK1?ưÎđçWæ.—ªÑẺ»èNÜB¾3ɘߖÚzLerO>g6³ÊtÀµz÷́ßøâv:¼¦© ‹ÿử ¯ë2r¼̉;Ç&–Úé/È3Ä-œÔí÷:j¶»Mj¿Ïk2ŸüÝ›VqœiäR`ù´ä¡ ƯŒ;ø²óÙ1º¨ç#=€·̉éHäPÓˆŒưœt…ß?•³Ÿq[CV¨øëøí-«¦ J°IÚÖă=$®ï>–ƒÙÏçÔtÁ*÷ägJ`ûHFë1]h÷¦Oº‰Èm½­ŸZNàư{m“Ÿ­e8˜@ư'pÉ¡mF63i0¦¢]9ĐtHÇñå̃ŒÎƒ…·Ew¬n„₫lè¹—ơ–sLçîv1›îiE#ËvƯ×óù\£¼§7yzzz||<”Ăóóó<ưÖ,¬/xAé ̃+ÀÄö²—½xZ5ÑÎq—®ùë‹=@DĐ!œ8!¯~đîK%éEåz¹îÛn›É.“̣>i×̃~|Ñ¥r0đ ¸ë@È Ñ*ˆ™!ÁP*uŒËÿ ˜Ií$ƒ"Itß÷M<(¿•ḯ%>9€cư[đî₫”ù÷¢Ÿ{("´ÙV1eÁI ơùéÆ@'ΫUÁ}§…8¯—7ô_sÿƯlđ”_9À;|UÄ_)9p¬=ˆDa÷ÀŸSߢPÀ ¥=̀ÀD´;71dưî÷Ê?=́§̃Ä]ĐÏ& ư%ZớØeç& ‘" ÜÁóù̉>đ¯tt¢€̉Pª¿í“A ₫Aähpd·}ÛÖççgÛÖ ´Ô˜d¤wi+ §`jx¢÷Ưs„d‡₫_‚ø€#c“¼+Ô/æ›L:Ó̀Y…¾~€Êæe¹ĐTÎOQ OÂÔHípäưB‡øĂxO?SĂLçtƯuÄo¡ÙLȱüb1Üó'zx+mû[êÓ| º÷¾é’GĐ[ï&h4‰îw²ܘTSÛufÍ̀erÈ1;v”đâƯÎÍA°bJ7l€q¼¦Ø1̀”QEÁ&ơèKT½LT½ŒÚ +Ô,-ßÉt m wè]™`+ÎDD–ăR´¬ëZ£·ưy‡¤ỵ̈fäh Ö̀³°¬X\VÙÀ¸0‘‘TœsçœfAÔ¹W¹¨[5=æ'ègÓV·[ VÚ´ªÁ'Ú÷Ñt¯È^’±üvqƠ¥‹ó1a‘ĂËwèR–+˜ *È(‚¼­ëz~9‹È¾íS9<§ÓéxZî­V.À]~ yê&$5N»Û¼†<Ơ‚¡ ZZ̉?¤5ơƠ‚­ïé[Ư>̉½:́ÂO3YPçg½­Ûº!³3lï#̣Ê/¥h9UG°g@{˜Wª™Æưë‚ÂÊ9Ny_!²öxêtr+öß÷úE©₫1P~rÿ­Çül+‚ûQÙÓ}¶ăVîZDû+̉2ào§óï¹Cb¸é§Óú×ĂQ­ÆJùU*ơSåO"²RP!óƒ €JFEü¹Î9]g‘{‚¯ø₫¾÷Í 0Ú _ÆäÚ-7á_§GØùĐ”ïîEṆ̃DvºÇ rü@E¼fXwäµi@2Œ¾›‚­đ%…9RÜ ;Ç¥GÜx̀F_¿÷}ÿëûÿăÿø‡}ß›Wd÷ÕOt@_#|´Dëư‡æ-9£0V«Ă¡a7Bv@5íYAèđ•¢V"Ä÷39ø§ÏCŸăñLù>ª¦9È*Ă_TT Ùc(ñʆ¤±1‹½{ €¿%Úx9†Ÿ?D˜´®¬ÖH)ƒ¯»Ú…œà,Ö$¾ƒ›a¤<øáƠÆ@µÎv‡4V€mÍ';ÀµªˆßÖ[˜zª¾§ÅidEª”îÜgÿÆÁKC?ƒ$ª·kǴ5gïÄDơLn›ˆÎ¿˜G "”oêÊ•ƒ8Ù·K]Û¸J<7 ®€^`F _Ù‘pp¤<Hôl×luô›6ÉMúèud}9ñơBLƯú%…¶ïûm¿9”1×<µ?o·ÛóóóóóKÛü‡*¸?¿¬ô‰_G§"}éÖñRÖ²î-ơ™*@!{̉T₫Ö:Ä_DLU[0ă{&̣s½:¸”e9,?üî‡ÇÓăơzươ—_kg!JD‹"n¤¥óÆ^Ư €Ü¥ª5 éÊ@{@ª¼ ̀kÉOR~9Öf€y…ÿ5Ú¾ÛW5'ö}·=Óÿ;E₫t(Œ »…)ÆưĐO‘ư%VôÇŸ¡gúλc¢0ªưxO9,² à§enHÉÆÀôφœJn”lV Q]²¿ÎͶƯ‰ë¥ÿŒ+ª¢¶RHEïƠ³Ù¨È†•ʸßvÏI¨?í̃NQ/Q ²d:· ŒW×úG'ç¡^U0d  W `Hꘃ2¡1Rháù|®‹âº­Ôư¤Úñ¨¡|xßX!жG` dà ưºª0-.„䬲ÖÊú ³¶Đ¸É –ề;îXÆú|0Ljûœ…Ÿ.ä㮩S¬È€äBă‘K“̣IƯ[èÅË‚àxIƒ́¬àW‚&ytĐ Tä±fÍÇ©ưL ·¯Ư†ø1†6¹J…J›l8ßIl¹Â2MhüàăBÙ‡®$â<˜¯Ñ¸ªˆ_Èh _Œ̣ 'Ư¨ÍĂ}’Øè{#˜æÏÿIă,iˆHäû+ÇÉåHÔÛv f%Èó°åE²ÁÚŒë'‡eYÚ&åjḅƯwß=>>^.—_̃ÿ⸽₫Ú᾿Ú4üFŧ†N”UZỰụ̈øa“z LFÆÖ˜Â}u&tmTñ?ÁÅ@̣yÜÛLï{„¡˜,Uq¹EÔÑÄ‚’Ư§d-P âVlög[:Jx¡¡)ˆ'ÏGƯ`FJ˜Ư¿'E3ºÂ9₫„Ö1uù‡³( •ˆhmóµø†ÇqW*Ụ́ÉŒr§ñ™Öâ·Ó²‘e E6¹ mB½“†Ñ¬ÛÊ ă¥°À˜)|_¤ç ÷Ôaäø2fÄ?Ø̃# a4ƒ_j'ä¶ßJ ‘´O6Y{íÓIÈ ädTwâ°¿0z¢¶}³Ơöm‡ œN§§§§}fT¿>;² « ËOv,op{ïƯĂ <ë*A‡Œ]‘NN£N&äÇvïhc×Đ8€EDÄÁ„–8×üß5:ÑL?±X¶%k!à`\‹RZ¤DĂ…¾Ơđ÷t|Ưü`½—f.öñÚm~y.¥p "F"}Úa8Ơ¿{Ưúk3iLëö&´f!ëîÉuÇX–g¢$|Ü™ˆœè-‘¥ídYÁz¯̀3Ú­'àPÇåøƯ·ß=œ×ëÚ¡¹-¡¢£Ù¶+¡@[ÀÊC'†¾®‘ܽƿờÑZæ¿¥êÊVÓ|=—w÷¸ÿ´Ư/Î ‘BâADÍ´è»}yÍŸ;+V`±“qMø°°Q¨Æ{¡úÙ<àIû|1úi¾ùẵ=p ÿWưsáÿn¤'â½Â»óÇ‹§Jª¾ÏA;„ôßå°<<<ܶ›|n|üñx|úêéx<^®—ëíZ ®®€ïl¸€f,[F©ÀÍB˜y{åÎRÁoÔœ¨ĐÚl –íQo2A’éŸa4 ‹º¾f]Đ—Ỵ̀ÎfÙœˆ“À*uü4Q7æ$Đ=²ÍüÄסDï º;íâf™`­®X<S«qg?¼Ñ†₫¦Wë*̃•¸ùÄD±ăŒIÙx²1RÉ&8„½ ƒ-̀Ë }F @ïư4¨Œ'̉ Ço=ªâ†̣L9Á”E“¤wT́ÀÍ ^—jÄ̃ (ÇÂ{µÍ0îq%đ%AúĐ¿‰³Ñ”’{uÖ9m”F÷Ïư6‘‰(¢³jÍ©ºăŸêÁëå**ëmE“¶}»­·mÛd—Q’§$Ả4üó×yƠ´¼x´ 6ɦ‘8J]$urßQn§p|bDI–jœÜ ›^çÇ”hWZ”Üc–,‹è,¹¨₫[¤Ô Ê„%dÎ5àÓ5z¤kS·Œç{ơ!3U­»&‹+’?/ØÁƠS³{[- iˆˆ”¾‹KWû-=€́ùj6Ô_[øö¨¡YE¾¡ºxØfÜϱ₫i ØúçR–Ór“ơº¶LPU†₫:„:lmœă3,Ư$mQZ©3«|¼çéÚñß{xϯđc9Fˆ}»́¡ä/₫“f,‘àè‘RÊq96éÙwœ Ö¯Ó·ƒöÙ ¦.¬V\-÷©øGÄ?|8̀ƯÇÔYÿ2„ưtcĂă₫á˜Nl–̀0P¬¦,Ư‘ ü6¨ø¹÷  Ö/¥–CúÔ#ÇÓñ»o¿[ËO¿ü$ñ°¢“Á³zÄQ!!8zKù ¬¨¹æˆ$×0C%í±₫ªÑc»¬ˆ v?ˆZ₫f7xˆQ¸—KwXDuáT%ëb¬ư¡x&‹g)¹|«~ˆØë¨}^Û ĂQP#;m›˜¥üăùëYéÙ),½.àÉ•?;Œ%Dó4w#' œ ‚÷C¬Ç¨MMÑJ3J–j̉éHç[€Ö[í’çD­0̀Ùw2Zbùäñ‚ÔUº ùAÚºƠ&· ă{Ï|jo‘Ê – x`Ưœ₫́&tư‚Í&hÅUk•n·Ç’lDZ˜C^íƠåÙ’äd€º§Euï¡„¨:TiÅCmî÷¹9D•$Œ]äF`´á¹ưÜ«XÎZâî†ÑæŒ1<ưs„‰Áˆ¡¸· å¦1âèùå9¼‘ÈÇ_^^öm$̣fH臠Ø}G}N6 5‹—NïH’œ«Ô=®-!>Ñ€ng‚P(f_̉Ûđh›¶OEWh­b}}um¬eÛrDs¹qÈƠäTƯpRÇëW²‚j&Œ‹qôÄÄ»ë¬_e”6“ ¶ Ïq†%Ơ‚'Í'Ïî¢đO7#¹‹Ú:­z>¡Ùư]jÂR«öC~˜ú…ÔñENQ•É ¥.-:"²,º8¦Ä?jûH߬÷E}ÿ₫×ơº~üđ1T́é„tÊæRBÚ·ööṼVÄÁÆ0„ˆÙü‚₫)R¿–ôá }k´O;hÍ!à‘ư½¾'«+ ”ÿ·–TÄ5IOhøâaÁÄ/Jüê=¢í å FĐpfEùKYé{~•eÑ;+{/ïé[JK Ê_¹đ—A+»=E_ñV 2âtøëÿ*ø†e8¬_ÀưmÛ.×ËơrƯ÷îØ÷Êư¯ë $ääưNRa₫Ư°Ó>æ¦H3T€àCat³à¼bJt;t]×§°|î£@~,¯±—C9́Û^ß±ö<ëVÖă¢â ¦×Áà¾(¿#?4 Z´\y z§å·€6@gX)Ú̃Œ̀oÀȵS@-̃‚ñv*¹}/„ơM¸úKâ€ë§¢<Í]÷­”̉OÖ7ăă Y ¬sÈ/…aŒ}Å‚sƠÆÚ¡R…'HgùPú#›yq-óÑ„]A« N¶¤^×~Œ;HĐđĐ–l!î̀ÔóQ¶QCߥú' uỊW&@^j9.‡Ăaßöëí0ÿ@à¶I8„/îŸuhÂIF¤V•́"÷‚´?ùEDÊÛ”9}.9HF’½Í¢Ñ `ü'ƒ] =’pÿxÖ6h’·<æo 行\¯×Ûí&ioj$“ ÷Øè~gµITû¬â¼Ÿ;đUv¸±}Ên"•¤u!É´à‰ăóT{¢Ën(ËæàŒ̃¬^XhëFŸbbà•Aи® Ÿ¶ºÍ= ÔÔ)à¨=î<èă¦54è (Ă®Á ³Æ:_9 f( ç”ñ·S‘4q¢²1×øơ™ ñdív‘ú@È̃*µ/¦5RËzè²"Cºo†8.+ÚóC–Ă¡W{ä.êÏṃUJ‘]~üËÛºƠ g¬{UJ/IuåƠ$S¤;9ÖaŒÂ*Øâñâ=sÔëô[ßâB™ÿxî‚ä@Ømç ơ¶mƒæøi Ù¾NÙZÛ8Zz±Á_L¤Î ?¥oD ƠŸ÷/^́¿¦ü–R]PƯèØ‰Ñ>\æ_{’z›aĂmËÙˆ8^,|ḈB˜>¦„¡î'öùÚ÷ÛívÛo·ÛÍzÿËợóÏ?‹ÈízóP¼^?T¤>¯]³s†¾«?}Å̃pxá¼ëM^†+2ñ@¿===-Ëry¹Ün7fơ —3Đ'¤̀ËäˆáDÜH]= q\íntyX¥y·™zw´ùÎ́ûeàêgY–RJåó¼shĂP”v&nÔiÉÚ9ü§¼pÎè$­Vÿ>4ÑÆ©ÜƠS:ù́÷_ÿhÛH‘Çă%´Œ €o\&3-jAê…#Éœ˜¾́´¿đ±Î«ñÓ®:á4Éê(Ó¨låF°è΄.Ă-ï0/Ñ₫OË]Çâ ̀á’c~ªÖáˆ₫—¾Cê$²«"SÔpơø™Ü(n3¢¤q Óœ6˜“éd¯íṇÚ°RË…4ËK&Ï(?™unŒˆ„Rîv·U“.`÷f³¯c~‰¾öˆ@um ̀¨đÑíTaT›lî#™·è$́Æ^â~gÛÅ–é¡Ù¿‘éé¼H–nv₫J$…x’Àؘ—¤+=ë>$Ü`î̀qXƒf¸Ÿ§1yíd««‰JÙ ,¯+§ÅÑ# ú¼›4Á̉?ËrX*² ‘?)j?îă‹1ùđ₫ƒrÿ¸0‚…`E„”_µ̉7º›Ê‡n¨²X_x³­â<Îïÿz ŸÍ‘½×ø .Ô",G¡æûĐY’ÜZí̀×È7³}k-éƯá ÀXÔ®"Ú, ;pÁvBäưcÏ/9x¡O = _¢@! QưwßùE)4 …×£âgˆÿá°.*qu½]÷ë¾îk'äír¹¼¼¼¸Ó ^4ß̣³k¢È̃²`@NÛ(ÿ‰¢¢|/"Kp}‚@®,‹<éJhϧ§§ÓrÚWO/cơä±÷bÀổÈp`!åƠDDß0¾,/ÿm Ö¨…ÓÖồ¹F"¹iùˆÆ̣;™ˆÊñx<×ëƠÖL1&÷†@fJù7ÁÓøSxL œ$AóSŒ2AG<º%5¯O_À»Ê°íëđ¡¬Đ„ÁÂiļ‰]ÁhSÚˆ·¥ c—B-5%¸øçkt ü–O¢{ Ghăq Hœ‚ƒK6À¶o²Éº¯iĂ $¦“,@1Ê}˜h’âª}°º Jµ ¶ÑÀH 3b`èy₫¶# A[‚µˆö¢ ·}uE˜1AËQíÚÔÉ r “o#Œ¾ƒÉR³Â°Lcœú™êÆ$¹Ç’y< @VAFíœÎd!˜Ö¢̣AÍj‰±1y—‹]Êđ3VàÜÛÁt́juÚ0́ l—̀Ù;¥ÆÆṇ̃GÄ-¡­jllàQđFHqe>Ă9É<½áo’1‰ ŸÜơÖ- ˆf±×f-ŬmVVéà¶ypwÑHOÀĂkè<]¢ ®Ô9oa?q¿^¥¬S.Ü9z đ+'€đæè—äÛ¸H”9jÜêv¿œ¡»Ç¸.ù¿µßí«ïÖĐÜÖ×̀<ÈZÍŸö v?ơjz‚×mñ0Ä :§H`Ú }rês,»éLd/ {Oµ&øVô¢ÿ‹Wư¯&çsLj¬ y¤ÂÁQÓƠm$I[·8›̃±lpÚØP¿ŸJ₫§„àÓON¿"?ă .…¸GD¸N€ÿWÅđ[ôh~FđĐƒ Ûø'₫Â+nV=ä%`^íx<.‡å5Ê¡ ´<EOđ[º ²^ăÅ)0ge¢XÛ€’ͯ=À¬jz! ÑŒâ[»'WD‡đBD‡CƯ¨$-–©—6A´ˆ|`Áă|₫J¯ÆHqpÉsÁD éƠ¡¤ÁÜÇÉ`´‘¨X/̀ŸB°0úđ¹ù9́Ñ¢ƒ½ö̉ƒÂ%–N`^“5.‘®>œD˜̉<ô(8–æợPë̃" “½ù(‚®°ÄđáÎxw¹^¯î̉Q7-Äf̣Æÿª°-Ís¶úö/'YM]=v>Z‰Àˆ_*ÛKq|1p¼À§&KE áK&ẁ3£\¿¢;@’ñ,Ó¾ Ë€‡Å•6¼³Nå°màưfÁ1eÄ ¦·Ṿ§I7rÑbQ ˆ¡™ü¤R¤lûH¥Xó$ăûư ‰’„>1ú¬àvÉ¡ø¿3`}¢ö]£ä/~°RỬ¹OoƯ'`qƦæMåçdƠA°;Ù‡˜x_7ú['éNEL°M›÷FRe<Ö̉…—ó%M ¬DƠhDÁSÜ Ă­½¸ÿac´2 }á̃Jå̉o»ø]@‡CƠκ¥WĂ EÖ‡ÀIBˆ¶Ù=|¨½RæéÊÑUC„ôO%zd§̣­ØÜÙ—+ư{Lßä‹7üªß[ÙP[[H:Ç.'¡a“”ÆA>ơ{K•æxạ̈öú»a2u×A —J­ÖíS¿·€íá₫ê±₫Í !88s$çf¸`kx¾±–§Œ+ÎCw$óú¾#Xüuœñ:BˆoåÛÛă{ư‚£v…­ ̣»ĐâwIç&vdÚ'“‹u}ʧŸÄäz½âÚ‘ ŒïC€ ×Vu#"Ëa)‡²oûu¿2‚ñóñ₫Ăb¨˜́•NqĂơ¶T¡§åî4¿‰­ë*ö§üöOïŸô¬­Øn¹I~ö(ñđZü–i*XẂÎi–©A©—mÛFè“ïPGsÏ.û/·áT̀H¬öƯkƒ½ó…~™÷Àĺ†¿é‘ÅJ{)§¾¸Ôỏ(f¥cÄ6vjÄ8¸¹:©<Xâơ¯ën'Ϊ̣̣£Â l›<×"ßÑ” Lư&]E„jåD 8|ïø‘{é•á‹ß}ÈjJ̀jµ%dÚCº“&́—pDx¯Áä £Ÿ¸›ÑØ;|¹¨§GÄÜ}¨;WÚqçˆdTEµIwÔđ ¹ƯàAàŸ´0¿¹ơ ă¢õ¼9.Ǻ*! D¯±ü¤åC£ê‚¬‚?„é¬2ƒ*}{`ܨđ†Á ¼âàNHz6D§Ơ¥i¤¦¯É3b®TËá«wo?}₫t½\“¨™“ [©}~A¡xÅV tQÙu¯Y¦»́Z”₫QPƠ[¥¢¢Ë¢‹¨¼b(eô6@*Ñè瀫ưṭ›¡¤Óç©›»VŕˆˆÿåÙ6å%À¡ỬËn5xLùMu~Zoß6˜C‰<¸oô;•! ƒă=÷·ư«1ˆ?n¦ ´í |„ `êFtxÛí«,!è¿VơAÁŸB ¿U·epC®7ƒGgÄLxóÉ‘ˆ>1÷aơéa]²ûv¿bØ Åî7Đß ³Ḱæû$$pK’ Á ³Ù'(”‘ᦅS3ƒY¾czÜóçgFZxîT¿ŒXy”̉¹>-z(‡{¤°²cNE|Á`V5©₫Ä—´ÀĨî'6À¬ókJ3ô“¡á-+f*3<ˆ1ØĐÏí3b֌і¸7¾­Kv´ü ~/ïUƠº+ï—ÿ„ß18âS¿€̣é½Ly5¶ ôë)÷:g/|aÖ¹₫ ¶̀M¾¢ÇÓñP·ë-­ñ`v|¤$Ø#®e:0ë̃(·ÂwzF¦O‘ gˆ*2Ẓï‚̀ dh@ç("ÆEzÏó׿ó0pÔ ï ˜ùü#ǽÇÓ_ ¿ª¾$9‰Œ-™_4K¼Æo±[üO :»':y|£̀ñÅ'b Áè§¥3ó]âÉnÓvÛ)wo?pX‡åP…̉bj͸¥ñ8ˆtDZ?ƒ2k¿—"• ® À1úÉ8 ₫º/~¦^²Y~Ó7Óu“jÓ•R̃<==>>®·ơƒ~pLE`tĺ:R­j§–f j!. ”î »mˆƠÀzv¯ö]{9¼G¹"$Eÿ+ªo©l ̉ÍÂñëÁ™Ëx9[Lá₫Æ[D!ô_Z”*x†Üß^@¶,”ûÄ.Â`n¸Ö~ạ́X̣UxÓ\œï@ŸË±I@uT•êưkÊU„₫÷ªÿûYt)´“vÖ¬øˆ·•đ ¬ïD+¨¢†Zw±5ê]ưûXµ898íÆ_ØE‡IDÿtÀ?€ èß§«¯…Ư ­Ö®è§ù­hÖ³¯ÖÜO(_¡<£ XÁ­Ôg²Ï0ˆ̃csê(à!4 ºm›™mÛ&äggXlfP.ÉfgNíñô£Áé¾e®)8"¹Z„7o‰5²•nË?e3@["~M!€$'Ba‚G·d˜Ô˜¤˜EJUÄM º.̉¡gzo3(ñp+RMlÛ6»Z …Â9œkTƠå$1a¾f§zy©%Ú–¤ËÍÈ•ÖÈ$®?g'Ë7§wÂAgîûŸ‡åđîƯ»ÓñôÓO?m놮đÑ(gQĂ+3X @–uPª“×"[­ ¨˜l²₫gc@9=@{D¸îE@`0Äf°½]Mu₫bφ1›m ĐüNĂMnUôŒöraØ¢₫ê§ †ëë&ÿ騴qDkz/ Ts.~P1(œç UêLfĂD?G3;ͦNRK¼·‡°4…­ïÅá%e(ơ¥Ú™Í aÊđ„5³mß^Î/ë²̃Ö[[7û|iÚ>ô'Äl‚z²ÜBåU3ê ÷$é)³â Y®§Œ1 ¼Ờ]6Zøc¤ )Í /ÅdD2çZMöRøª¤¸dP°í¥ï/$Vµ˜ö& Öû·Ó(+¯>yA¥Î†àûVà˜9n§9Jâ*¯ÚëÖkeAùPí§¿¶Ïí8nM@½6¼Êü{•₫wߦ@Ÿø—±>3ư©öå₫!ÄYƠ–đ"Đ́¾†î—^³Ÿ¿û ré…>ÛA ÙÀ* ₫`«¯̉‹ÿùé@ßó€% öÉưS¸„22ªĂä ’“2^§ ÿâŸĐ¿™ï°{´`¾båÛä°»©É«Q]ƒ1÷ å!Ø\ K3j¾âZ<̃àx…ƯèÓ}€®úeĂb́qInF7Xº®k]!’ t‘ÇÇ£¦®ƒm@†#ă²§ª///ëÚk°hà&q ïœ3£zöè„:¦¼‚â ưû‘VÿÎä©´”@ép'Z iá$Ä»óZî́¯SŸ²®«l¡Äa’Àn¸ ÷øu~Hi°Ô³,R,x$ºIM*‡ïwf¨äK8ÑÔ±àÂórĐƒí*V´,Ëñ«¯¾Z–åưû÷ûÖf½"©NZ'«̀zÉmå:qx"à7Æ ® #ííV±áơ‚ŵÿy¿°jÔ È¢ÅC"`¼Fö— C9’¦'5˜{;íÖÄË7s¡]71@ H:ö9 ½¼yCñ¬ *EÓf¦ŸƠB ij:†dcl*‰43JµlûùSX-qH'á^Ÿ}Q„±ëS¦Åmˆ·-›ôu°hê s¯´0'Ô_·}ûđáĂ¡ÚN¦Qn¹mÉöFĂ˜Ă‚?$!Oy›x–¢~eé~3gĐdç—‚±$¤Ö˜KmJNOtË×ö>g¢Ù–]FÖuưôñÓv]¯—‹Ë!±É̃ui¦•‘û§•úé(­â§Æè,ñ^2YjZwĂî‘́Gô¹oæ%å‘Hº”åp8Ô€¤†h)Hú"zXu ªè°Ư¦¥¦ydÈn›lb̉jđw3 âøÄß0}Üí‹íœà¬ß1Àí ¤Ø¶ÉæJ6jpŒúi`½“4ʼnè¿̃"Ô₫o¦DëmáûicàÊưËa)K-ưYÿ¢K éi(?ö´J 8̉G'Ù Èè@ËC•$σ¸â’øb4́–@ưv{aP\…ŸX;ªk"ÈOë'pQΰ’ÆŒu%³i­ 3/½÷n;ª¹x̉äÏ!BgÖx<ưT7ec4 ơ”†[H3bù”Î284oï‘JKZCfc-Ẹ̈ûßÿ₫éééOỵ̈'7fèÙ¸ôQƒ÷â.9»­w‰†ÁÄ̀`₫,‡W,„/ 1ÇQđ9AZ}R ÍH‰ËØ4ÓØSj¸ áË4‚ÓhâI·G.Êß×£3³`y8iMă8S]‹ˆ´]F´]–û-:ø½3ççÜ{ 7Ç#Ÿ¹]Jß{S:ư?K`|)d;±ư[? h£”6-ÑăÄS¿ÀTƯ_qªôX¸œư₫ ÁI5i#DÔB#[»ĂaÛ6'J%øĂ­̀̉=[¿ê ̉‡Ă 8)ZĂ-7Óär³múp‰°‡“yä°÷}_oë¶m¼ï5ø ë‘Bœ*}ä¸ÿđ:ÔÚƯöëơZ7€’̉̀)^adcå …¨ƒ&ÀàÊàÆhÀ߉‰`[‹‘In wëí»cq'É{lFñđ+oÛöáă‡Ëù\ưíS±Lâç›úÔ®Ćÿ…‚?-]¬‚·Fù«ƠÂô-µrhíÉÅ)|æÁ_­‚̉rC9PÂéx:NEÊơz•½öQ ưWƠeYK)×ëu½­2û0e+}‹¨đcƯBÿ9¿eënw·úâCx nÔ0•…o¾%æRưS oë=Îñ;(+Åú«ô_M/ßçK©đ¿PÉÿ˜àëè?îđuªî*Åk1¡U1„i´ZW¤iÜÇ…á>̀9‡é»…$`>YúÉ û)‚HµÂPñ>0øB鄨˜W&ơÿÔP{+ôû_:V®°¥ŸØ!´ö(ÿ®kơ•*Cmµ tÀœÍ*2¯ß₫åU|@lƯù›Ë;ÑD×¶$wåEf¥~‡Ă÷ßÿæÍÓ_₫ư/SM`b"€ç;|F¿ Í­×î́6F ÈHHGøAi²„A©mˆ£éP?hñ×8̀|ó|ŸÔ3’ÉiÆ+.ỜcÑ '¯Ă’< sîóÚc‡Ă¡ñXy³ĐÛ0,ư¶ă¸©”R–e©ŒOƯ뺾¼¼hvµ©± Æ.2SÔ–QêàÇ“L¸&¹b>Û™ Zê{'_P}(v;Đ¿À};¹v'ÜĂÖ#Mà?Q\bpM+Đv˜«¤—¦½úÅœïHH»b¡ë4ß¾}{<?}úÔ 'ØóM†2¾¬ˆQc¹O3ĂÖÚÜ^²đ<n“©ÁBå5j6(=bˆß¼y³®ë¾ïÛ¶ *¡›p:Ó̉Ư*peó[\ÈM+ƒÜ¦…ƒ¡‘Kó2Da˜æs³O]å{o7̣”¶ÔÀ}܇9ØÍ72Ø*¼04j̃ 3x2¦‰Ùn///U8Ñ’F-ơy:}:÷$#Ǿ~=^̣·]UÛÁØ" i‹ÿœ³[<8$Ĭ‹‡h/óÿøđøôô$»ØnÛºé¬väĂĂĂwß}W´¼ÿ~[7~1xˆ/ èÿá?w¯ăi“àŸÑ ÀaB!ë·¯ÇëÁu_ëàđÄ hXu<îâ₫Óq/®¯ùœTqŸ tâ5Êß+ü”Àåcϵ1‹#}O­M†3ư4“ưŒIJÛ-Ä8+wC •k-©×¿Đ‚ơ÷ád₫BEB“8ư׬m«ÁÏ"à3™¢üñÊÖópëD@«¶óñ,(ÂS@´§/<É˯­M ßCt1Û][A§0©Cí뙨ôßÔ4Wû¤èjQ“£œÿMz‰̀›–Ưev½^Åd]×H tK^Ú–ÆüD¤Qönd{¾Év‡2ơ;ÊÅp9ÿz6¿$ê“%t&)o£mk±xƒîâåP{ô¶[•)–,±C¸đ;Ǭ¹S‰“wâÿbØz&Ơ8}üΦÂiŒ¼Ó¢ÜÖ^*¥<œTơr¹´}¾èø"Ë£_{²hY˲,ëºî¥ÍơÛíöóÏ?-Htqáè«.–¥ï~ˆÚÛhF0ƒSŒæFØ¥Í÷½÷L/wÔ[¬l²5ö¶=nK¾µQ&ñ4aèÜ$PÑaJ ̉5@­Çzq–1Cx±*DZEÔoˆö°¢ó‰IA£³4Ïa9üđ»̀l]×}£â0æAĐI·O‡ ÎFÍ’s¥J)^F‹Ăà°M„H J‚ǼFäăyTơt:A²Ô5-ÚïbĂˆE’§„¬†aŸiçăƠøÁäp:»ÓÓ”ÉK[ ÷ø8ׂ́‘R­ă’ú6hàÑæ|ajxÏŒ₫ 6é£"ÖùÄ̃¥‡rXKѲ®k5áĐ{`ßÜ´Àr¯´dtÖ³LûÂèÀ9]÷F„]zè¡ßzCăï%×útä*¤¥h9O¶Ùù匱÷úªªúpzxûöm‘̣ùÓgŸE0Ư·)FøGư¨óÓ©z$û²%2l«uÀú‡ºŸ²·Ûʆ¢ >3zùH `hA‚à(?¾Oqÿ\Hµṃ%½êYÂ^Ü8Øđ‹­‚q?fŒ‘[zHP«ºµ¸çỈ5‹"jr™€›qü¸{J»ZúÔ'¨jÑmƯØ0`ÊŸË ̣öø'YUÁµúBäh•i<ôà-ËiYËåz©ûSç@å«7§Oîä̀÷Đ9B^£ פt}ÅŒ]̉Ưüjƒ#û²é)’Æ%¨%¼TZpŸjù$Û&¼·:D¾^¯üç?ªêËËKk-G{Î&É™B¬I±đ3‚çiëSÿ+ê/BÍe›Ù_›oxIô.ơåAh%R¶LĂWî' ô¼¶æ‘©P+½z1Ü̃’@\ [ 3úOà̃¿âl‰†ÈѹÂd•̣øøø₫·ÿPJùÓ¿₫éåüÂØÅWk<îi½ïûºÑ‚*jf×Ûơ ˆdÆqjÇOaBÁ†́QËuWNŸ1bÙ|}‘̀es;%Bt¡Ât†à±ü«Pºp=bnä;a'I‡à̀A:đNæÊ¼ŒJk~‹ƒ=ăÅe4Èđ LAlz*æ˜è$ÀMåö®€FÚ(4´wNkJ¬û"ˆf…Pग»—Ơ ‚E ‰IuHÑAâÖË‹Œ Mn-MºËår»ƯömgAeEáû ª¿…têƯà°êÓÚËvCNUQ÷3¼u_‚µ¦̃‰Ô¶È륤µ0"uX‰´BƠi9ñ³nP"¿ƒ ¬Ư•¼¬‰C¡©áÓGh;­ï¾ØÑɘ^:mw\·Ûír¹œ/g± i“²eYu%#"´Q+“d¶Û®¥I<­ P®ö#-§ÄăCTpé¥?¶PöwEˆk§ säH­øYCüC¹Om_<€ó}ûF-gÿéä_èw·ViÅå锥ÿ[37ª!Gª°YÈà}±¿oDç ß˾Û₫øøxz<­ëúáÇu_=‹·Û{ÅÿƠh́ÏE&Úii'²"àVP1̀I g¾~÷ơ›§7¿üüK3r±¦smBJÁU × E›fđ–™a¥Gº̉0áK†Q 0tÔ›xëµxm¦@„V¦˜ »̃mä¾ïŸ?nÓyöá̀YØ[2™ŒçqüÍפŒ\½ùß¿oàá¦#’̉ xuW&y@‡Ä•Ôóơóøđx¾÷Û$ÈfϾï,±hÏ(*Á`&¿-‹‘ O«rúơp8<½}RѲ·¸âµóŸ±ƒ&­>RƯ<«Üe¯åt„؇.±ÖÊËxOám2‡©·}Dđ+(•(Ik{öÙh́ZS2*ñéÜól|yă>.<:i0[Aü'«©q?p§ñ¨%-²/{·x*Ơÿ₫ưñt¼\/yƒáÿ•Y1Åz3»-ˆGB>"1K*58ơX?1±mß^_* #Ơ‘1, ᘟVàß´”§6ó̀ KŒ‘)Û3M9đ†K̉ƯC²„§##‚¼¹«¸3s¡ƯƯÊö@z/) ˜8’U¼vWb]?Ø]!I¢ÿS¤‡ºe¾·<àbb‰ü`ḥæK´æÏô¥b>À éßP¨Ûû¶_ÎÛ ~L̃Ü· Áº®ÏÏÏÛ¶]oW§EÉè¬çb+ÓßP»Py~®ơ™¢üû>_“ĐÚè·%tß‚×ư$ôŸL̀$ÊpsE#·ˆp\½+̉f^ù¸NÂưư)5WÛ>_^ơ_©äơG&ă~iơ¡¤@̉a găàøú“éA¢\GÖ·Ñ₫\}û"dXæG"̣ôôôƠ×_Ïç?ÜÀ¨h†@3±äÓÔ7mªO<Ê3zhPÖED‹>==½ưêíÇOó…{XHÂMØH˜ơ*:üx<><<ØnÏÏḮÀÊÄ%p¼/Í4°ĂI@é$EBÔNº?sf®¶ŒĐFÿ•ăaà04³J=8ơuo-!ÊŸUçÙSBơÆ[ùü9ÂA¥/™d,ßỚü  aU^YER*ơ7´0ú~¡Ó{»́§ÇÓm½ƯäæÜl¿°&PªèùzÆJ3‡’³t‘J ë“ük’̃mÛj€~ÜHÏïë½MC?µ wÛm3ï.*±¾DOê`~Ęc>?KÚđ‚LáQÑ0@Ló¨Ö… .J›lơMxèîï¡D@f Ùđ+$³¿µ6Å\­Ë0ºN"¢jOª-¢Ä}ƻ͛Äđ×:ă.X5mÛöËû_jâG2ZäÎg|”•“Hgm»mçíŒ̀bYékª™]¯×÷ïßoûV_`Ë‘\dQ˜ŸKô¤ZŸ0Æú!(Ȇ_9ú¿:dúwèoÙs Ao'ªơ£º?̀*úJ±7¸î dQ€₫GØÏ¢ BzøJ|N·øÛ;ø8MÂ+Œ¼r€&}ƠŸàiÉ7^póNœ́=/ *ffËq9.Çk¹ùá3 ïé ;́ñ Î×Á-éöŒ0vÇ+›]®—Ăù°̃ÖºˆÚ>ÜS‡ûD*ι³¸”R¾ưöÛ₫æ‡ëơúOÿôO•Øb¤¢íMt£„Ûb½LË 7:ES@H ]‘È Á‘/ÁFó¸Ëu†ÙéÏNsv§/X#Ù@øÏ¦¾h2 Å¿?æHœ&uYơ9^¿%hÇIJuo™Urù‰È¦R>ÊŒ×)ÅziˆÚàt²‡§§'U=_ÎXÍQØDgg« Ëgñ¡ÄqW Í́|>ÿñ,Ẓ™$muMY²Ea†0'M¡B".ÿ4‰|˜Xºz¢…ơ c\l“ô˜1¨GæíÚ£±`Óä u?EËQD́ÖL8¬A\íaˆà³@T´×øâ‘bkD®ulG¥P¢¡CZ¯»á½Ñƒ­±F6‹.!ïHy†×aÄèI­ÚöÍn9ÜÂÛ TưĂjd¤u²Z]ÍÿúA˜Í4Å̀¼JÄå@º)‹ÎY·5UTK$B+ ƯÇ0º'ĂnF…\–vXƯˆ2· æª©×æ&²åUsÛŸ¬å®â RĐ½\7¬ó½Ê¨ƯPÓ>“n¸† dpÏË÷¨ ĐBP «E«®×+S Ü{B®ÂäĂú„Ù Œ.ÿ\ÆFú^i•į¦̣RÚ4íU¼æO¨çĂV G³T&&-j¨óÖllÛṽÏuÖ1V«rÉ0ÎḳÄàŸ”Å WÀèhßûÖ`¨ôÏ'xD-!ZŸ"´Æ.°;ÑZˆƠ€₫CÄ÷è ư½ä?ˆrƯ$ÈqÑ̉ ₫”ĂRÚ&_@ÿÊ[ê‘E9a#&(>p Äx-íܧuŸQb¿0ç1ÿ™Jç]{óömBd¿uÜ¿G@4'ŸŸ×m=÷âY¼m0› Æ™»AÇ¥¶…ûc#áơκƯ¬©&û¾ÿüÓÏ¿ụ̈Kµl¡È|E¡'Ÿñ´GÇÊá?ÿçÿü¿ÿßÿ÷¿₫ơ/ÿüÇFtâJEµØ1!)·„ề"øê5l¹åÔ„4”-Ơ0§zûY2±“adâD~D‡EËĂĂĂ²,öÉÖmEc´§àëÉu%uXI@¿₫éÉ3o¯=,!Úd؇‰0sGƠ rÙB]₫'Æ"FIßh¼¥®y&¸¼÷ô@¬Í \¡ª¥QY×Ûæ¤‡º¹‚ÉTIÜ~†µ7 ³Y₫`p8m`‚F“¦™dj5È$\»%Iˆ́5›ÓcrÑ‹¸¹gºÎ̃ÛªÊÎ6  <^?VnĂđ.‰ÅHcärH–@X@c”f2&­söInÑ0'̣4k•¶ä¡G)b)‹ă+­;í*z<÷û߉Å íQ@’¢ÿcI™tCdæ¢{´ â5̃ê ZĂ+´ô°œú½¦ xơ}w^¿rüÛ]ce₫›![@ÿưæ«­5™ÑZI¡0ŒÀ \âSb™dÖÂ!Đđ‡R¸?%(¥R”R̉_ô¯…¹ÿĐ¾càº/[ ư¸Ÿ?¢’‚ºŒ¬‰ ₫¯g·̣©&í{À µù¹Ïn¨ ê,~=sß«p¾œ¯ëuÛ7'“úư—Àëçäcö2±ùA-—q°Z°fÏK¦™].î„9nă₫Ó₫̃é§Ç‡Ç7=óºä‹¨k&J-¾ƯHªå©ÊF)ËqY×µƠ¸€2"€ƠĐ¥“úê[´”"FJ°»eCăƠ§! Töi½öµgBÑÿàÔù¯|€đ”¬(È3…ª[àọ́CUî–Âä§Yæ₫§¯c²̃V́›̀Ñ]ömÛ¶}›‚¹üî31f­˜Ë/Âùƒs,Ô¾íaÜ«ºMrû…¼ß…%ÅrỊ—›À©aÓÜ´̀ûĐÈ{ư9"fb÷« ¥nđÔ–’~œ»´Ûr@c@H ¾K|ÔàéŸIEÀ®îĂ™Áœˆg–ï»Ç…':ÀûYĂƒïYûÿ1Ù ñ^I¡E85¾ăHNË=í-´M<˜aYd”–ey|z\–åÇ×ÛC¸p‚Ë©©^7ỳtêË/UỌ́ e@»ưúă£|ïLÍK…€f‘]hmbÄ%.%̃HÖCÏ{{¢ă±ƯÚ†ó‰; ÑưOh!`íLº¢. Âvo•Çexµ{Í€IĂS8˜‚½‡‹” uWiĐ¿΅"EåđpzPѶ/1óÊEÚ·r )tr9 ^đpS^ăneRä§…èT₫~ à̃¿lëü¿jÄH!Îh́û+CÖ/0Œœø§uŒ»t{‰¡<{QT²_è_Ä‘(|à₫œÜß̉KÛÉ÷̉|Sè?LÖ#¢Â¦I˜ ­Cç­Q`ăû«½w;w ¢*₫^Ÿ„4₫ùr~~~¾\.6–üï6ƒ;0ú·neWk!ư4GÿÁÚ‰½H'ˆL€×œW‹¹¿qúß]ò́—÷¿üó?ÿó¿ưÛ¿µ̣É:í+A˜\äC#ïÁD7`¨+x¶.Çåéé©n`>B‡ñªÚW—º Èét møduLÿä _¾#a²;:3JŒÿÇ]ŸFQh²Œk¤ j}n¥nùÂg<%QB÷nB½ª=åTD¶u»œ/ƠͽÁư–ư$2Á¾Óö„·»—…́Og…‡3aOmƒ{³`úƯÉ)™‰½¸O€Ÿ̃t ŸfQ&BqÖ ÷₫L?íë^c Y&ư»ú:ëC©₫å0W23bG÷WŒr•©Ç£;S»¢.ÇÓù5Ăă¡÷ÙÊăEmG!HámœñÁQèáË´±i:«·]V̉~Z£åÍă›wï̃ƠL›Ẁ́Ä»ÿ™(½éKơ“ê°̃~mœ=«½²ó‡ê&qM¥h¼yêá±%â±₫w¤bYy4æŒMé¼çk¸<cF_,ôö̀¤ü⪔Đ?ữ…|O<̣N3¿ Œ'=é®"@3»]®·Ûm ü41Ö!èŸ"₫ư j(xˆă-&³º8¶Û7Û̀̀ƒv`P²oûÓṾ7Ođ“eˆûÇ₫¾æ q¶ù)!¼G:AÅ|¡we¬̣Éÿ¦b¡—â÷{åÿñ_ úÇ_5Ù7ÿpÎàÑc₫<©ưÓH‹̉ÍmèüƯ£33¾Œ:Åù~óàûP¸ÓÂMđÁO÷æ Àù{¼CÊ讃¤³üẢƒơáOèl ce£`§à1ˆ “¾½è8± @¼“gm₫Ó̃ï8]×ø‡ÿ÷ÿøÿƯv»­7÷Ú àϘëÔ Ú TNnÓ6ÔyÑ`_ч‡‡·oß>??›²óÂdFüôÂ+o¿ùú›Ëår¹\X¨¦8uNV ¾¼låJ™«mÆÈ2VơR Ó÷©0[BÚqë.;uDƠn¢PƒÏpX§‚bZ]Èïa‡ỮÛêRD ? ¯¯Ó%Í05]«3µ !sià–jWÔXÊ^ß±·ÂÙ}!°°$„6ËG. ¾î7̃oƯ…—X­¡r}:1gŒ>‡”úS‰•‚ßx.Ô)éˆ])vH%DG0Ù>ŸëÖ˜~Èa߸½´…îb<¡ ̃€¯™ …r yh í₫s5FåSáYBA²C˜û‡ MRéw,¤ÁªÊPGGÄ̀ÁâƯÂ|Ü<}Ơ(¢fûÔ£6»|Jóƒñàîû¾­[j\P§QJÁ́ºèưP7©s™Đsh'$3Àá®àGÔ₫â¢Î1•eYTu[7 ±’7C§₫ºë ÈŒø¤cù„ÓŸÆb¤ÀñoÅuhEÁ₫¸œ·§C^à ±>‰1>hø̉»û”̣|!#¯E^ăB–*ÿåÛ×à¢îĂ·edbûºxÿ«–23J.C mÿ.½L Ô÷<̣5ÂAôN¨¿nÆơy*|G±ÿ¶Å/Â{lEYOû±m5Ê÷Ejüï}—_ë;Èæj—vêö¥ºÏf~Ç€ÔÙ‹*•úQ Ü¿t´‘¬,qÿˆü•ôâ¿æ₫º—†÷ú-­øghÀ9p?Ù!ĐƯ+~3~mÛÁdƠ¡¼Ø\-“nÁÛ…ÙÇ:Jæ÷óZ34Ÿæxqœ}t`[·>¾,/·ơ†z,BŸG“ÿ (³·AS0Øl̃9²Œ́Œty—ƠjWÔA¬' ˜¸:kÚ±¯ƒä½acØ[ÈO7å­¬ oN ac ơóưd̉>@½`„_ư]IoÓ’ê$Ú!˜n~ˆwBÜlHăÅÙB zEăkl°4&©cé0qưf̉Í€ºéX̀hE.øårU•…‹NzÄ?•ŸçR6à½"“Å;=¯=b›m€°#¯­-Xkp?ëo뺭ơd4×ô}¾„BŒ(ÖH’óNÂ<¯2×–‚&@̉₫'‡́R Ơÿ‘€ø59[È®îU¨q>‹.ØĂË·ôªÆ€°?ƒÿ+93ØÍiÏÅ—´Êbồ6EjyS̃ÍWº«‘+º¯[ÚW—§vt÷M›»er‹è· I¦ZñÎ[0̃hv&"¬ÆóèƯ›¼rg+¥Èî•CDE|ơö«7oŸ¶uư Z¢^ïÜY= â^*ÁA9=œå°mÛz[¹‡™ÛûÂXL…!Œ¶)—8£CvßˆĐ†•u~/Ër:–ei…­wK"÷ÚGs솰i^h˜ơÇ^`L~k_³÷Í9#ơ³à_¢ç T´Q́x¸ÓlPœ ™<Á_Z² ³HXN>IàË£ÇÅÍơ4†7”–0ÖƠ²ï·ơVÓ¨H†ñø§·™Cç!ÁÜ!½,˜fï#b’¦êiéO^²±¸§ĐF`&¦¶m›¹ /7*ˆGĂlöóHYœ/́DJ«at´{ƼO,€qïó/­G|>«z6Ñx/ ăå-·á§{ ÖØ„(`¼,"p=￟Yy“V tßE¤•‰ ©1<=™#Öơ ½ñF¿Àp¾×oÑoÑ;»ï̀ƠHưÍwơÊ¥~̀£ƒPâ³f)ïÛ¾ßúnb@ÿ̉ªä*b(Àc L¼/âÉÆ̃¤f̃½%ư₫©‡ñS+îYÂ_m‰ô¿PÀOOń~ù¢ƒx́đ‚lD‹ƠSP¤öö=¶<ë·ïíÛÄ £ûâé§@̉¯™jwÖIÎô…Pµ¶YCù°jgtœ̀‘,¸§Ü—AO%=’~ª#]é5\M•´eYDäv»½¶ˆˆ\Wât]d´Ô.15±}ß[öº‹wH"‹=ˆ)öüü\+¥ËG†Vʦ+•üÈtMx8“aXNh³+,÷ô@§ÿ1/¼%4À½j¤dë9¼|Ø̀á¾->G—fja‡$­Üç#ùW…”­ˆ–CÍi¹^¯·Û­™Ii¼‘vµ2öô¼–|Eü ªÇo";JÖlÂ=8è÷EÙ!f‘±;zeIÚnBˆ†Ç³ÍiT@l*=öLP>Cíă ³löë€Ởwï¨è”ăzơ¥$Á÷±ñàÈn̉ÙHÀ}4êvƒ— -·Ê9u&w†ÈÉÆñĂT ùàLV4ëØ±yØ÷uét†&*j₫RSQPï¨é‚åú‡{Ụ̂¨±ˆÖ r&¦û@X¨›$¬óư§-ÄèOEf“¡§̉åˆÚüYü:áA­`E"£'Á(¢²€„öh*ü¯¢­¸'Eª(èÍ d‚7/ ¹{µ&₫Í »qÅ÷ø~óêŸHvc ›m¢̣đæa9.çËùåư ?n³Íjµ¾‰Ơ^à¾Đ/‘₫Ǫç ~ “È÷ă_.¢ª*¼C´ç₫jßÙ—©}ñ̉LÈ À=sơ!j9A'Tüä* L[Ơp(8‹<½1/ơ“¡9Bqöp¾QÏ=ÿu8Ùzúx~¢ÄŸzª[ÆÛ`w0mEẀ‚ª2Ú£ơW^€ Ơ[̀‘å?9%êk€Q<€ '•È4±å´<==-¿ụ̈ #uÆ=¬sàßÄØ&g­_;Ùöí|>».b*jÂ@í™–Ÿ „ÿTŸŸÏç3xGÏ#†cÏá”":L´s"m™Â‚Ÿ”5;­Lh!~e³fX¸UwËøÂ á¡–PkûC~µÎ@ŸÁV^9@́1?tÇ­$ˆ1 xç°Ï4– 3ûơ×_??~yyÉ¡ªôLMråƯÈüB¾7õ¼ûêª~úô ‹=›s>/˜ ™a`Xƽ2Đƒ•K,9† ¯áîj«ơI냖ăéøđøp[o®µƒÄZbœe#[iÎV6-Ư¿×xöREƠÔ¹ÿ®Ï‹–Jæµ en9AƱ ‹§`eö©—̃Ř́näó™…ª1Û¤k]ß²yƒ‘X¼yLüÓwןq ;ÇL¥%‹̃hê‹,À@Ê0æ Àw¬Dp8­ùÏSÜIôI0đarÓ% ¯ûº^à´ö¼í™8 ·uêä€áóñ²x­W°•–fʃ̀ ÷;uï%ÎO,Ï(xШô`'×kă^/ Q‚ơ„RjzØ*kE.NT;Ë5Û·X1;F„†NpÉa…;~ÂPá*p(t-Ú–mƒâåœ̣Œ®€"¥à8È©¨€ûü€ß ´ ë_₫̉FboQ̉éÿ₫±ïœcJvî×ÿS£ü7ÏöÚ ½œª4đÓÛ'-z¹]<"¨ZJê/9ƒNaÄÚ«d2[ßl¤î#¡U)edJQ.5¼5ëw‘»ù:ô×^î³É*~+Fÿ́¬đ £D^ÉçBœm]Q•"0ÛŒ"p˜Â÷ú)æß€{ĂëѨÀÖ É¢đ*@dc„µªj«iû"®sIŒñSÀôl™ 0 [/¸ƒ_Ø‹ ³í„ờŸ84tzdÍûZĐóX’ïm’̀ÏQrC(¬^YÓI÷₫«7»¾Ø„V‘:‚€¿Ë²,˲­Û¶oÉ h'¹đ 8 h„r4>0‚fÂÉúѪ™{Ÿ¹}³p" ±S‹‚•o¤ÿÙØK#%} ¦#C̉=à³€9ºÈ)2z°A X¯J5‹tZĂD‚̉̀>~ú¨ªÛ¶µ;s@­†%*`k™t:çv»]¯×mÛ ê#§˜&ŕL¹Cˆ„K#é±tó4;F¨£}·–7¬ªë¶^ΗmßW“R€'°ÊZ¡ÁIN˜p fXçó*âç̃fÉl}Kk€˜4‘Y‚¤»‡îM -ơ°CÿÈ5°RƠaVøl툇gŸ+@vÙ~6÷0F¾ˆˆÈËË˶m·ËḿÀ»â5œuøư«’t ˜ÿj9ẁ$̉•Ú¶nÏççĂu¹­W6ơñúÖ0Ö÷Ô…/çäàbˆĂ •—‚!¿ăe¯Ü ÿÅ£+ê[‰Dc8y¦‘Â`ÙƯ«Bw±áG(*w8©h~!e€ø­&âŒ;é‘‘¡GăZưv8åÎJøíÿ uT¿ùúÛÇÇÓz»ưøăOă\ØH‹Ï¶1§°x¡-$¸Yđ¬@#2{#»„&c¬D´NM:=_5L±Î…ûƒXû©„·à=–ß:x‰´Êă›d|Ù( i¹„ÍđF8ˆnIÆ0y½•]ẃ$¸Ô¨q@R.ïĂ9ÈÍâÈ“Ö{‘â?ưV Ư=ĐÿÙç¶?Êûl«½Â×ưôƯúÅäÓçO×íúùü¹:ÜƯ¤(,EL™đk:á‡uŸ L¦itÊ_ø§¶åBeưyϯ¾íW÷ḉ¢ƒ(ư× E|z÷éóåP|ykºí! ·1ñÄ÷c]t¾|Øê‹ ÿĂ€€¬›áéïÇeç› %‘ÜS~ëUătzícñ»Î&Û8'G“ID›£„4uqó¦¬j]íñ)áÚèå5’ïæ_†©1̃Ä›m3sqØ̃%|ê0®ëzo…–Îü¥e[M;₫5r3°i6ïÛÅÚÂÙN„Ô'‡Ăát<©è¶nAitQ$6ơFû¤3 Ă*Ç;‘ cGăM4́l€,á´º ©̃^KÆB(æ¿2µÙs¸kqÎç!5³—óËå|iµk^ưÜ[ 3\‹?~Ï6À4t ©AŒà¶oûe½²LÚrqöfJ9RÇ&Ăc¡=!¸₫V¤´½ăÆĂÚàq2Öb3‘# q&̣Ä´ [d:£û™Nj¦±¤kdg' ›¡Éök‰1ë3ÄTn®w–}uɸ‡Sù*†PïôĂÊYÈ6¶X@›Ù¶¯û¾́ư)AóaqR’Ă*,7"|‚27KiŸ;„7åĐֹ͑ B %b_%ëÚĘ×>,©ûÖ  Çh¥ö¤4›;̀…;ÆẸ̈4ïÏ=“—Ë»̀IBe¯jän hwP úYư}Aˆ¿¦huUQ̣¨²_^º{TÛ^æVre˜°Ë/ đÛÎQûµ’O"₫+úoỵ̈^¨ jîH7ÿËáªÿbA”áñA%¬€èa[;ÄBb¿®ÊWáÈHĂăÏ¢mÇ_Dü®åMJp´û”ù“ïLj₫A‡sôrQ̀̀°#o•'K‘÷ñ‡¡ß{èW¯ù“í#iÁÁ=ÿ"¼noDKĂb5RŸ]́³Vål„ª|u¥Zƒ8[é¸tîsIPé†éö€“v±à=+\Ö5ơi›9M aâïYQ̣­©Ü~¤TCr´BŒ úÑl@ä&Ö“®„–[3[·Ơơ]‚}!ªªË²¨èº­̀Ù$tb̉¤Úm"b}·̣:µûÖªŒÂ™vbƯêAUEŸ¾ưæ[1ùË¿ÿ¥J ưf“Him(ỶÖ"~ɰ~${iẪi³»í!í§{€6y°¾3Ƹ´`¸ÓèC'H\´6Ơ7%æ¯u•I9ykS3«›EŒáÔ5ZDCœVâi‘x—?¹¨t4™ ¯ß‘‚‚a„£P<± ,†h̃±1Èa½*;¬f₫]S ô2 ¶è¤œp̀D‘º¤₫ĪÇÊ*Ñù₫:¬¸h©Å}²´«¤¡̉Å[H›%#û —‡<ÛÚ„ÆT%Ư?1Ç~Ơ,|_{`Œ7ƒ̃5^ëJ]p½­AQûŒ&GÓÔ°mÛ¿ÿû¿=<<>?æUƵÂXjḈ¥Óu8¶H¯À”¨ Rµv;T‚Á¸OåM5AxSÏçŸ\b÷J!̀dA`|&‰´Zºx_~:Ë¿lhy¶s»{!Öx%Á"HÀ¶Y™äÿ·₫«FÁÓ$q2-P™₫ïE°ÅƠ1" à­Ê¹¦í&†p«ù¾ûˆçâi+ßöEü§´Å/‚Â+Ö¬ÿøS$ÉkIHtf¾ydî_€sZ„•ûl@=â?azÇưÔ¶Ë‘ ¿øBn&6hD„ ½™t́.¶Ë6î óS¸?Àúï.N0!èßÑ<›”lđ\9ß—l ¸&XƯ@Q2fË‡Ó øWF./¾ˆ§àG'‰»Ù)h¨n’%…è7t%ƠeâQÿF29À4ØÉ)̃½3ß®ö̀]ª¸ÏZ¸©WÔd %S¯ÂÎ “eoÀÍl®Ô…£wJ)ï¾z÷îƯ»}Ûùù—ơÇùL! Nü‡‡‡§§§ơ¶6‹¢3»˜̣½W|ê¥̣F̉RñH#› K¼c›*­'ñ]m£Ï>pUïU¹¯Á?¼éy¢[g@%2ä ¬2ÊËt”,yˆx1JåѰn3!=X“fG<½ñ-¬o(Cê¿6yNơ(ó ĂtU`ÙGé% ˆr°wyÚIu÷YV©h°+¤¹wûdåàX}f vY³+ˆâm0Âp{Ç‚1o'Tªz8ö}ß¶o…^b÷…¯YQă¹ê&1Eq§ÀÓùsKÉ\¥'Jª»•Ă%ÑPoX- QZ~QW½?ưüÓá°́uë :Çơwi v³›Ø+ă`ÁÅ*xS‰̣‡¦w'Cˆ§Ô&.ôéĂöỵ¹ơŒ)¶í1p>Äf¾û–] ?±¾̣?Ù,̉Óyâ')̣¹)d¬j₫‰ƠW»¤£X4Åơf:¶®oÑ-@hÅ p—a{¯ĐAT)ÜZ¡4©ĐiôßR~Qús'R_„̉₫í‹´/œ'°Ư€Wa÷(%6¡"#ˆÏq¼:°®¦ÊH*ÊéïѽùH3JY¤íù…è/ó ñ/9ô¿—ùŸ$sKÈ#8~¾'}ÀëK¬Ç—:±±Ă»}qj¯tX 9‰ZE ½Vl³4¬ÿ”L…î é˜_Œ¢ŒĐà<Ơ~£¸½@—G’¬ë:í´ùƒèï¤AXéLd2¹N®bsnö+ß!á¿DÔá`#¹#̣N*Â(ÜB˜6¦û0\c†·¨k؈‰CëîßO TJ)ï̃½ûÛ¿ưĂååüëû_k0Ût2@ßo»®Ûù|Fül ¬Uéüö6̀\f1Äă"}›°/Œ¯ˆô<́Đ˜± Óëq~Yä{´.×IWỶ,ö,BÀÄB¬äO?F€:g̣¦tÏ`„—ÖĂlCøF.3Ët”M̀ß+ÍÆú_)¸?1úJY ÿÙ0fëk̉‹L¤.ök@{ósÈUâ¨M.£¤c̀́p8T½Ê·`QpƯŒưßÈî·öËâ₫Úç/å^÷øÉ6œfó üL›¯ÜŒ¡/—K)·z77Ç/̉~íƯ9Q2÷'̀•.óIcíƒÍ·Â„F¯́öŒètóôwsw¬„Fn·ăñ¸,Ënûù|æDôgö?¨g8ꢆ̉('ªôÑʪ€V„¬ÊH3db‹:}’¿Ư«ª1h FVÀÊ ©)tä /Ùa™H@ÿm{/ñỆÛÓy=¯7ṃµùn_áËæ©À¨Gø”ơ;j4¦½ƒœ%̃NTÔsgq2í¼ón°z^¯Ög¤Î^—̣«”̣+ß_ÓrÙÉ{~ÁüÀq·û™N‹Ü¼®Đ»MŸÑ¿™ôÙĂ^¼$NÉïd€D·¼{—̉₫d_PæßB®0› FU>јq~&ô?·ÄöÇ•CY–å°’a¯ÂO³` ¸«ùM̉Ñ„cœïœừ&áñơ»¥s¢_Ö§ƒ¼¨ñ'P¾kØĂáPw6à7ª?“Ê."t+¶»î™C¬–Óéôôôtzx`ØœWV·ñê/—˯ïưôñ«Ñ¦!Æ›­’Us}e¿ùoÇ"ΟµB¦áV¾̀]Ê:ŸưĂË.yưY'ß]\^é‰ Ö̉ô}ú<,y”̣œN(Vƒ|ŸÑjêêKcơø̃i£̃½Ê£—-áeNûw¢´&-‰ợüze,f4yb¦['›w¯kf›uc¼tbƠ}bvOP'îôüÂd!¤aíƯ;ö|~ÁÑ5ªÆŒ®ëgN§7õ<½ybí䨌x^xÏIÑïăÄÖTQƯ›Ü˜̀äe}Ö‡“•×Â¥ă ÷>íMøU’®PÑE{@‹ôZ1B₫_é^ƒđ,On)NC ›û"è—¾Y/áuñ]~{ôÎ Àn_̉ĂÊaÂÉVË6g¿0¡yå>a¶Âc dè%'×¹˜ÿZ4Eæ$VOTU/ö_–ư+ñ_†ˆÿÑ#Æ_'ơ¼$hĐ ,ñ†€^ØP4À†h{Àú¸0Đÿ¤"ä0ÊqÿưÎ|¹_•>” ¼Cđ0'…W,¥e)º!ươäC9Ç-“LÍdWL ]a‚¤Ÿƒ5Ûà3¥xG¶à-†Œà/éF- j:ù€÷¼û^µG·£÷TC<7’|Æ=*ºm›¿¬yQÂ)~U‰á4SbUüAUà÷}~~yÿË/çó… ¬AE¨I9”å°ÊÛơºƯVL^)¥µ¶«b½Öº÷6¹q¸Áo—e¹^®///é…™ Œ#r̃ñ^œôơ[%3©ôÊ êÀs¤÷ ¡`ơµ̀–ñ˜ºm0dÅùÊ"ÎSjT!ë—GDÅ3%¼Qj3'MÂ%b•ƯG»íU¯Vư ½"JûsÈ0Ầß´åÅ% –˜ïD:bàÚûs ¥Sû¾xơ#øµ%U3œø¿ÎéÂRmfO_ñ'|„äÜHp^yˆ iVVÿ×_™ög­T§RsÆ€fG¤_•#aîé¸ö ~I€!âW‹œ7w#ŸÖ¦Æ`6ó^ơADS’O@¼bÂơŒTé10xµö‚Q·…ö›hQb…U¿ăAbSÈp[¤(ôŸgMÔPZgŒÍ­ ûñga¬É´vï; ÍJ)Ë²Ôæmº¹§‚H}÷< xå¾±€wlâ›úU@D̃çiß `VcÑøQ¹ë‡ j°c7¨}z´Cɾ H >±ï˜ÈQ\’[B'eiCÖ "û½RgÚâ·{ZüÇưÛfbËiYỆùùóXđg“­&€¢("‚Xª2 «¢Ă¸\Ô3€E…!¾ôe¼¾›Äô‡«¤ŒyĂ*Zá₫̉£°jÑÏLX?lûƠo’¶+“̣CÙØ frùMäṂXÀƯR~û賑­ÇRäüPEÿ½ü¿‡í–ă‹È́äq“ĐB5[̃T‚¼µJL€5»¢(K&?ÅA8pXOè°i‘*3Zôr½ ̃¥Ưp§d€üÔwxÀª-"m[¥₫îû¾ßÖ[UƒPơTMÓ¿×!›J"']AđpÍæA·QH˜k‰0}(«¨´J‘jL¢Â9ÆU¿zoûè[È0&âTGád®„œfè ó:Ü'êÊ–@ªÏ‹,Ï#W˜$3̀¸̉MđSx_•Ăá°½Ưñ@Q© å’đ8íâ¼]#cqéëuÇêưĂ_¸å i³†¦®e€'8Kú!¶̃Ö‹^’!‡óyĐmtÔ°(í¯—–W1Û2eư„±ñéCo°b?Yjù59è­Vè̀̃´%üt5–æ11€₫+̉Ró­ú₫Mî?-I7•ñéEư›a°m«43àñéñ«¯¿:/ÿú²]{Đ¿ôÄß=$4ôÄ¿f“€)W‘ưs¤>A­½S/ »%Đ—j8¢”ª}<=N§}ßÏçs½mKö•êÿÔT`Lå>ó¿B~€ø^<|nä¯gfu’¡€EưkäƯû{P+ÜYOßưd60‚]Á.Kº•› "R)|Ù‘?*´¯7­H¤üÓ̀t,¿ßp6ö}¿Ưnü^̃]ƒ_{\̀FߘLGdJ ¤!s¾Û#v÷’YHÀä́Ø$3[–å¿ÿĂu½~úđév½áBÇѪ–ܶ­)MºmZדI?ν6'½]÷mo³sÂÂFü”†́ursn¦Ød˜4|I<\x/çxM ›µG H}‚3Ÿn·ÛËË ›jµÇÓñíÛ·Ûºưø×u&m©%ÀưC£ưß´ 1èß²Wد™¸¾>/\̉XŒ—Ӥ臶êÑ™Öä…ö†n—RN§SYÊåz™t@D9•×gêAúÍÈ,ñ>ªúøđXëoû†Ë„í„N7²2œC–¡Ë2ê&AA0åÄÅ*¡hù½†9ÖD@ø 7I*…z/Z‡_ó~Ù'ă§hi‹&­̀àN§s~¢Mp"t˜î…üU½Ưn–̣Ô{/¥ ØẠ̀¿F®]ïRú"-Ô¢&u¡d'ë·̃"“I4tCÎ?âNƒ^]oë¾í‰lâ ;\æ™è‡„ơ“ dß ÇOưCođ̣*ÉËt§¯÷›e¥ú9’àơª2 ûù̉§ÖEƯkï!mÛƯÏ_8¬ßcúÓñ~₫ÓWO¿ÿÛßÿ₫¿_ ÂưĂ^Âæv…gư’+0-₫'ôï’%Àt`¥ù™¯'p”?ñíß<~ươ×_½ư|«öCơ₫±@.ç‡̉†_N(úÁ>”`#^j:ñ'iM¡xHùM‘9©hUä¾ëÖ¾K Hèơaư¶ÍLØèwWRkÀz£ª£Y±Y›æ&iS$÷Q•̀:'¬‘hó¾¯ëº®+ÏÏô/[8 êlǜ•EÔơ‚qÔ ¨Ó[Œ÷̀V |#Ñl˜4€ï3´üt:ư×ÿÛư»ÿøwOOO#q[“±}ßÖm]W =4'ÿ\{FF*¼ˆcF7K¹éÓL«ºl Çă#ö}ÏÛ2° ›® fr[o×ëuƯÖô¯“Æk2¢CGƠ—­ €ª_µ­¾7âDÉă“[yµ× È ¯Ăsfc0>´ư÷úÀÍ:çØ4ïÎÙ×ZC^Í8+³0ÇOYʲ,£K#½>ă`íçÜŸNÛ 1 5ɤƠ¬B'w±9 Ÿ ½gÎĂà>ThXSîwѤIéäÈDØàóŸ¢öÎK/[ư¤¥æÉ覂ԗ±zŸ(È ?́́JΙ0.3™O¬ó¤g¬{³‡÷J=D4nP8F+-jé]±œáÇRÊr\ÊRX& ª;-:ƒ˜h¹!ú¥~¶}»̃®×ë5êD<±©ŒˆtçÀœ̃µ{Ÿ9´ˆ/›ÉĐɯzƠl¸ÛœÉ dø,‚gFḶrî²·¢Â5́gp ḲƒøÏ&y0‚¼ íÛ¾iѯ̃}ơĂ„øs´O»³l›m2.̉C!ƠLù«Âe²ßă°‡. &h JEËq9Gé{8×° đôPoU¿hÏàư¼Æ*@*½ül ÖŒ0†¸Û&g=àG{ô'|‚Ê…‚ïư-÷t?•C9ë¶ÚÚá¦Å/ñ¶ù_‹&Gư…‚”&÷©K»’Ơ‰æ&k̉‘[T‘˜«BÂà–'˜¦©̃Ø;ºa†ïä  ‰ŸœW‹¥åF[.ÄÛ× ”̉.5ÊE@C¦ÚH̉àßÚŒC9<><₫ƯßưÇ_ưđÓ?}úøÉ£bˆ­D^Ó̀Öuå©ÊN-‹ÎÑΩŒG0A[=qơqAø5ÏèGEÄ…ênûº®*z(‡©UƠƠr(‡¤d² ç ™]ÎUO{Hw®¬XKk¹K >b>~üø̣̣²nëơvm§uOÂnûËËËÛÛ¾5r³ó´b₫å»ps&Ú!ªhŒº^RăTY> Ó1³%y«ÀGRơ¥tc ÷Øz káAdz|j¥}¸‹¿Ä|f†{½­ÍM½ Ñ¢6-díe©°Ä€%5­ÑØ5F)\ "„©Ñế HL§¦] £å#½'z‰][É_—\ Âäëđ\á(ˆ(„AÆH¡a¥ËcJg²6̉`&V@Ïkæ)&P<]È]íĐ”l ”ºïy= ÷Çjân™d«›7~äqqÜ8Öœ`[e©|3–qs4rÅhÛ–Ăí«º‚—RÚ”̣”F«Ơ€øí«pX˲ԽĂ[‡$gB ôÊ⽃©mܼ7ÿ“';˪)KÏj€Ư‚H6¾\ïÅá›+)™̀‚Q\¥ù$N —͆uJ€°LîP“%34:4‘cÁ» ój0{Ù -~C2. ?eñ®ÛZ³î¿îk %ª¢V3€e—óåüáă‡u[_Î/•lkĐ_|ó¯`iІ–$)¡–ü/%„ÿå.Á?ư¤—Îư7[Båv½}₫ôy½­ªZÓ|—²,eA±ÿú¯rq¡º706úw₫êGuc#•Đ!£.زêz3̀C¡%mñNŸs‰'‰¼;;³u;b̃¶Í„îpåç*₫nåÿQ¢° í Fw®?±ªek¯ß¨PàczÖ8đ…̀[#ûEw ™²˜ä|äÖ8+@BCo¸To°2x0³Ê92íU×¾P´TÛƒ‹ûe´J2ßw4ñïƠ‘ ÑŒ'_"7ƒ‡=ø ÖpóÚ¶ *ăœåˆ¹ ®æÄƯ ÇÉ•ä6¨ÙHé:ú;»f0ܵ3>c®|ÍƯvµ)€}mû'‘€û£¿ï5UÿC]Ù×­¥TĂ@UËRd•msGÁûï÷?í×ëơùå1?iÓßM¶Ê_Ă^TῃÓMú…<]‡>\Ö³ÊÁ¸!§ÔÖ¸ ¢×˵Æ,º Đß¿ ₫‡Ë}*üOCüh4^…¢’(œ‰_<|S{‹m¹°tNa6f¡(DỪêRT·Æœa¼âßÍ]¨ ÄÓ¿Uoú¦Â²CMï€½Éøu¯\̉§üâÉ Jómâßp„v”O´„ßTât¯Ñ+c·‰t§©f°,ö|ß'wc¢pv<ɘª.ăSĂ(¡ÇÁ\ư¨ÿ¬ÏĐ?ÔïµüW[‘\e9.Ëq‘«pæÀÇÏ‘KPá–†í÷_\&Ø5Œ¥‚—aüZ«Ø̣b¯́è§|ÙOª|Æ̉œB僤‡ rQÿVđG=¨jư‘?~>mĐ–‹ưÇz Án!#aªX*qt‡₫)¼_è{̃‹—£óS|?Ÿ@A á₫1Ẫ¨²gûIç1 lü˜Éª©Ë-O^,iÚ¸̣M–R·OÇÓr\Llư´:RQ*Öƒ(\ ÍBcY³@C+¥F$q׈ÿœ-w§§)“îJÔkđœ^o×ûóŸ!{¡ $7ÉÍ•Ï_&̃D́oưóp81Ùl£5”ƒfµàV=H¢­4̃‡úÇŒª[*¦ß€¯ ưÄHë5ûÛ9JA2é+w7tا"ÄTŒ4’L(¡Ú9oß¾]˶mç—3n…›`jP¢™qÎ1 ưé'0I°MƯcæÓGƒ1‹Đ¼=Nû!̀C½ÖCÑZô3D4¸æùSÊÓƠ ¡Ö*8cÁ$¥ôi “¦}qĐ—r@Ù&}Bâ5Å$éM™¸ônͶçX2†YxŒª#Tïd@CÜͲK h ­ébÉë]n<=Ñ2™Ar"³ă“ƒZ%´§«f'†Q„OđÜ2*cÜ/ẠƯ¤bê®P#É-Đä¼4ÀúđŸSwđrjF£µ÷å ×´eË­WŸ•d˜–Ăa9x©=Êf™È¤ø‹°ŒI +J€­úÖø̉D‹Ïu‰[nOmHï@–º(®ØqO¶æVT­ë5Ñï™è6¶íù<Ŭ†¥¸½̃8ª2á0Œ`Ц¿5è°Uæ¡Üß°w/̉p°:t·›]÷ëççÏ—Û÷árŸ@~HànHs,̉ưn `ï³v°t ]ôÑ>q.©å>y#0ÆâĐ¹Wû)øëÀÓ{ Đrp€§èHJö‚ôˆ°‚%_ÓÇ}æĂđst.^p‰ËígûL ñÚ |•oè¶g[b’Àµÿg†ïù%2[-X¼ăÛá˜áEf´¥ˆ<¾yüꫯÖ}ưô铟Ütz¿,}êù>X6¡Ï%³% AƒđZ’U­ĂëXÖ¤>•$B|« 탷HïÆ'0o¡Ÿƒ±1ªÔê` ç$ˆy¬mƯ*]…àF”’~À¤!Ö¯@½‘b[4ce,ƒ"rÛo¢r¹]ª×>mï…rƠđ…L·LƯđ¯ß1%Øœ­&Eùá₫̉îÏAù!:ŸT+¦÷¾zÿđ£wbưû=sđáûTú3­Sê)ăef`¡Zv‡yp• 6Ù€zABˆ0è7ú!₫¼‡´Ä¤^˜=̃Œ1M@íư?…>AáJî‡9²OË=üT÷÷Ùo^ä4¯âQ4Y‡&b̉›Ä_2¢·ƠpsVô2|̉¯®;º²ÂĂäÜhÖ/¢rï´ùµu?/ºU™Ơäo4Ö6dŸªz‘Íá̀¦‚Ëü'çY;F×1^hô¡1[Mí™[qĂëé0Àiø¢¸ÉétúꫯĹåü2 ^û¨FüclèPî÷gŒg°Ư®×ëªkÇ&èDú¼»tđ¿ÏÏÇëß;tߟ ÷I«fÂ"­Û 6ù!¨”ІÈlXGÈ2ʃ̃í æU5çvàœN+ªé¡–eÙe¿\.¶é¡Ap/$“» ŒB¢®¹¦™Îû?˜a÷7<_“† ŒÅ=5>ÜḈă,ÆaMÚ“/}ü¶wÎeÂ8ü9u†X^³˜èI²¶âµ~ÜŸDöáN\@÷¡đ%Â\‰ÓJ"ŸÜt0ăC³MTu]×¶æÇŸ¸ß¼èxc^(Axñˆt'†¿¾dµ1 Íü‰q²©#YÍ ‡Ü&"̣ºBă^ ókff]R³ÄªÓYÛn«YÖÂrx£_Ù* çM¾<âŸ#‚¸*è¾ƠôĐͶu][aŸXîÓd[ÍLå~Ïk3Y¢HÉåQ›U‡¼®X)Ê_:3¡Tø»‡¦Bû̉} À ͺR+ü´~åP«µ» àLÜê+›Ư €UẠ̀Á0…=MA¦y gÊ‚Ơ+£CơưØ3â0Ưz̉0›| #is̃<›Ùèi |+L'¶1‚H zÚîEÿzÄÆ₫±ZƠt9hÑu[ë+·Ûíùùù¶̃Ñâ‹Üd•ŸáđœO\»r½E›¨₫À2ƬÅđâ“Vk’ŸnDœÓ+ø g•Î$*¸~©j ÔAaÄÑÔ™"¶¹~§Ï¶m¨ÑÙ¿æ3'˜~ªlơƠ?éVv…wÁâ]!X¢]!Aƒ“\©êñx|ûöm­Àü¥8r’®V¤%…)÷B~'‡wÛ__̀́v»%*ÔW\m‘?ûĐĂÓn€'{*<á'½{sØƠ~ëaÏ©QPfx€€₫™`ƒé^ 7¬‘äN'“Àúh1‡À¾pXÎƯp̀½v‡̉¡̃<½‘Ûí¶í ÀÈ|{÷Îüœ±¥v÷dr˜Œçs¤³û““m6CYsô¤+\aQèƒr§‘%FË"ῚÜÇ–g剺¥C­§đrGá“ áKÖ 'H©hJ•aɃídXk ñ«†TäÆdqf'Ưº­û¶O¸’ºdYq‡ÏB“1Đf"mØÇ–¶WÍÍ€Xv)_(“ºŒiPcçç·†q‹-ờ—–ôYpÓ$âøÓó#»ª.Ç¥]ív¾5hnưo²§ư¿̉Áz¤… ơÚÿø— Ƹ¡ơD̃5 sƠåĐªnk/‹¦RU¥‡éă_Ôlqÿ`#ƯÈ'wb^%©:ñONÏ÷ƠÛ£)â_JmçK#:å딉@M0 ơÑâ—tă§Å=ùϰ% xh>đô»ád´•›œràa?© ¨A€ŚEƒ‚´#çëm÷ç̣,pE,̣øđøîëwŸŸ?ÿơ¯“OŸ>}üøwv½ƒ x²r̉[W·TÂH‘eŸĐ|Ö>är¬Å”#hï9,`Àp6h@Nˆ£c]Ă L^Vû[)åPUơåù¥[³6‘1ơV00UmRôV×ăL!¨ÄF—ºQ/>"~ë0ơø4ĐĐø^<î`@‡¾‡Añù‹ESeƯÖmk»lb§<uÍ)Ǿ¦û;‰–RJ)uă3'em”kxÿP{í–Ûí`4¢}÷rj¦µ‡ŸÛƠ”ǽöäÄ–€HhD9QxBáT)‡¢ªûÖ÷”L;Ñå½@$ƒ[; ;‰Ñ†>"€Ö6¤Äø;›Böxgâ\J)Çåë=ăKF~̉+WÂl­%›¡ºX]hcç`¡ña¥WóKæÚ̀F~OĂÀOR!n¡èÆ…ö°‰‹ƠÁQWdm¼†¦ƒ¼qÛÉ&ŸÛ²1q0‹ !+ƒU飉q™:‘4ˆ–®æ6å2±2wZ­Úù}gwCu°Ü ,‹:ëĂ Ö¾˜X«C˜e€høäIcêĂ)®bûdß¶”øÂ²Sö1bPGàáNÄzÏäY3Î)ªYäoÂkô „i¥Îöj—„%qœnDZ×̀¤ÈăÓă?üPå/?₫åùǘÅ₫wßxßwd÷¦$`Tǜ›'Ơ÷DáđÁ>`i“/ G¨Eåx<–R¶uÛu¯ÇNOoTơür®ÛưĐ#ëIÀổqøO6$ê%øÉxî+mûöù"S!˜+‹àé˜Ă †|¼;ăØ*‡@1Yṣ:ÉƯDrñµ»@höaqÛsÁŸ”à›±~ºƠ`-$Å„ €̉f˜Q?3Y ô€+kœÖ³Ùêă–ặøøx<Ï×3 A;$§Ê¬ÔŒFHQ-úÆ;{;iƯÉB ΰ¹î o°ü`™©Aü Ó­ÇơZtD@e{#ƠªàPçr–5˜ Àp\Q4¯ÄTŒÑ‘©æêÜs“€À¥#x†̣ƒû-ô$÷˜Æ¡¬¨ëe>Öă' ’Aªó«N¥ÏŸ?_.—Zm9°d•\L'‡ƠQELN§Óívûüù³?Ÿ@•ë–[_ÇmÂ÷óK(%ÿ‰/ä̃W61/踟&”¬úb́ÅĂ©›3  DTĹ ‡ĂpƯ¯Äœ(ÿ”î̉¯ex-̉AKÇßHĂDNíwø3= ¡=3v©tLVḿ<À@ªu8eÊ%¬Ÿ$eá Ă1dY`ÜùV<ÜØ#°æTA:aDv´¾ebEß9ÉÚ¨K·‚x®ñ &đ—Äq' Iî1y||<·Û«¥azjÏô`éuÄg%_›q×®.vb(¨ø€b½Cÿ×T`¼Q0Ȧe—…ÜïŸÖÜÇÚ  ö̉TË1Auđd Wñ™”Éà“¬y°l€%̀WCqjËáñéQTôP<¶§Ǵ4€rZ,P¬÷_ÓRNp*íÈŸÔó€¡z’–M[ü D^«^)ß~ûíï~øƯ·ß~ûüùùOÿú§ÏëgàøÚ§(¬‰[5ä]Ź ÎQÑ)%¯¢­®é•₫k±)-̣G)ë—Ă~$Üđv̀áMñß_ÅM>₫b>Q‘7¹¤›)7ÀBëÄ(['‡E+a_‚¼éÏɇŒ¥ ›DÄdß÷Ëår»ƯÎçs0Ô³N§÷‡&cÙˆ_k$I₫¸V'àØîŸ6›́½Á #ß$S_Ê×LÂñqfXwă|8 DDd·¶S•‡)ÑïµĐ¢“4½W~îxçÈ?Ưí̃ɱ<Ç_ÇïĂ;eºËt?¡ÿŸË-­Ûí¶̃V˜Đ¯½MB&yÄkY϶eØđk~Ád &ÓëƯu³G†;Să•%sÚ-r#ûœuTb@…fææ9¢—ƠiºÎ÷0Âa2ÿÂĐß¾ï×˵jÈjđÓÛ5Vƒ¡©~(·-ƒ¶4$<à5W¸·y₫JOJIÑAgÓc¾4¶æâĂZ̀W³aădúèi#äZ–Ó餪—Ëe$¤̣˜Gøx÷C”ß´I²ZRÈÁÇ—¨êXï†Í iá8b˜îÛÉWÍJB5“Ç‚;đoŒ|VóE ư÷~„O5 s-ƯSºÆă”œ ĂkĂ7ú@7ö#>œÄuÿ7HË"¤é·9Ϋ¨n7)²îëùrÙm»\Ï-¤Gú>_Ådž_¯Ơü`$ ˆ''¾Ÿ“€åKf¡ÚXuÙª\Nưó»o¿ûOÿé?}ÿƯ÷₫ÓŸÿúï­§aï̃D®è+ï̀Ü¿PZ0 •^ơ_ZÑÏTơ₫‹è#ûïf€›ư¹roư»[XD„̣êeC¾‡ưSÊ/Âlª^©Ç£Oû¹†¡aqœ‘=Î÷=%åq²C|÷ ²¹1 Đ0épœmnsm~Ç0§Óơzưđ჈\®—Ú¼Óé´,‹‰}úôɧ½½¦¤Ïâ÷ƒAûe´*´bÅ̉t#! !Nê|øy3J`Rèû¾_¯×R åÁm§x S»mÓÈÁ¾HÏÿMtN1ÄwüâˆXŒ ₫&\Jt>a÷t̀÷„Ë' ºñNÀơz½^¯xå´fX\À&‚="ÂúE³ZN}˜LG¶&MúÍ#B̀é¼›`£b lÛÖzw&±¯ÖñOn›ÄÈx“‚ •‚UeĂC{̀˜¬Í6Ỗ½–bT’KÄmKQ"ÜBEb(gàS´á¸iÁRÙuK«ÙÏ̉’ÊJªßßÑX$GBß̉ˆ¸Ă“m1¯ÙÊËbJÆpy<È3+̀)"ơµèĂăĂĂĂƒíör~©«Æív“–¾OæV&ùÎôg5ôü5g ŒÔ l£¢v“«gÔÀÍ9Àk–öă54¨+¢¢ËYØm JK[:i"»Ấ&›µ£ễỢ€Ä]Ỏ€¦ñÂLwÆ4‚LhH̃`¨r+ÈÂO₫Ëÿe9,?₫øăíê@̃ÏkØáKQ́̃m;/¢ë+÷ß₫Bp_ËAú_œă°Ơ@±ö}9,§ÓILöµ91ÚúªS‡¨[á, n“ZwƠI…á÷?&À90`wö¸^îxƯ÷íê•}y܃iëo\”ÎdO‘[,ƠÀô cŨ$̀ó0[úO&ß³₫̣ôöé›o¾ùđá:0P;ÚÍØÑ$(ܤîĂ¯h††¥.­|¾Äe íƠS—í̀…8~ù¢D>qûUUơøĂétzÿ₫ưǃF&â§‚f†û>Ùéq̃ŸC¡À¬ú\°^fôñï³ ƠÅM@(·—:|‚*@×áç ÄEN§SƯ“¸Fư1%F9d‘cl€d_’g4xnÆ^H§4¤ƒJCÏĂF•̣ TdQQ¼ ¸Ă½»å°)¬Ï3Â~’,6BÎ̀–O.3ôYOäZùƯÆ >Yœ#A c£¨Äœ’ïyÍØ=Ó³˜L&đ=›y=^:­îh2½i?( 1Û₫è̃]o-ËƠÄ₫‹ ̉÷+0Z ,‘H~ó SÏD+pÖ/‚Á"{ĂÛ3U›íáˆÖ¢©*º,Ëñx´Ưnë­̃îv»Ơ-2¼ÿgS’%‡›íº O9S`a"xªÈ̃^ÙæÓÜ-₫gÓ¾a‹ù³ĐB̀—]ö¢Å÷…°Ư—qƯËôÿm¹QQàE ÿ¡o‰ ̀ùqùg‘#Ă v 1¼cÛ ç0¿Ăx.üÉú|¼¹c¾¨ŸYÉ$O}˜Èj‚$àÑÀqéư Â*"71ÀúV±§Gÿ·₫ño-?ØÍ†Ư«ú0ú÷;́ă1ô{ààµV÷î!ªß‹”ÏŸ?¯ëZ¤œÏglV >“ú(ê_ R¿Ơ¥Đ ÷ßÿmÑ>¥' 9¾îs”r:Ĥ&¥A' ‚Á¦# ́ÖYíÈ’”KÚRW:næj\4íTg‹Óç̀²0ë˜ï~V +ê¾ ·~‹gø¸ơ |-—Ü éä/ÿ4ƒS8½­ŸŸ?úôÉϺă Cöú9Sh8w5Sûu8> ơ_³ˆ›ÉLÆđ đ+ë,%ÀÔ®×ë¾ïëºNç]èI!§5£ïùÊƯFÂø̃÷WZèƒR§9GŽq:o×öw¯Íy´Æ±3>úlήûtAÇư'Øt\ÆÊ¹ƒO#Q“‘²×"$̉₫çlux?„I1ø¦ŸƒxÖ´ưªô´@.úY1½…à₫LÿokÚ),äøFÜ_ }=58ë2ô Đ9WƠÛơ¶­v0ŨØ‹ ₫H/ÿ/9ĐâzA¥tÔÆÓp9´èü«ôô!“xb#Gé'¡Í X2¦¸ ˜Àäb! ̣ưUA8"G¥iA©f(dx=Ăs‘áƯNî»~ÀÀđMÁº;/Åÿ±â/>04a^:—̉B)<ÑOHP»Ô½>~¸®×—çïíúRs+³Wq˜ÙYu!—tßoÿ°_›mƒ¤Gî!`VÓ _™Ö}Ù¿~øUQn’iè@HƯ’è¢4¬ÀMÏa‹V¶íưĂ`¯Q: é©ßÚ ư&u'¦Ê×¶'-Ï£̃‘×ï¡úØ!|j8 ¤W„zÂËÆL̀i= ÷ÿ̉:Ê=0ÓLY¡³̣i¿á3]_±-ÓñPN ̣́,ÍÿµOl Ö„1ô1búŒ3zƒ!!÷èüZÚ̀¶ƯÄJ—˜̉8‡¶„U€_DrTuÇ”n=L{^x wZæĐˆaäÆ~ 6¹mỴ̈îDWû&’­ó¦©ưSYª»^¯ë¶ªèº­­uªƠ$˜tS3{.NiÎâ¶pOj™kƠFËgÁ3 đ³nÅ1+ïaçơˆơă÷r(̃¶4¹ÎOé>œ´J̃û̀\₫]-ÿ‚ùí4­Ænh¤Å”¿4¬à₫[¸ C‘8¦ÓWÎoadb™¨ê‚Ønơ1±Và¿nơe¡<Úè—Cÿ́‘́ö÷©…}²±A0OŒ¹w˜qÿ,ÆWà˜.1đ·ßÓa·fî.₫Çsüg¨z‚/̀dưJÁ¯p8dKNP“mƯ*sÛ6à3ï1‘ÁƯ]ºùŸÙ[ï¡$¿Û̉BpüẒ@̃ÂÍQàßÈÆØÍbqOĐÿ mǧˆ„±ĐD ¯³ÂƯ2ÅôÉbÁüi& g™‰È/¿üb?‡“åpz8iÑO>A²n dà>!¯1©˜Đ ÷û°Eä«»™H«Ư‰P'9Àöƒ\Íó̓rîëÇz[11]{’£<¬Ä W’wkTßừº§=æ£+M±t“FĐư=¤‡4@:‚kư½Ẹ̀ÆÀñW‘Ûz;\ëmå!s†¯óñiáqëtp¦¹g,Êp»¡Ñư%º¿ø'^₫£ÅˬpbÈ^4+4èOîLqÅáă*Ơ-áơ¸°54À÷ŸéFŸ”Ѩ­=4Î́@'V5näIí£ĐW_—Ué´zŒ»Ă L 1hè1y~0H2ö\…̀f¤ÎroĹt:iÑuƯöëjb""r‘Cc£€̣ÍâtØl­˜Ñ̀¶:0Í|ÜW•:ÙÖ B.ÉĂ0 Í̀̉…P¿Pm×TH`đ\ P^z0”ơœÛz³[w˲ˆÈm½±'Ü ™l¶…_Yđ“6&¿+R(÷X(³fÓÖê–¦ẹ́߯0¨àw"µö(Ÿ]Ô]9ˆ<<>ˆÉívÛ¶mĐΈ#C†ĐU₫¶ơ`9ÊÊÀÈbLÓ4Q®’œ̀`®CJ: ̣]1²uư`$ÄØ3q,flë†qœ?aùÀ’JZ4k’Ăf5̀.Ef[Ưy·ặ´ăô¿́¡Ú!₫z2~jt— j‘ư{ˆ̃Æ÷úP̀¥‰jc"\C'‘å·/=³¿NÊøÄ ¼°ơ¯{ÊP¢‡°xøGÅÏ ¦§Œáq«¯f ”‚Đ́-Pˤđë[H½‹X¿C—Á`hÎ9¡ÿ²»7 „ñλÀåêÁư0&¥c”Tøß¦‚ø°Ư™}¼F­„Daé¨]"ÜÑRa¤Ú¬g&µ½/ Ghsa¢¢u“'–ĂéáäëÄ}’rjÈñx1im=Ú oÄÀ„H8­É j`+“Ö¿ĐT›*êa,&úU*R7MÇŒèÓo°LƯđu‚"C>}W¼Ï@ê1ï|Zk[‡́V#Ó|T&¯WÏçÛơV[‘¢ẮèXƯ"!x˜.WXªUÔhOëaå%„p@XØ‹ ́h®ṇ̃Ê|M„­~-½ uRf:eXd̃+'¹RHÂè#¾̣¾$èX'#èơÙ¢æ©êvE“†Ö¶`n™¨êÛ·oUơåùåóçÏ<éÂLÓvlƠë;)IˈÈØªfÄm,6TŒrl‚Ußu@°åhî£9"q!£Ỳæÿ´S7 2¡–̉±$؇™@é}»¤zÿ ‘÷ºû^’?̉ÿ-¾Ÿc~û+=.hßë₫¾!âÅ₫ûƒPh“ ĂàĂ¯¹…ƒXéy ha<ưîzÿé±@é _¢r:̃<¾y|xüđë‡u]kˆ?¢}xÇßy¹Ï¡è'§ÿB>ª1 ̉J„̉ŸŒ`Ä¥%É%OTü'×NĐÿ2ø×Ä¥{̣>îH”A¹Q)ON5ñó ^‡ uÉÄi|¿u’ÁƯ–¾ÈT¿ )¹Oơ¦­‰ÇåxXf¶o{hXWXû]Ư©{ĂLaP%‘lNÇ×?P¬ï¾zw:_/ç–·Ê(ëÁ¨Y^¿{[1Û852ơFxJê½;·úßá!‘q 6„ ÑÆ.ÆdR7uÛ¶–½ƒ®›ÊêÔ…ѹ¹‡0è>JeNDâN÷MeZ+4oêÅW>›OÅh…NGĐ…™MʸpŒ[r†®Ÿœ,̃˜lª1H_8—`z7>‚^¦ºèöNŸûCir˜H‘¦)cÄ,c*u3f¾§D̉­”rzxxûƠW&Öî«Gd—­¾aUƯÏ÷ájó/U5hLJ‡7ÖwäTÁ^×’t yưÏnp ùÁÊg­̉¥'Q–CĐÀùTzt́󇇇Ç7çËYf7qÆYÚéæSr}br+ưË3"è“ÖbSÙ Nتé&øw2ƒ¢YËß³ªœN§Ă¡¬·Uc}ư©ă%ÜÊñBŒ‘Û"{:íqà?2è@üÚö•b&>½)1³ạ́éÀŃº»Kv!<)¢3é0Ú!‹G₫È^9-ø§¸üĂr“}Û·u ₫SñŸ±mñ~ÍŒ7úmÀ˜ơ >IC/£Cñg(:SÜ?£|¯$̀#¨ß¯n-đƒR¼>œ¾ưöÛw_½;¿œ÷m¯AÿØƠ+Wưÿœ@¬ĂV_J;x3ˆÅtPrgDg¢âp¤Đ¿ÛèëXTYL@}+€´Û.£ú‚?CænßâÛbÏBmoÍÉÓƒÓf¤IÎăü'[D̀â‡́µ¥÷!Z]D´èßÿđîëwÏÏŸúéçĂ)næ3x¬Ùε[ưÔxº>Đ3“›tñ¨ç|ươ×OOỌ³T`*TÎ¥‘%p—êHúØ Èf̉CƯáT<6BÈKJ†4€/|tøûmz0ÙnØLŸ̀=ï£Ïz,öư¸‘ ‹ÉaYÇ(»6Ă½>Ä@Œh‰Ëù©kûiŒCVk¡f[¾ SbN@œ}ưÇáwz~dă|D"E—wxÚˆ₫24G`¼V[…V$r÷lŒẓíz«^¬ˆf<81 B³`—¬‹êx¸åÈÇEÎç³–¢•2+¥Ô˜™mƯÚFuèa ¯6*Ï©IÖ₫Lå_#ÊŸ³¶i¬Ç1å0‚Âú©ÛGÖ­÷fL®‰Ù¸ø—X óu6ï»ËΑŸâINđS«¢æÂL%‰K- 3DXV~„ºU¤"°¼²…|oÁjˆe¶‡BM$‰j°ÓØ"ĂæÁÉÚO’v:¤È¶o×ëu‚éơ5´ÿ·*Ϩç³ëC•m˜à¥¹g)ơÆó<­M[Päg̣Ÿ4\^åëo¿̃öíóËçç˳ÿ½ÈϽd/dy«/«>‡X̣ßMê¡€+F ‚'~=!at?̉›!ư+1ƒ?{ú÷›¤vÂ÷bÁYĂà¦@?$)ÿvẁp?¸á ưù&F©9+¥ü×ÿú_ÿăüÿưü÷?ưéÏ·Ûͧ¹°ï‰ùÖ€TØo¾Œl17^(́‹etB_•RÇ#êÙó&đ®"ǬǮ:Ư?ÙW*T‘K‘¡+fÔ~½ªí$D(+~"Ï”F4C:Aï,çưA£ycs51oIß„g«HZW‚éÉ₫„À‡GĐXdĐŒNƠ"¾0ˆí‰eïNÏ£Ùmi¤¼÷îû”ü¶ K,«ƯàCỏËÓÇ2‚„ì;˜&7=Ë|˜æŒÑ¹ê?·V[MÏÜQA„® &o Ñ£C+́æB₫Ú½Ö uơ8c倡Ÿ¢&ö}ÿñ¯ưå—Ÿ÷}¯¬D‘ú«¥†~öú˜ơL‹²èM-z¾œ/— KѲ,ơ„u]›üP(”ßæNYèçpߘô’Œ+Ÿ¹ƯÆcú-á—ÄĐÇnùùçŸË¡3<¶±'9"(4f˜Å÷ˆ• (èæéÅù´JÀ·Æ¨Ïwpv\Ôß[…IÍEÚ¸*¥@Oˆ·ê|9ËEΗó¶oXamû̉C_“¶ Ŧyêó=ê@î¤H•Büƒi&—–R̃}ưîôpº\/?ÿüsJ³BrÛ¦…ˆÑ˜2~2T̃Kó+g¾†©t\LM—æË6óT4/"Ëñøî›w×Ûơ¼=Ó·ưÚ»ïSú¿†½2Óïô¿mÉ̃¶­•ä Â@:K»wÿ4?£ÿṇ̃ëÏ^ÚŸâû»puwJ‘²­Ûóççëåj«a«/NN ij=?@k•å$¹W–ĂRswömwWQ’{2©¥ïơ+̉·{èg̣`¼©¬¼©·ă~ÔäŸđIv¹ ·|•D·ÚĂ[Ô9¾'3@iº¬^Ü£Ó"' ¯0$”¯û+÷?O§Ó÷óư₫đ·ÿú¯ÿ’11fm´ăXŸ¢̀‹w€Ôx£H¦ +e Ç"¨N®‰>\¯×———Ç7ß~ó­˜üôăOnaO1iùÖóŒw;4O,«?† Í‚ê>±t+—O\qsPŸN¶f1ÁШ@0¿êǛԱl¸3ë+moÇÇï΀&Ïâ衪#ë£ÏñưªZ ă *¾•b$ÅÛÅéƒwô%ŸJI°áM¢WÆL¾S t‹Ñ ù1y°‚)¹¶¸xY€æ°̀Ó¨™>̉Ûă‹đ̉}B•Œ5TrÆ¡â8.ÔS¡¯rä†Ñ`qí½:ÿ½Ă –uYas¨₫[cØXÏs?È́£=Ă²I¬^9é@à ‡EUµæ†úiQ̉rÑ¡:‚Ưßí@ ƒ…ŸÄdë¢îÿĐéduP›üµăÂ"cĂnëw®M­ Ëf[êØÔĂÁä¦>qp‰—N?–a^8A¥ M!¸$1.:¤/« Q¨ÔÔ èÖÎ}ßßỵ̈^‹z!¾ƯÁvk9ô…Ï3OæhÔB›´.]x‹ :yQåtz „ÉÂlcFüñчrxzûTJ¹\.ç󙥫ơ#í̀ëơ Pw=“®ưîW]j̀}*ÇY!{ÅèÖéámßê₫_ñçÿpPđGqœÏ¾‹Ü ¾Ñ¯L^fw<4¬Đd8‚ÈÄ—đd [¬¿öŸè”åd€ÛíöéÓ§¥,¶[ùqưËX¿ÑXä'…₫ĂZ€I#_V´Ö–)¥Ü®·}Ûóđ'´4³>41Ú©W˜'ô™À·8îø»ëÿbá;¬ˆÖ×µ̣jÓw ‹[€ù%æ— (hĂ₫—z? q¨,¡÷Ậ‹Ô/Û¶ưå/ù₫»ï®·Ơ/Ăè$V€r%«‚UüfwsꇉTÄ „]~®‰=??_.—mƯ¾úê«o¾₫fß÷Ÿúy:Ceªƒ: ï8iÈmHå.Í4ùÇa©c@™>‰¶¿§ç[¢w…¼ƠĐ8¬²S¬QîÛtû¥„DhI»ă53hø°rôọ̈i¯5 ‰¡´nÍ. +f/æư ï©“?¥zfW?F$É̉DøçMΰ^¢h9ˆ¼9í8c0VÙ5®=ˆßưE]ˆ# mƠ¼×¥ÁÁdm¯NP¤́ùbí;´ -°²^}:÷C~ÙøÖí)Ư˜Í'T·ƒh0₫ѽY˜¹a*EKK)ŸëKf§™¸&äư˜¼ï´CzñMÚJÛO(‡²–]öư¼órÁđt[YBtx¨J:‡•€fà`6~8·fŒ‰ªÉ¯TjÔ­©Zí€&”˜\®—Za%æZÏ[¦~?3;@¤û¦BÄS²DÓHîyơ¶̃nWç₫#ŸÅ„×8”ơÏĂáđôôt8Där¹`ZƯiwîaƠƯ,såü*~he@‚Ï)¹­ ÚơvùơĂ¯ÏççÏÏŸCô¿À]âe°ùGÅÿÔÉ(´¡¥đ₫x ¯c ̀ñ#{ˆ6çrî_<Đ_Pơ¿Ÿ)nØoCXƯÖíº]7Ưz8”†ø±ƠWÊ÷UƠ¤œïKưRÍ!‡ÆÔÔ©û‚©j«*Ø'gÿQh¤Ỳgü”cư¸ïđ¼C₫f= Œ‚ ?k9.ËqÙeÿôñÉêH‚ơÙ6pâ߆À‰ạ$€Î!QúpÉ+¦…4t ₫z»₫ă?₫£¨₫Ø‹<ˆ|w:gÓ7³³£ØSÖî±2L2uîb>̣£·Û­/©ª”ö‚w>+¹â^¨âJjÉ´a™4C®Ä[OeÍÀñD̉£“Ù<˜Đÿøµûˆ[)°dD #2E´®¾;q@¾æ0|¼ÀG¹M’9y÷;‹_úT̉×%Hî.ñN¿ ƒ₫öŸĂM†N¦üă,Ü< pN´üAf­•óJ}8¸'K‚A“>ç̣£©ÄЬwR?0 8Aö»å/52<ư.Ư™PׂđˆßfÂÍ_'«P ôÇt(±®1FĐß4<"ª‹,H4Î:øè®QqRz¿o,= "Z]úËq1³«^Ç›¸y&“ÙÁ§/G#3Cj"|6inæ­§$Nû©w|{jWÔh¢äoZ›1¬M~’ÉMÖ¬ûâz¿¹³b9 ”<ö|́Éẓù|̃ö­)p6˜9ÂG²ËÎשׁª‡r8Ëañ¢°½¹b—‰rÙ!ñ6±%W0sY/Ÿÿåóu½®Ûê€åĐÿñÚº™@ánÛ wú½†& fo>z° yi5Ñà×®ăê¤v'n§I‡àcaP<Å‹ư—ĂA‹.aŸ¯^ÔĂ~Pđ‡“ ziÑT<0I)&sr¨Í_ûÍ'@_œ\Ï¢\}7€¶çÄ€ûÅ#lÜƯAgh-‰WÏÙ!œµ! ë«€}ưí7ßÿưm½₫ŸÏÿg«‹\欈™åŒ”p» (ԕ߈§Aï“v~²:,\â.˜Ê"¬,±̃uû₫ă?~~₫|½\·m.W$²ój×7đ!¾O‡çP_ÈÀd’“œ¸ î Ä£ü{~Ÿ—eY×µNgœ:-YàQ_%IÆ !=­b"²Ô(×çr=•ίÀ}Ư×1È'×J éKÆM…v£nwym= † ŸmÉ@ùü¶œ‚Ưƒ+Đ¿÷×àcíù&¸|xƒ₫ă&_Ư÷Lñ²?!î¿?T{Œ´›„ûƒĐßzß÷ççg£üwÇ…ŒzŸg~“îS¯“‡êùˆ5¢Ú¡–x¶]E‹́{m…©µàœú µ–™^ḳÆL€Ư^Ÿÿº¯×ëu]×Ưöå¸G{9¿Ü¶[Æ÷p;̀rµ΅‚â†f.ô‰÷†H9Û:b¶I¿dÏÆlzPUÍ<áwÛe“Z ăPø0ĂÍÉ•5QçƠÈUj\* »<§OçHƯ_đ|9o¿4ªƒ1´°o”90Z?Ê¡eÆ/$‚Çm$œLlÛÿDuD_×v¿-&Z 99å·4sCˆŸÎO¾×xßj|ú ´«Qfλ nº:ñÓºu‡;ñƠïăäâ[ƒụ́ö?gÊ´½̣Ö<^µWG"qĂđá ÿ;ß»r{€Å8‹1/_¾ ‡°ä K0iâ0e3˜_y|nÿÿăñ¨E·u›T”HĂ Éĩ(Ù·îĐÉÁ†‡(4…ñ®†›ÅŸ/„wÆ—‰ |ÏC¯áWt²ă†Ô®Ïº+`zOê oxüis¼JH“̣̣&´”b'|<1ë<Đl¦3LI ütm1ƯJÙ]TtKëk ½»"&Ï¢Çc*äŸ1GæÑqî.Ú˜Î)¾ÒñoÆ]ÜRêIơmÂLÂviyˆ‰uÛö åg#öư3,/Ư}ï'j“±D#¨É;Ah£n¯QU5f…p̉x½{\[úÍ›7‡Ăáùùùz½~±—îØ>=Ѫ n3"a´êD5Aó@|Én•LÙ„Ç|,†S5åè0dâÑùÔ;gL£‹OEO§Ó¶m5æṃÖ‘<ŒuÈ+œHN=Ÿ~!Éñ{-¦l–Vk•­»/ßoQ(đ.>>œ–eaë̃ùóÛÍç CâƯ§P̃%G2‘?¦cá‰̀ú'|Ÿ, !+bŒ1+‹wR"á `¬;K‰OËWñ»„iEØ:pÏê•£5j…M÷Ér䆄`n¾ój¸SÜq5¸ă$zY0Đăùl¢ƠruÚË86K k fÚ„Ùb̉]ÆuVVï§ë(Ÿ]9LGïè6—­Àụ~×îƒ+™‘ ÏD¤f¥øƯ;~?˜NÓ7’Åø~z8-üîÁĐb^-“¥”C9ˆÈ®;q¶Öˆ–^lº?0G)åƯ»wÇăqƯ¶Ûí*ô›kK è—ÂØö¤‰Ï>5XŒñ n2®Äd xĂhøÝÇ ÏƯÀÙGkÖ»‘ 3h˜nĐE*^Ô8ƆE‚(¶‡±¾ăø̃ÿơ’ĂñđƯwß]¯×?^o×F+¥¨-rsÁ¼œÛ"¢²ï;Ô@p MĐQ÷)’Œ€¡É…"lw?ȰµƯŸL,_ØóCf$¿Î¾ï—ËåÏ₫óa9¬ë ™úiæ ®_Ưp;°ÏªwOfæơ,¦64&&¶ë^¬°‘ï-b NƯbÄÍMDZ 6KéuÀU'‰BK„¸$³ÈE! –˜v&³«}̀Ц¾Ü v‹tÈÈ꺵%Z.±êA;µ¸p3´vÛls[uèzŸjlÛåïCy€Úá©ÊïØê#ÁÑöđ `JđEo î—-œ@å}à(¢bÔX=›µØ´œøz Z¬¹î¡ÿȦ»+€öp•ïù…÷rŸ|—û,±Ø?—ơ$ôß¿̀Ñ?Z’ø¡<Ï]íbT»G`3ümu?e“ÓĂéÛo¿-KùéçŸoÏ×¶ïo.©>² »ÿÙîKQBÿø“‡ÿºT˜MÑú’Ă¢!4y× ÉÔiDZ¼2–đHhíaS!\OD]û¦6Ádw ¤‚è=WjéJZ̃^!&¹U$|Ü…8ÄS` —k÷®̣BÂ0®>ºńỏû܇Xª`˜úˆÍ£¸|VôÉhቃÎd¤.¨Î™l.2ơùˆơ]Ïxt¸oùnm))®ñ”̀”oÁ4¸ă¸g…?—&´T|O(´³“ưÂK)?½#€)ÓÄTèÜT`0ηÉå2¬Ä­…æ…ÛÑ́ f@$Œ×u-‡¢ ÍótN6›°t£]+"ß¾ƒ+/›ÈNö8%¢…Vơ¦LŒ:¥@îꪨ(–aƱ¹kçđâ ¦ª-_¬+Ơ¶¯_ïÆñ ˆYÛp<ÿ»ßƯÖuÛ¶Û¯7”´—‚¿o¤êƒñ̀’OSâÁ6đœF!Z}ÔW°¼ÛYĂ³e‚§Ífn¿îû₫áÇ?ưéOŸ?}®1h 3&}:u±‰+:aB̀ ½;Û½Ư<ƒ%æàUÔv¯ˆÅă2YƠ ¨íƠv“âÓ!Ù«í>±À”öG ¦Öv~'€Ư.Ơ¥”r("²­[â;FµÆzđ¬l#%}8đ³Iٽɷ™†øh5™Ơêđ‰W4¨ 6ăYẨ,v:J)¶Ûº®¸Êµ»̣pÙ̉âvj|ÿëùô"¹æÏ\(ö[°™kû·Æ1KMâụtǹơÀ[0¦§ÀđÓ°>„ư‹’ÿư—^è³ÿ´ X×_÷ŸBƒz°tơª´çÓ„A}wNÑWưhƯ¦%Ä-%xÚ#́°ß<–ă¡¼W©ÁÿæE÷7–Æå‡-À"ç?á)ƒÙ@I´Q‚ ÑÑ»qФ₫̉úD‚f÷–3çjôÚùHÿ;WG3Sw#‰…1%uYEváư„™â,qüî?ơX>szÏ|,rœÂxh¶|:‘Œ-¤£a–Ø/–÷yư8ƠŒ•`˜Âƒ[Eï¼ú¬u<øÅ|åî₫ÊwŒÑÆËƯBÇ3ÿ–×™́͘ÛNë:·×yv§&ư“¤Q¾ÔƯàŒg₫íײ%#aJIDAT¯/°&áæÏŸ>¿œ_®×눪½µiL-g™‡ÍüJà‡£®;‘X3gMí÷²èĂÍë€F¾Ưpof9ÿ:Æè³µĐÎÔVúv.©4Đ¢ĹvđqYËr<&î…ȶ¤n4”3®€6|©C’ÓIåP¥” ćÎ< 2»OïV“(K¾+’§¡£L6ơ)•Ó̀.—Ë/¿üRÓósScÉ¥ÆÈ’/ /¨“k'¿’pân¨Tó•8úÇ¿PuÿqÈ—û `´Æ`·:!ùOÚ¶ÜuÓ­²ßø‰¸?üRk4±ô“ ñîƯàQ|ơ>Ä^ßt[·f†ERĺ±Đ&&VJ9Çăqßöíys«2ö3]!¥úmk;ûîa7ßv$ưÇ[ÿrUPDIÿ¾{™ À˜¦ ¾5œÓ)~ |¿(_B© g½CÚ—ÖB#à£9iĂS–ƒÄ’ÿ1øGErP •₫SúoưS₫’61ø̣̉yïF«ø“çĂƠ6¸®×ÛơZ­>CNmµA ưwœN÷‰vœcwó/̃Ø(éÓÁG”ï~¶ ¨ñơB/²%æ3$1º"¢ÿÉ…³ŸÆ›·vêdÍ:\Jyzzúæ›oÀ¯GnS 䯽ΗÂF'ëÁP;u±í36—.¾÷Êéă™ó¥«_^Å`ª@å®â¼Cß¾6ËúV, ̣G–:ơ/3™eçåÈ~ÓZÔzéKç²-F ĂèÅÊ £ågY–eYÚ†»qD2¬aơF†>á P9”²ô½V4È9_’¦´qnX5?üøñz½úô}½5 ÿK¾I¢êe>²¬µB¿Ù Ƴ6̃ƒéÜ”A&y\ÂO¤²0“·œÏdÆ*tx\¸=ªZa7újÛ¶>|₫üië¬dxS‘ÑN¾;•¨ÓÂ}H·óñăéøôƠSƯ:³Mí(̀“ĂÂâCCŸ4¢À¾ oqÈêgß÷Ëùr»̃&³8ºÅâơ:ñ;’01“âÇ}ă¤~·[€²zë×̉(4°#!˜x1×Ztë{·zr«¡<ư°0ÜA“Ơ0©¯ `†§̀Ù¢x·W8£`àY8ß̀¶m[·u0‹o|ƒ́-Ẹ̈đđđđđPJ©B>²-üwË@ÉTûáhäør¢0‡û{܃ˆû>•ˆ$uG6"xˆ0 ½ÔUú(,bÓUs¹OœÆFB¶( ÈpJ€(â₫«À _c½á=É´à­Ạ́[ô–ŒĐD„f‚ÀúDÀ(UbæÙÂ3Í'̃nçËù§Ÿ~Úmyy Q₫BE÷ÇHúÔ+*ù'™<ˆƒ,hÔpUú§#”mƒú? jË'{סHf€ëOÇ UÄzô¿eÅÁ&¨Ï@¾v ‘:¬Â°,Ëßư§¿û›¿ù›?₫ñÿöç[mꯑwÆCE†'*ι&ÀåCºxgSª83đ]bRy®9zÇÛÀ¥»§Ùà¬Ä’ÀUG5&eAA±bâ`k^Œ¸„ô‚†?Iu$?±ÊrDƠ&éë‘ÔÄC½¯•¸uLCÑ¢‘@@×;¯‡CÜ!>¥”å°Ôå Ic076/KÄm0–x_!î1Z4—eyzz‘ÏŸ>Ûf¡'©…á;ñô¥”º½F8?–´—î΂ŸÅ̀忟i)vœ!Hä>YtM¼T"$Æ»~¯¥Ü!¢£HL™Ñùr(óÔ„è,¾¿‹îÑăm$çƒPÁ¨ûÍû¶iR ÀÀ+Å̀ZØ´ÙơzưÿüÓ? ¶ơEÇûL‰Nô’÷ĂPZư6Q ¢EË›§7ß|ưÍóóóº®h§¸TˆẠ1•R¢TƯrÁẫ~Ăa ̣€FBƒhê3R7µ‚đ¬ aSb«„Y‘-æ©åÉÁæ·M¸¹I‚íˆYKL„é»́‰û@…ïMÆ QY‹˜́@Txô·m«ƠuüYi‚Sï±âRºi =†§V7ÀFóp•ơ ´4TM 'ç×(`PY¯̃ÓƒKWUè_cU í÷4IËpˆÏÀ{È€‘àÑ>=øÇ‹µïNạ̊FNhÀ4Í ­„™u‚¼ŸBzK{ e=›ÍĐ]Á$ ¾<ú_L¯Ï­Ù„-å·´‚?ÍR½¡è'Ù üP¶‚чĂđáëË0»AưĂ—ꌕ™Ă¤ûº¶-ª­ÙN³;èßBåP²âɧ¸ÿ°_/NØÉ0kUü÷`–s‚̀̃@ºöĂáp8=œ‡Ă§ÏŸà? !æ-œáèq>é|F̉P²¬DØbúÁ·Se=1ËQ—‡Óéô‡?üáøß~}ÿë¿ÿÛ¿g¬#Me²j«ÿiOj»ĂÄÙ¤øÂ§£yRÑ#;P¶¾¬vÀ16˜ù›‰‹)ï;<~r“zfByÀ(@ü}¾¤¾6I4\ÅÍ]ÇçDªº̣™t5²î8ưÉW&j›ăË’ærÛEyÉp f½Lîo‡u‹²ôTµâ~H÷pªóC>U|G§v ™ë»}xxøá‡‡Ă/¬‘¢noĐ}”Ầ°v¨ê¾í<ÖÆÑ´x8%J NBÅ–d¶–Y,%XăŒºZ®…k«øsaímyfeëB‚B«·Mûù-*9'°:́›­º2 Œ€́ơa´M…I•ùÂM» ë0»íe/–‚ÍÖme ( ¥!YiphơàHCé7́^w5.RËñt:iÑËơâå¡È!Ă8µ¦<4®Î ô͆ʠ¯̣ÓG;Ưî¢á‹›%“] “¦ö¶8oiaèYª9‚¶«§ô€A÷ÍÂ8åWiÂ"3}‰ô‘ÓéT´\¯×Z‡:L̉. “ºR¯¯~]9°­åSRu2?ÎE=nĐ´b)éLÛ±lÀ°™×†;nF1ÑçL5F“µ"“ëơZç{…ëSxÉ“¨{ÜÖ×¶Vûd?¹jYÏPæ›|íÀ";M₫ .A(­£ç¾û»RTôp8,e‘}Ûù8¬…PvsÈư±ĂWñ°~÷ á₫J|?p¿°/µÇ …™¡™²cQHâÎlwCíƯp,²î«́ÂæYÏîf0=kºá)€éơ­Â¦Q?™-Hü ơdÎI^0e‘ÓéôÍ7ß<><اOŸª™.Ñă9€>Tôàº0SrfăûWk{Ç$\+°T÷m?Ÿ/×ë5¨¡axSôoõ+p$z_›nô‡¥ ÎYĂ‚&¿ú~´̃Ô/é’@¹Ưù•{ïî[t}&‹Îÿ½§Ç̃ă·̣ft3†[«Ă]ÑK ç–[¾$-đ¡ tæd\¾e4wƒ«XÛ“¸î2»Î oB¬ÂñîôÓJ)ÇăGăK+úÉ`Wăß,ÏD:₫Æ̃Đ¹7l2§QƠÍgÂĂ˜̣ơa‚‘?ÿ}`ëñPh˜„c´ç;¶|Æ÷b÷›4F¬dÂ7GóêB̉2GóZ‡̀Ô…!«5]«ne;3Eª‹ûÍÓö<€¸ß÷àF礅<ÜW1é̉Ø!“S@WÏüo¡Ÿá³XëĐÁ}‡›§̉ûèg ªq%¤²–Ç7¯ï«wµw i…×xú÷g¯×kÑ‚ưÑĐœ05Œ†́ ô¥y—@ùƯa"Ó1 ͽ¹Ój´‡Cú¥GĂŒ»ÛŒ‰Ôz’&v½^k:uƯ\lL¹H‹l3¼¾'₫ïUAÓF`m£ß=œ¶úzÛe¡5i • •p²Qñíè¾¢§ăét<Ùn/çpvø<Œøư‰Ä*ijAÿ%îù5ư¢_Èú-FeIă£Ó¸æßF$óD¢c½lGÔ‰|`qÿRÏ·ïđ4‰pFØÄă†ù'nXûÉü*œà÷²Fz›ëË><<|ưÍ×OOOçëùùåyƯV^`¸—XSL{u³"â¬]—î“©,“ăéøöÍÛÓĂéùóóù|δï¶nùË_>~üô₫ưû\=#^n¶¥Cî×(s,ØYƠñ¸ÿ;˜+ôÇ|¿<ºíéĂ=̉¡9nOÇ Áëkđ{ / ½Ñ°·M''‡ă¯.™AT Ư…<œ D&6’EĂ&‘²|ÿØ3̃<›Ÿ`^=pO*Ä|Cû|ÿ;Ă›åQîÙ´K˜Ün·?>><æµaOP·+0âîo³r÷‡Ë^ùsz~0cØH"Zu€:Båø®Œ cÂ%ú°=hÚÄ₫±ñ3›æ¸sK´]D¶=æ/2véa<Œù‚ 1Ü9?q&WØk%´÷'lé¬ñÓơƯ×&Đù*föéӧ帘Ùår™ßm6é<ü2q@ƒ²¡"oĂÚÁ]:}/î“©‡d:­êÓyˆIËï3G€à¾Y¦Àưîs`­úđđ°,˾ï—ơ\[‘̣oEµ­×ɉY¿Û~>Ÿ[f2üÎ<é₫W>ó¹f¹—8Úbæÿ?w(EŒÎ|¥–đ£Gôv uƒºH₫´z$Z«‰ỳöÛCä¢ü«£ÀhCV®c(÷9Đ·6–óë¯êàßµø~qiàŸuóæñÍĂĂĂz[/—‹3ú8¤ùHÿ¡è øéơ₫SÉÿdKøS8@´: ¼µDD—Ç R*” c °k)džx›„₫#ĐĐ|zX/¥H‘}ÛóÓÁúS ư µücKøé¹ h79Ĺt:=<<><<<==AïØÚ$¿›1ơdñ (öÖC­‚ë=ƒHH•o¿ùöïÿ₫ï¿ÿîûù—ùÇüÇÛơ–€Đ̀ù|₫Ÿÿó´èFôyc`¤¬Á)íA‰lăÎ*€Í ,ƒî¶æ̉æ3Đœ&uÓA&^T“»ÿ!ø§̣FiZ˜üË% s§¶œÏ2s•Âß¡m‚ÍÀ¾ ‰_$.¨„M§a ‰\7!°â ?›pêëw_|ÔíD.ócœIÿƒƯïZ¼° ŒKñ6~+ó#ü«öºơ*z½]ỵ̈—¿,‡e[7˜L̃™T¥>2$qáà6Ăúâ8"Ởä 6É(6¼Ÿ—¹¯ßG™ 5ö®F)XP ²èA` B̀œ3¾´‹ªuƠÚe³­ß¨ßÊDUkÜK-6¿ï»t&²™Z@Ïù öYÀo,™z>øuiÔÉ‘‡ÎP¦ÿÄÖrîR₫’¢,È«ƒW¡Èo³íÛ/¿üR¼̃E‹§•k¿Áb ư ùY©=áÂWĂ–²XÂ`PjU”đ: É“»Ú23J`°4úûbYáÙ×§`M¬ñ¨u{¨ưQŸ³EÑÔ‘¶X¶>ç+«Í<0¡ÿ'L²¾x¹aÙ›ö'$z,!øàöçàT¢Wp¨Á`n̉ÄB¥±ë{¤‡¦UÛ§p\ÎêÉ˺¯ÖC€B¹ÏƯc6ñdßV7ßà₫ûÖ¿đH‚˃—pôº=uå¶ñS†ăơ~Ú¾íÛºµøưÿuö¥M’$¹u@DdƯ}̀4W”Ñ$̉L’Iúÿ¿†É¥d3»dwUוWD@Üx<²f•;Ö›éáxx€»[₫&ôo¡ÿ°@7údƯÚ¿·ë¿ù€ûóábn£!t ×(À##đȦÙÅå$uOÓ˜öƒ°̃]ƒé ßà¿ö]nf懇‡ëëëăéøưÇw×p¿̃Á}ºK̉êË+ƒ$₫§ŸOĂ8|₫̣ùñé±äÿXƯ”'ÜïZ­€@æ´ßÄÀw¢Ù´C̀3óÀ¿ụ̈Ë?ưÓ?ưƯ¯ßDäÿ₫Ÿÿ;ϳfâ&發±ä¶í:Y§#>€zrËvn¸³aV«¯j‘L&ûª§i1‡=BB¸É½4è.Ưï(̃÷&Öß…̣ØÿVơ aà¤C¬Ç*÷_B'¨8ê‡L‡Ơä°áf„ &„:jeO)ܨ‘ÁDǼ^̀o%§i‡qçrDQ­yđăđ©s«½j>8lȗדnÀÔ¹:¤( ¢IL¾×‰ă¤½ơ `;:qˆ ºµ¾Ê&\€øÄÍô0‹CƯt.|›*>†á׿ûvsuưúöúăñ‡ê1×c̀»ƯnY—yÏó«j•o³q•‰JóœºĐø,E0ádZè%RïE§@’)1Qa7†Xkv½dƯƯ¦ys2x4œMΫé-51l†=­ PwêU:  p«¬«Ctu<î4æKƯ|zRĂfë­’Ö ơå"‹®wjo_×u¿ßÏçù<Ÿ‡a¸Ú]QÙè ë[qm~a•7mú®AÅ‘W×Q6Ú”g‘Ó =:%Äp¾?=CÅ@ç… åFX>p6Óa.dÂ0ZÚ‡uƯ…2n]oÄ3TS€ḌÚ_ÜêG7û¯G8᮸@³€¨ÓTÇå…iuüú×jfØo³C˜ÄÏ|>ŸË1³ư ư+4÷-YËƯ/[₫×ÀT₫Öë!Ơ‡,ăßü ñÁRF<á»È®ôB6aaCø‹.£´=¶Ô70Ụ̈j LÜư2̉7#X¹¿»{øôé}ÿ₫ăñ=.ơˆ¯ṇ­·„Í@kg ơô·IHNÇÓÓăÓû₫ưíưÍövĐ>ÔjC·D]à˜£ ÂO[Pno’"'çÓéơơơxCfåu¯OÅưºư?ẳ^XàVX£BÊ“olOT:×™=9A&h®@·̀%ø! P‹Á‰¿¤>ú^÷éë˜xÇ««éxª‘« †,ÆØ‚&îöSÊ0ó0 ój¸P ̉Jëû₫ưåư…€ïÚ• &'ßƠ¨QƯN«üƠîj˜†ưû̃̉j+ọ́ụ́ç?ÿy7íŸÎ§³Óàa¢l´«ík ¡\ç₫œº¨¾‚,éJîUr˪u?‘#cdDñù.±‘Rv·Û}ưúơ|<¿¼¼82Ï{¿¼ 䦭å₫m4Äk¨¶º̀ ÷®‡aê¦n#ͱ©ĐF¼¨Ü'3ßÜ̃́¦Ưº®¶ÏI~/^$FÚ¶]æ+nßÑé«à!sÉ›7ªLÆáö¶°êCèjGʶ’̀.ä₫́Œ\4¬›<¾‡vöÉ!T¿‡˜H ª†Z¹e^–e™ÉË öRI¯‘e]”qw ¦¼Aæ Æüæ<® »=Bˆ¬…ÖnÖ´% ”¯.î×ç.Ü–ḉ#~ÁÁ «tZéÚ3Üï o%]̃Ív/µ¨ñÖüº»½Û]íÇăëëk{Æv&ºt¾»ÉØD%»È×]€` °«-ñ§†Đ¼̀¼đÀĂn·»ººbâăá¨CèRj #5Oƒ V́Üi\.\£‚!c‡¢¶Ñ¿ @¦>~‰¡!üƠ+ DçDR% ,ă"x³Í6Z /Èqù€AƠ¨gÉD<<ă8aGËI˜Ăú!Ó¤âơơå|>NGѼ&™u©åºÎǹH3Á =Éà,¢|óÄ₫,ơ/Ç0›©›eư §Xh•ïă8^í®–u‘“`ŒÔ©† ì×H…Ó'€§î¿ëd¢ổçBV‰êsóÍÄ z€=8O$ ñÈL\B7qô}nư·oß>ùüóçÏư~_̀ VUu‹Ö'¸µLsÿ´Î Æ»®a\mâwÚ)[ûSÈ­bÛ9”d]ײ=XS-8Ăe|Ơç¤væ@T›yZa¿yï‘¶î̀k 5 b¡¶Đ6¦q±ET53ƒP‚î7Ö;ƠH@/ø^-àh²€%¥u5ø®r±®X×u–YD4ă?²₫íºàñLJô¶Å­₫Đ¼́ Ø¿đ“îđ|¾CÿmI® Ê6Ö‚íÀ#l¿ ®úÆrèo¥ÿÙöûwĐ?-p•ñW¬b(Ï*¢?øÈ¸jKéËÿLßßĐ³^Ô½Y×uvĐ\÷–Ö©XT9µ=%œèX?>=ư|yçYƒÍOs3ĐcL₫!¸î×'Èj‰€Á₫’^¯d Ë/r̃BđÀq¢v»Ươơu‰kƯÜ̃”eÇHSÆtơ¶Pç ’!ÏÄM 5àåg¢±*Jï²ä çXJäÀ‚€aP9¢CS­@9Ưi¦—çƯ©] sµ”ụ̀åưÏÿư—ßÿë_ÿz8tv»]4ùdæ­îé±ơôÄ?ñ?»yêÑ!oC¦(D€ÍPî¼QZ–§ëOíF_mtº¬d³÷zQ ~ôu‘ĂĂÏáp8OçÓY%™{ YÇúذ̉9e 9†CÓ ^÷>]§2Xwo²ŒoéärAù”#-Ièp8`T9eëÛä×C{}p 8ç¡oÅï[„óæöf•ơđ~P—m¹>ÓùT”̣g”‰÷½ÁôÛ#ïn¿ßÇ’¾‹?9Á6Oá©Íµº+v/Ûpc ­á̉¡†ir¥~‚ªẠ́»»»OŸ>ÏçǧÇÓñ„ø2àcjÖ ºƒ\~iWWg6_§ÊRÄÍéc@]a@ đqº}ưåëçÏŸIèñéñơåƠ8c¤º˜˜yÆë›ëûû‡ăáh×{{Ï+‹¹­°Ă˜F)›c`ÏI Ơ¨/ơ2™1q¹rÏOă0– BJ­« SØV‚ÀaUZCqC½Ú\°Y«=ÁŒ›:É efnĐ–Ô\lPt$ơIt&i¸1@ϵ@oç ú̉ÈÈ`jó8 oôñe8¦ÂÆƠ.üm×ă–ÿbÜmÈü‰ƯͯÀ́‹N2ÀÀs;Ơ«¢ÿ”Ío&œ-ɯü[øûđpÆ€¹ô!fÖ̀<ñWw₫á¶¢7lñ‰Kơ¿êuĐ@R°ÿ€íÅffa•lÊœŸjÉJ̃ăA]"ør›NrûU?0-)ÚwUŒÁ‡̣dE*5=Œ¼„Àé øº q¤æZÏ%@…¦ø+>X¦ë`IÑ£ÈóĂ₫, íß÷˼hV’NkL =…OIu?‘øD|æ£Ôx`2¾Oûàö­́©îÖÀaîïïw»Ưëë«,=–ˆ™ïîî₫ûÿøoww7¯¯¯å„ăéøûï¿—ơ¦XĂàu3öñ:~¹¬…¨¹Oyºá@́®vLl{Qûv«u‘{fă¹á»èù#ˆ́°øÍẩLµ’R2Wvkè!@a·† ̃›ö‡?Ù=Ó/̀€1Ù$gXoK¼…àˆ³ _ÿ¬@0G#B₫~ïÛb§´t؆̣̀Ơ_l8¶‘(ơŒÄ.Â9ªN…#É?M‰‘Óé4/óé|‘§§'b̉=|đ½Ñ~´áCÜïĐpO²ûátú†­u‚$m*p»óϼ¦K÷ZAæaÆqŒ%}ñi¿|útúơÛîjW®Çß~û0`í¹· k·˜B@&cÿçÀĂ4ML\2Öẹ̀G£%©ц‘!6cƯ¤Ñ{-ªĂx₫를_‘Ut¦ôú¸4À÷yL]^ 0Êœzœ0F¡DçƯ»()|}o°ă0^__óÀ<0¯›R—ŒéO¨ùƯËà-w×ϱŸŒ®t³ôhÄ®&¡704¯p'>?9-ÁŒđ"H Ä4²ô(X¨úÈJR£W›ÖÊÀQâŒrîóU˜x7ív»]ß5̣ïêºÚY`¬½ a&ÚâæY z¯û\dÇiœ†aXNË4MuGüă1«ÖaÆqÆñæúƒ®ù™‹,?¾ÿxy~)úÇÚ Ùèz£ VÑ%RY `,ô¢±‚Ơö·­`0¤%ù„^†­‚Ù/™Aߌ(d3fI@‘ NȦC@»á+¸ÖgèŒNï×0"Ñ+ WŸ,–¦Á”œ„̣8Ú6 b+j̣ƠŒwà—¬Â¶3c)/9'©éµ­ ŸLäSuͳ­ñ­iưÈúësØn¹=ø(KÔÀ%h ¦a²tNyÿ@ŸăY¿RP´J§¦ÊBêJ—£Bd‚‹.¡E—HặÇ`zayÖƠܹfOD«Ù“ú´2u1å¦û¯!{H ü4Ưưàf Bb±6¶’r·ê@Û™xeÛ̉ÔÔY¨¶js˜´I—’ïûwươx:b5lÄ7tJ&LåΪ ªRf°Ơg‹́Ñ/âëƒÄ9à g{ªO`3DÇ#6•T¾̀óüööv< °»}æyùùóùùå¥́•ÄeñEđPXucHó1€ÚWÅ­“z[|¨úÓ¨ÓBa!_Æ€Z¥V%ºH©ÅmµslÔØî5ă”\ÅUÖ̀ö wÔCóˆl~¹‚Ư†2¨„™ó~Ù†Ô/ ؉,´r#éhªê´ÀD_̉đ J/»G1óº®ÆưC×Íó< ƒ$Oïu‰æƠhO{uÀ¸Ô³¦[q^æưaOíœDƒ9f‡£$Û¦đ×ưHÔ+ĂX³°4½”VÈ«†yTtÁˆXú„T)R!ÈI4 cmJöFÔ?Ñ÷Ăơˆ¥Ă8Lăô₫₫®=ă"bR­âÎ8yS‹´‹¬ám’j=µ$±Ç}uPåpëiNçÓÍÍÍÍÍÍ<ÏÇĂQ)a}øóó33_]í‡Ct\v":êÖ^AÆĐ! óÑÚKN™8áôt¤)%2ÙnÖq£ÆuøÊ£–óÖ̃±̉:̣hѽÿ¥’‰jIƒ‹Z’…œ÷¡¤Đÿ]©̀“ñœ©ky©ñ«˜ éaCè^̀´G‘½Ñ<çv%$V¨< Ú!8H åÎè±*ÈÂÀé ÆD¤Ñ@DL<•%ùño_îÜÖF̀ÊB¶$E_†H( çE¼~ø^ hº?QK§ả?ƒ!/ßîÎßíư‹¬¿;ê‹ÜŸ̀.ÉGQ¾>ܧ@Li™Á6œ­7 x™`GaÅÁ àĂƯ(ló/ûëĂZ¾:?O” }Ơg¨„}I₫YÅxưƠ g˜[¿C¸ ø0öXˆ X•0e¤ÙO.b°̃»(A†ëö7©KlƠNHO¶=¦!̣C)Íuy--O”HƒĂvOh/*ô;̀yÇ/jÈØ£Ơ¡Î)ơkP“ æô›­–eY^^_ÊÉíj׃a‘×·×₫ç~~~Ùï÷fê`›Î…* @tÑ6ăEû̉|ï¹ÊЇàj=[åđ|>—h~}‹NÛđ@PÁDù¹ çÍÈ}tKm^˜₫µOVˆ†éT€Ø.˜1‡CF ·ĂĐ“ÁùqȾù‡ …d!GÀÆÙ’¬ÚO§Óéññ‘ˆ–y1Ñđ1„¢Ç(™ê]Ÿx§8N"Ư´BX˼́ß÷jt;›À„üi ó¦ ^Ao–H¤!­"˲<=> ăP¢©(MàÊ<:új́%3 Ø{Ûơ½][0ñÉKˆă$Ns­35º„¦I«ä|¼U^ß^‡ă0ó2—Clœ˦+ôD±NivV— ³QÙµÂÉ…¸Ó¦¦w €›<³ %µn«¬Ă0¸Á´̉:È T—ü±´D#06i¨ÍM\€̣Ï--^/~P[Ÿ8V×Ơ¼Ù6Ửñ®ùº¦¥÷fœ¯’ …O¼|lœê5±¡¨̉-SÙаàµú­ĂQ_¸̃·œüÅ=µ›QQ …ÿƒĐă4fØâSoÀLöyüÔ°~y;®Í¥€₫ ²ÿ‰ë_t½¯]aKïa\Ú É?Ĥ›ª*qµ ÿ"•ă˜Ñ1 ̉º É<†æÛÅXRl“P̉ư=h·Pơé×úfÛ°_eCå¾0¬O–óă|M ̉Đ,/1?¸÷ÉäG×TX1q·˜oˆ?xçµÀFêv¶ÙF=êV{q%Ư†·à£œ7ˆ8cĂàá7?hZ‚ËM *í¥VỈ8Y‚‚QÖơưưưÏ₫·Ăép>Ă[PV@ç̃ö)[n*đÀ1è°à­×e•ფ©ü ¥V̉¼,Ï‹‡hc.æÈ“sà —ŒáV;íBƠQGiWˆ]ªâ¯Úº uˆt!¸¶6]⮦ ÿb_]LÍêÛ́´•{žƯöư·|%ü*>*̃½Ư™p|;„ΔỤ̂èó»á±÷ëÓ́ rÙĂqÁ‹ñv“Tâ3ë1ÔZ§Ó‰6ND*íƯœYa{đTuƠï}û:”^ª d8–o¤*gÏÊüH ̣.ër:Ÿxæu]ËƯz½¸ˆœÏçóù<ĐPL©£[â †C ú™½îtfkK_¹Ÿ¸ÿó(@Ÿ«0—6 -7¯¼,$ÈI{£@|µƠA`…kõ©lÄ6;Ï[ïY»”îEYŸP‹ ˆưi²„E4*؇F£”Ó»;„ưw ]̀ÍđƠÑùiMÈ'[¬¹Úf ̣Gp[n¹›ÚZlª»p©#„́åó¦'0¥º2Øư, Fụ̈­ ̉üeóŸ²ü—uE¯ßÜ3<¡öFBW (% f£ßÙXe¥g)U_¸e¾ä¸s˧÷eÜÁ`€Ơsp‰É Ħ»ÿ…ïnR¡í ư¯;å¸cýW>xø+˜Xu«Yăw‡£:ºk®@ƒwpylip×ü-”#ôáíq(S(©éæBîSƠ*»¥ECØc¿äçóùÇăvpUqÙè;ÙơÂÖ'{Üorœ>¶¸PÀøïôƒ51?µµ7>ÄU—Ç®ët*a¿ưÍ̀´’Úi\ư7"̣ ’të̀ÜRv3¨\±E+Øô~K2Ùé-9 P̃‘¦íƠöîO«p}ÓëÆ‘Jë8­bM „ù~  '½¤]́̉ÖuS„$D(0ư₫0O\9~nG?Zß2óZ½…:zxtƠ ˆxôœU} ÖVoëH”Ø(TÛ·úƒ̃ơ$Mq3ä•×e=®Ç̉3‡Ăáx:‡ÍÚ+¤ ÆHsĂó|ÔqGI6,#No˰—̀tôzÉñ Ôề+q #4§–Ă£¡[€É·‰y 8Ä)£›¤Qƒ[R[ªço#xÇ a··öv]2AüÔ&ÀÖ@[â—ÅƠ‡ëhfIº”ÇqG™—Yă:ñeNÏSü“NĐßïô/d₫úËA¥îAùûPrJÈ!ạ̊ưÚ€roܨư›7 çˆă1Ưd;ë·&‘_ @Ă¿̀`·àX§¥ù9½<¨,âE³4Ô6w'ĐSºe§m ™2pûÄÜö4M›‘ètºbz_J÷ñI8u_Q‰ơ w…¥äA´ £05¸hïqù£k,Yå Ô·û £‘}-tÖ#BmÂo¿éïdwœi‘¨%íW©$&5ÛÁ¶a₫iïϦ…ƯCŒBÀIz¢ÿ[´7¶´œL„˜Ă£.­v¨UºÎăÖ×®́o @—å´¡Q-Ï!1âªø'–)ơè{ƒ€ªÍ¥‡¸öp?¼+FEáDT)%µ”èƠ‹“%Âzơ¾[°Ăă,ÔóÊmX”ó›†b´–yAkdë6Í‘U[nf»¡X•̉ZeàðôZJ)^ØäŒPC ¿£̀›eÔ‡à9G₫%ºùT’eYæeÖ!ˆÎ ÷.$!¢²đ·Ô³®́©=l2ì[W×muÄ•„†EÀ:MJÔiQ‡Á¸ƯûR¯#U|?Ơ¾¸Ư*026ùgÈMÊÄœ´SMP˜Ơ›€ü#A°$£öO£f-£½±¤•VÁSÓÆÉk‰ªólâføÓ3Y8ÊjRQĂÇ"\)în/ ¥'|lÆlÄÚåf–:ozúw'đÉñc¤Èÿê\ï]f­ b· £¬)}}}Ï̀OOOÇ刄 åÜơ`“Ûâsí¤qúß4øE ØËmzyÄĐ¢]hÊÅ¡g <ĂĐVâÂ`ÔĐû3¼̀ÓèßSøe“På₫ ßĂễ₫F@<°GüußOcxO ¼PŒ°'8ơVÀ´%bY6đ ¿´£|í´/<èW÷ư¿B!uƒ‘/>†*£*ơ†aº®o®_^^ç£,.íGẒl}bf¡ ±fRNg̉Ÿ|oXlÄ7\7Vè•đ̀€₫mP„Ơ±ö$ @PfVÓ[g'B$Dœw“1ùø‘¶¤ƠªÚnƒ¶ù ƒË­†XÊ Úcó(pÅ.Ûx^2ä#06ËT‰H]9ªtû{™TK˜‚WÛ£̣̉¦V\µL Fd}ˆ̀Œ©S!¶»¶ăäüë—•ú¢²ó’̀ó\–̉ÁĐ’:v6··¢"é‚…‹?%åç¼päñÓ§O_¿₫².Ëo¿ưVvưÖpƒ ÷X‡}æk(“]›@‹8G}Q́*ö„bÄ‚Đo®OÄ!!"ªg› :éX" Wœç£ ÏB’*zVtt-&»@æ"“ÅÆé¢çj¸Á‹PS…÷‚±̣RGÇÓÚZ_êB¦ Î`aQ«äîê#Ú$ÛYAiE¸AÊ₫¹ĂÄ́O*(¡’@©ˆ…²Nôy‚`3Duº&  ‹÷0ơ]Àô£oOT›&@ásÈöQ¨¹ûv/d×çl“û 48¿­ùW¨˜LµBÜÉ‚ u=`9…DLƒ°€jÅŸÔă5+ÏÎßP`Ơ(ôÏyài7Ă8NŸN*'ÃÔêI/2åm₫±Yö?,ứÈ–Ç@ÔÓ₫f˜¨åí5*—Ơ’¦û{KăˆƯ“‚[r“¡Ư÷“âÚ_nÙAaPƒø¸ €L)‡J₫‘Ow&p̉ZFWưªđ•IˆùÊ+ùÅÔ z´¶‹2K,¬¾Ÿ&ô»áî₫îáÓĂ².óë|ÏÚñ±îÉå•é¿V[ïUÛơµÊ=–gxh[ W´b焇#Ù“ĐÉ6ªœÜ™ ¡Œ[yIN²Ç‚ê2U¦Kí˜S*̃eÏ%sJŒTTM ·+ÈϼØB}ˆ)2û„6ư-wK{Ñ8È6eäæÍ†›››Ưîê¸?è‰84œBÏn2¤AÄQÛ́'¼-³Ÿh¦_ươêêêx8>>=ö{´f·dûÉǹ`ÄV¿Æö ¿#+<đpu}EíȼΔ!˜Åén²€œ#bÛMưë̃C¾qœPz¦‰^/ Ç+ƯÁîϺc¬ÍyZ!&9}« Á–Ø?Ü{ÚÖ»JhXkK†a;ØFÏÛj—Áshy‰æ¢_D®™y‡₫üP£_n/ ̉ Ăqjƒ¢đˆä·> 3ơú;™¿¨Â÷s|”@rF· 4¨Ûq‡A½¯àâó±€»®¡|øFÜçf:F¼×{Vç°±aèlpc—Æ¡pÛaå±@gÉ*p T­N4Ïóéx¦©¬ç +H-‘˜f¶ ‹ÛXuù¯øƯËÆ «[́B9™k˜ư®¸.³Ôÿ/¼­ÅÆä•Ă5”̣ç–&¤oAÄOM#`™̣ä’å?̉8 ĂHcI₫±œ̣{€Âë́™­zzÛ™QƯH¿ŒèMWGB·Ư^ªGê*ÎU¶̉d[‚¢;祸—Úw± àơanooïïïïîî¦q¢d@ï±:ÔY WœWĐ`°|› ؽƒûS1l{,Ùó"ôç(íÔ˜$~tÊ©«ÙÙ₫í J.¡än?h%·ÜQ{xï9ñi[ÈB"Ø·[å7åîêV,“kTV8 7́(3ßßßß̃̃ÓØ-³uq†ÏŸ?ưúuÚMî]¾%Ư± Údéúø/·Ư›™i¾~ưú÷ÿùï¿|ư²Ûíhăƒ¢₫8Fùrµs±»QDNçÓa¿?)_EQơ…[œùÀ¡Z¥?̉ƠúäQºZåó• 4Aƒ„È«Ùn—*¹”mxN¸~ÉÁ€æ}Ø ë $.^:¶˜/¦]]]]í®Ü\c»:Ï/ tl¦}ëZ× »>l·åø6Iœ8Ñykµú<íÈpFY@Ÿoq¬ư1L¹¥©6 øWgCéP‹hËÊÏ÷·K‹Ø;[œéŒÄTægu&¯뿉TÅ3«°­ä;4ơ ÙöŸß̃̃̃̃̃æùLlÓ0ËbH7$“íê{·‹îƠH‚ÉÙzw7س#4È?at¾“¬‰4lúŲnô:̃ÂîK^$€e4é¿ÿ {ü#ôÇÊèv@b×Ă¾@Vgq:ñ±è¡7/Çé!u­‰¨&´z̃¶ûlèç-̃B€́E|Iû5¤ÙëÚ§ÓÓ‚§Xư¸s4ç‡L̉B•Ld5́À„­¨†ÉĐäjg̉™ËỘQséK™ŒiÀPLp0:AØëwÅ-„2Lƒ̉e½cáé $‚ –•6ètD1{ÁX“fƯ8Æ&;ä)×BH¹AÖ“Ëü©DSƯÈ4Đ Áb‹ÈºiÛ=îwz@s¹ ̀<ăŸ₫ô§e^~|ÿqXµ&~bvgën·ûüùóíííϧ§ăñˆ]gĂêW8èX„Iƒ¨b©]×7MBœÏçùưíưîöö|>¯ë¢€–#à™,ºƯ(×Ë̀nÄÓ%é=G›)£ùW 8?¾ÿ†AîÅ™H\­yiˆ¤¬›wíæA…UZ”¿Ä£¦¿†w9Z8~cüiƯ›'`¼WÛ.´RƯÍSotXëäÁ)èsjÛ0äø™»¥µ‚~h('üèîÊ\¬íÑ9et,¹Tc4LáƠECƯ–u‘W9(ÛV½Đubs-\ ÏuB4zÄWă¶ê½62YTÂtá ïå†WØŒƒº™…[*ùMP nËÛ€#÷¿#Đ$́ÏIĐ'Ø•^r-Ơ[e-»±Ûx¡¬6»cƯËÄÄëºjÄƠî̉?CpOQÈË’D‡â]–UP/áÊîƠƠ#Y@‚XÂ0Ѱí!(„ª̃D:Ù…*ä Ø¬ñcl뺬ûy¯fƯơØh¬ÀT7ö‡ƒ~IÈpj@W°¬ßGn@KñÔ]ü 6üÑ„~¥a ˆƒu·'Ă’€"”]ô_Xèÿ úÛ:`‡₫¹íñÏ-¿’₫ñEôOUZ=Đ»~F9 ÂÆmWjr0 ĂƠƠƠ8˺œÏçÓù„À½̣ư°Ă¦¤e×BÍĂVƠ`GÍơ§ÂÑlYöûư÷ïßçe~~y>NơưÊ·€É₫àsR—Ư÷€º@ZÛ̃b§ƒƠ¦±₫àØµ29êë̃ÍpN/ÓơơơçYäùùy]WhL5np“”7"guTXµÀ²™H€Ó‚’©A‡@êbXíZ,°1æ9I[UƠ1Ls„Îđ§UŒ†ưcŸˆ®¦óê4vĐ ar©₫©ơ÷)yå̃iœ¦q‡QOèsÎṚ°’‡ă‘ˆlkÈ ‚Ö(Lv́Dÿ*E Ư÷&©ˆ̀ËüăñÇñxØÅQ(Veǧ~†úX…Ûđzëe„Ä©;8+1Spz×u=Ă0–Ä́e3ç±(‹¸Ḯ³‘))¯0ĐèS¶ I­.cç<ƠDÜ(A »$A 0 Í÷r+-S"Tƒ©“.ˆ8¾µ4ÅÁ%÷Û`V…‰«GöØÛ¾¢‡¯=ß–«ð»ÚÍçYq¡¬£¸%úÚ¯IidØgbß<ç®Tädªa¶8K&{íä,$Í»®0:ÄpRÁ:mÊkßFÜß؃ÛJ"TtᬌƠê© W !LºZṆ ƒˆ).Hro¢¶qPñ+p° ³”“ƒÅU0¡Û0ûº¼ÀDÆ6¢³‡Q…¼»ƒØÔ3~ç{#¤~zÔJflƒ¥Èù?Íg3ưÿ6dơ€º¯¿'huïê}œÙkÍ̉ƠÜx½ü«´":âơ'ưä‘SƯûŸï¯û~ú£¸pW₫èÀ£Fu»ÏnÎOÎû‹t‘€k‚Xÿ¢!±ÙAÑ£dÔk«‰¶"×zÿÀă4̉BçùŒ`×à>‘°K¦DôD¾9è8 AÖư1l¼¸Ô?…d^æ···ór>çù\†́œ¯ ́ Álưë½m§13içÁPh‘sré½ ­0hK&"ºÚ]}ưüu]×··7[ˆŒl“pñư˜w¨ỄÙ±ë’åÀ{]nŸEôî!cÓW»«»»»yßßß›EƒÄPDî¸vÅIàĐ…EwÖưă(©¼Ü¡6uán“MhY–ççgbç™6>Ú^›5LóMçó9Ïèn^¨§å IÛ#%%ªªx”£N§Ó<ÏóÇÙG‰%Wë ¾A@ÈÈèƠ°Wdå“@]€]=6Ơ-#‘ûד›e›)= ÔøÅ­/§:@€ñ đ©-ÛÅég1ĐHB£$b@ˆ B°¤ư´m₫-đú×§1&üÀKÍ«AÀç…Æä ¸¿L"ruu=ă².åô¤{*ˆ¬ëZv‚[Ö%p̃n/ê\tû„"1“0ăæz¯,DJVYçu><WƯèG‘Hđ«ç€ËN„́¼Äå6Ơ½Â V$ü ·̃Wß#̀7 hŹ®Ă7ŒĂn·[–¥.ó@¶ØOT5“N’kHGZ5RBưP£Ăa]ưIq¼ø™vÓƯƯƯù|̃ï÷²:=noa&ùøQÔƠA“0¯­!î>S«Zæÿë#$˲<>>2sÙ9'Œ£cq£âeY^^^aH$Üöp0S ÿº¸GÅfMRM$"˲,ËbÎghƠ"ơ‡;.[ô\7%&aHµ₫À#B.ÍÇ|°ÂH0k}ÈÛÅL^|m*́S>@̉ÚÛö5€j|¤Q0,[÷^pă7}B( ŒnÆNÀBàœyacôU6FhnÛƒ¾½½ ă ‡@đP¹#ˆMmuih¾ó|Ü€6<óPụ̀8 oQ°æÙQÄhCö7µ5/º¾#—ïêR IhM:'¸@*ĂơÔ^?̉¶ %¶VçP'xÙ‰Ă€¸¿Î½»øÇ)‰vÙyĂƯEq,Xá”̉ÖÑR‡…b}‘ù´ƯÂíEgâ”ôDùf¼k³­™PK¤'œó‰5¹ÈPL Î; , Đ!T& ç5Â^¯Û¿º,º»"é¡ñưÊ(°ƒø†³ñ"Ă¯-{GŸ€´nX^3₫ỡ°Åg¿TêĂü ] œĐ̃«°R‡ÓI³3ưúơöööx8üå¯Áüâe]ä,ưÏËŒ¾îßßrß%eÑä<ûđp£ê¡öåØơSÍÛ‡\ ß œ¶Â¾₫ù_é=°ưªbª.Î4-‰̉&¡…,¼ĂSØ"ZBîWD`l}HÍdÎóüúúº–µñ C Œ‡ÚK§SüÖ·(È£t-'¢:S”ÍIËg æâÎ6)ï…wÍó|8Æa4#!Î6gcVº®Ăf…@ĐŸPµa+2ùʧ¹óÿạæ Ï‘Óé¤[ ;¶"§ ³kÚº®! ¦élemÓG‡µû\f“Ë´zª-¥­0¦›ÀWS±¥ÎkDŸ6‚y»1ú¡xăđ•Vg{c¤ ¤Ÿ¢iơ¸wV‰¤´ .±₫ä~ ª±Ă©Yhsö´ÓPCÖ¹gđµDà,ơ«}AâS¤¦/ÇYè0u/+üG›&#á¡j𗬻üị̂Hí©èV»_Îÿ‚¡×9́̉MØ ó™”hc¦B;Â4º{¯©w¿C­•é+Í?Dơ"Öd¬°ƒ†8mă&ÄÄ%KÛ»®kIiÆGÀ‡C§©Êmôoˆỵ̈£yù^˜UNà8:WJ+ܦ†3¾L¨î—bu@"; 38j&2?â)w®˜,j(T} ód`"›tmxûˆªk•¼q]G¦O ?°ƯÎé=ú„nMIÖ_½ Å^¢21ySc"¢ÉA`m‹^•‚âÄhăñúº®Å¦û =°' !ư»Ưư›™'|µm‚J©[­Û₫µ³ÛŸñÀ/u†tÜ/ø ñµ2ZXƒ$Ö̉*Óa.ù(­XæÛÛÛ»»{‘•˜ ² °›ÚNü£U×ûj’Ö¸“¸q]¬c¸CÖMy”ܤ6Cv=L@ílöO®¸¸³,¸G½ë¿ê¼× ø§!{a=Óó °7(é_Ơé‡Ăáû÷ï²í_̃FWür^“óâBº_Ç=7i4Ă£̃ nXôưzdA”(ü€¯ §½dNHë?S_͉²/ê₫ld¯̀kk/yµ†]DTÀƒâ9tr\ÏPÄsÜcßQæ©~™‰£i¾àZÂv÷w÷ă4N§ưaO)@€¾›@4»ö¯À¿AÚ‚°›Ÿ„å‚SíæhNçùÎwtU+àHÂY”5ÄÚ±¨ÄZꈭ’=OĐ ́,ză ^̀F{ ̣ïœóÔƠXá́–Ç*©íN^"Jxn ó‹R"n‘T˜*Û®¥Đdf®éÂ_Ÿùƒ³"ô`ü vìΙ3P4ËƠƠƠn·#¡Ăá ü}J >µ́}£Ú{]L@ rÛ½Çöûo¬¿;ÿ«—úÿëi_¡Ơ¾_¶±>Ê "–eYæùt>Ÿí„5DÔà8¦̣»m@¾×DÍ€nÑrŸ«d*i­(¹zm±A«-!ă+›o ºCäd fåiº&8OoÇt–W´ema ŸĐui¶:!?¯8̣†˜ˆÖe=.Ç€ªñ‹€³^Å‹Q×hMüB¢3‚$ơ 0%…¡jÙ5·8üUöÖơ|:S¢íM„³ 3¾á+œˆÿ-ä=đđË/¿|ùüe9////‡ư!ĐđOkQ́:ürá•yøRAÁM“´™˜³ñ́€ËĂ@wQ]ö p”ñÔ'̣z†<ŸëëëyçóÜu3ô9ư»IV–”×̉(Ù¸çÎT¥r½) 5}ÏssBîưáKC£œ>\b7†ÊK¥(̉¸@çF9´Ëµ±;—„·zRD̃̃^§Ă~¿/‹Ÿ‚*W$q?Pơû6óUñºnĐ™…zT:$†!.×­úÜ[1¦«ƯƠy9³pÑæZ@'s lAœK]n)Í D̀غèDy¦Í®¤™Öaz¤u₫£H‹[[’lΦÆj4¦û©-ưhª; LùÖøë8L¼,‹RÅ]́£ä†iÂ,h¿›.M` $BU‘ø©LÄÀ_>ùơ×_ϧóùt>́aïβcOp-²ØÀ“ —{ ±=Â_3fZf{Œ.(Ḷ̉«×:ë(ä mèù­j„/D4í&"ZæÍpđ'ĂÁO»ÀYÏ{₫Â'°₫ü‘d#ª°‚x;½1A>€Î]¥Jdm§ÿÁ¶i’}ß{G ‹ÀèĂ^wh‰đ_ù«ÿ³-ÿƠ ‹¸Ÿ˜đ H¸SÏ!I>€Gʆ€jc?À²I«tu.³5ÜMñ†XY§VÚåĐÛÊ…Ñàîu4 ´g`ún?CÎLDÏUå_/uZ(­]G½ù’Ñb:[ë£À•0ÇĂp É×±V 0Z@×ƠMU–ơ Đ›íwÂßiÙVÈÖÏâà~g—áG, h͕ϥ;Mº<̉½Â~ĂR¢±¦ëüWKNÓôÿđŸ?}~zzúñư‡´EE5£‡âx±¼ó…Bô_Eÿ–öƒp_h‹ ôOÜúÓ\ñ£*g)ˆé8 ĐÈN”…Däñ鑈ư+d'DØdô¹azÄÖâÎ#p jQđ̀I&¬úæØrx£₫ªŸa~ùơ—ç—çu¿Îól÷âc¡¼.5qÂê“vĐ‹úL­6µ ®!бđÔ'F‡ƒw…¼t„DGÖe0\Á¥Ñ d́QÖJœöê&åƠÄNÖ4ưîf«·.¿ê½> C9ĐMĂ;Ùä3OâÚc‹Í´³µ?l¬Í\‘~?‡Ăa]l:yơj”R#+;{Öf¸C·Z¬Öm I¸Ä¾Ơ’ D·m#¼¬‹Ù¬Ü&Đ÷ZÅéiÔÔeŸ¹c7À Ÿ3 ̉ƠÜæå-êºLÈá‘~ÖÆDÔͬLE‡é€Óµ{&[åA4ÁÚÇÓÊư6^¼R[)› ØpÆîđ˜ H{N¹̉’©ØŸ¢J !™-,ôR)¬̉ˆ1c@|mVQ3p…WB³kSI\”¿è$µg²)(ñÚqËq®“ôê·¨3cAØ»F‘¦₫u8°4­íGÉ&·ư(s™ÓÎđXé4°ăxYŸÓá1«ÄëtÏú±)\¦ˆÂ†êKµ%܈ƠÖîZMB^œØîÁ‰µ\¯&e=qajœêÓRº:+পºÊḅobæ¹³S[[/IGÑ©•́†́,p¶ÙaµZ]­̣µ_x~è̀bïHh¦a‰,#WỒ«¶kRxdQå¶5ˆăk†đ—ôS£BY÷釴ĂÙ<ŒĂX¢Ïµ˜Tc\đ)@¸%¨~ ßơẸ̈‡8@]ö×– dôÿK~–ŒX'IB0Ñr·?ënâb ¡@ů,:œ†‹«I@Î>@y|fæ £“€åâ¯à xè_’ÇF§iº½»=r—&­„ƠÁéyk‚ëTg› ́Û^IÍ}BÄ_î$Ưy]é=1Ă•aÇ XtøFÜo}”Ô‡óMˆË— Ø”®̉Q¡ù—jx—×»]› î%ä½`­BâÀuf"§ÊC•"ïBâÊJßç7¬XÄu3¦h¬1ZDÆq|¸`æăáXvU.:6|[æÛzo¦q‘*úK:9D¿T{@Qè Đ£ÖBÅÉ,?îaæV ÏQ¥i¾Pă/ú…„lÚ*†1×óϧ8.–ÚA ÄƯCÁÊ¢F¦9GJ+ =>>îß÷ooïh đ."ÛÔŸ[>"₫°®wíÔ¼ÿ‘lƠïHùÓ h†·c¿4ƯŸ1ňâ×9‰ #³hŸi0EÖS°¤%`èŸ gÅgéPBÿú̀0QÉ[¾P &‰Ï*YûmN»m=¥åƠ,ẹ̈¾?Oó<—Ÿ†q •V^ËzV€.47˜”º»̉•‘h'ÂíV¾Am,4ftp ĺă#`A=¹éàÅ̃•ÁĐúñëƒă•[ºù‘öoaû÷vj̃ôû¼̀ÔüĂ|=‘vöR_ ÷PËÖËçêúêÛ¯ßvÓîû|_hQ6a¥ơx<.ç…ÛÎÚ‡Ê0¿ºƠ9NÉ?œpré׆tûeOUb‡g +y´Ă6…ºơN Шûpß:XgÇ ø £Æ5âX`³g2"¢+Û3ç?u%öƒOJTû`²l åÖ3Ú·°ÀA1C¨Ó6=Ñ«Dœä0J®X·+4¿n«L[ƯÀ>‚'1E§ } w#Cz0¬áù¬»Ö́}r7æ*EOŒưúœî¸“cCóXt|idơ`'-Ÿù¼ĐÁ÷»"\KÇä ¶ÉÇ&(¼î¡z˜ d6;ĂVaÜÓ|›!êk ÖüæƠRe´']wqă>Ôè đe«°mÜ.êá{açÖË5¼àçl‡Óú̉`•IW”ÉZè,¢MyG–Ư¯3v¾xºƯd/Mº­ùåDE;2ăÂÔ3™”Áw:3 F(ßu·¨k¤ÄM7íX×:!ÔđúE/¤·́01Ÿ‘²´“¼†áë/_O‡ÓËËË~¿/…‡q¸¹¹9çă鈫S" •D%[p ß™¡ÿÈ;Óđ·S ÔfOG |0ód•Yæ3‚^ĐT̃óQR‡a8ŸÏå6U!ÉGûÑrc˜‰h&n{T“úåe•óÑ‚ø–áðí¦₫ )=Ơ3Ù)ÂBå Bỵ̈LƯüÇ1ưp˜½¥eiÉ’ä¼’ç ế(*µe¶NÅ ÀĐÈâ·œưNà Ä¥Àø¯ºªv1€9?¥ÅÓ»Ü{!çÇ?¶,˼ŸơL¬1§/]¤F ½ `Ú«£bñ-,ÖáØÀØ3­Ä ZâäÿÇZèvđ…ººêÙ¢êd¡€MCq:(ëâîưµbétw¾Ú]}ûöíááá_₫å_N§%’R̉V¿5 « eÚdMÓµë ́¦º­$Bí˜DA®3-:)BLçóùùù™Û¶6u,Ú|ljM¯…)i₫ è%½+NäVÚÊxsˆ£ƒ Ñ&°|ÚF(¢F†Ư\₫u“F"&ónx‘Ës?*®$“₫a­`pœ`Tn-Z«Ü¿Ø Z@ó"²x Ö·lZ_Cư|Ư¼vèÎ/$¶IÎuWj*¼Sœ¡lœîXßăuÊ`Óœ)‘¸³>6ë:<&oø ³Đ^` s”[„Êa,Ü55̀ü€ÜêúfS7JänI§gưBe¾¾¾ÇQwQE§ăåœÛ̃¤Á1™ÄeZ‡ö?>G»Â¥©¹BBG(h`×L:e"IÍ¢¦ˆ—Ï ’¤`w0™×!¤Ó°2!go•ơx<Îó¼.+•,ÜÁ¥•jÇ2óçOŸæÛeY–B`i«ÇiĉS ׃Ɉ¤àj ¡ªØ'Á¿ơ”pçèny­y›Ô0µ CÙŒŸÍÀµ¿å%ƒ÷úda= Hÿsù?‚Fî}7®mhM˜Æi$¢y®›î) 0Ô¶í÷~‚Bm¿ÎI[ÔûT5̉KøpxT¾¾†,~rWªđá.Ÿềë*ë².y}Đß„Xÿtíj…­g˜Ê"PFµ€ó|È?9y¨npÄ­˜ )~€•y¾̀¿®]Tü¢¤„Ôl†ŸƠêäGïïïÿñÿñëׯ¿ư₫Ûù|V÷IƠ VX o83XF±°=¿*ĐƠơjù?MëdL`+€d̉~¿ÿí·ßˆ©$#ƠéS æ~”“@ ¸“o‚®×"Œú{ö«R¹¤kÎ!#ĐªîÄ#U9˜œàt‚ºEé(Ùø÷èäD33̃@V¼~1ùgËXd»µ­́™!¤Ö°M·R»­åU… eL¨@È#lơĂ›íó ‹mdXN̉éu k‚ D™¬>0å»5S<8LªU°CÜ₫C1y ¤´đT5çMA‡4(‰³¯^„Ë[9ëĐÀȯ#ÙQ‡û‡û‡û‡···¿₫å¯ ñ qèªCX@3qˆË4wŒµwÏ2^×—:̣%wëîÅnñ̃̉hơµ_­axđÊPàÜtÅn1Àd(¿̣àf˜ôÈ<Ï˺èº5ơ¦Đ£.ù*2Măn·Ó!>…b^—µ j“må­ˆ¨¬x)ơ·e!H…xôß\3×âÈÊaf`38¸ƠEñ#ø`Q0˜ÂŔ@àŸƠ‚Ö˜™ ,æ}¡W0ud‚üËåÉÔ4ºËÊ đ^Ư ¥@8Á¢W0ç(j´“,Táíú0 #5ÈoüÏm;ÿ°´€Ûê‚Á6îr¼~ư ´YœKø} aˆH!ÍơoÛtê„¡œÿÓ0«F |́ &(‰ÔùË¡sqN5ÿR)üR@ùr“ ™d‘rh€Ơ1½Gç¡¶q’ÀE&Æáó§Ï§ù´?́§c(₫Ư«}_‚_§7j̉ !Q0\€ëÿh#¨ÇéK. aÜJ‚ĐâƯΘ¯¯¯?}₫ôåó—Ư´3MM—̀̃+ˆ}‹Á#äl‚k÷zLœu(-˲?́=³;*§.‡+ m`|Z,Ù½èk­cxI³¯X́¶èÏVđ£fk.àÍG<́äàmW#f|¹+đWÁ•¾́d,Û§₫èĂßV̀oÓ‘9Ëü=²t²Q>öeºCÆz7ı‚ae{¾£µnsa•Bˆ3·4[»©eÁ䙟ƯpÚ3ûE0#ßÊ(îqk¼c`w¦ÅH ëÛ1ÑßN&«3^”¶ ₫‹K‡ơ`H ˜[«z/ ®'Aw»ƯŸ₫ÓŸ¾}ûv}}­=få5ƒz₫ÂH…¡́¦ˆIcû»³8¤/*­zxK¸±Ó3¡¶BùF§YºZi]×Óét:ŸrÅ~I¡W•›ÄaSWü5úí[£°U1@op{¤èéƯªÆ…_³c`*¾u–₫CtÉ?*T )KG”a_·ØåZ¹?¸‰¯È Q(Ơ "`MºCƯ¼øg2{è[v<1¨+Ô-¾"AöLF\/ççHôÆ77dÔ²R·‹duúÙSÈÁsFz.GD]Ă·tfχÙM»Ưn7ăV‹b¬`›’ư€[e=́oïoÇă‘6Të…ɾÿ-¼‘ \l M¹˜-Q:®GÇ®ÿåoÿà4ÉtLhï¹®Ơ†àŸáWüSÍ”\-³Ê²,O?ŸŸ̃ß̃kÖºÔÓHmĂ%‰³Ơ)½T+¬Ø¶+~Ñç̣̃]ˆö'¤•Œ\!üD—M¹©ÿ2ŲxÄ+^!¨åÛÖu¥̃® 1½¦@ µNơƠåzP†Cº¿Gÿ¦e p,C₫§†æơ¨¯ºçÓ8MăÄÂë²ÖŒf©ÿ¶ùx/…]GcÜl^v£Q8¹.l•Ơåÿ¨ôKœ 7PNmuoÎÎW!0éæDZ<ØD|‚e…\øWq¿´¼ ‡é×´Z /XçP[iÁtéÅ"t&_]]ưéïÿôúúúøó1´Ó¨Tèí$cÿR#0@ k2ëŸÎ'ô c̃? œéb;†s¾ü,Ă2ÔØô-§®«2B̀¡È̃ÏŸ?ÿơ_₫uÿ¾?ŸÏÆ 3(ÇäÆ(»ª5©#{’̃ ”9âî͹E='—µ?[ù)$0¨,îÏ ³Áeÿü„̣ÑC »€»ÚÓ_ßÈư4*h%`ì®_4¯«#œ¨öĐ¥™ïmOqsođä/z¼1 ¹. K₫d56»êxeÛähORËæBCn4,ïs‡₫0”Ă´.­¤÷tú &]'v_:œúës2¸·0ô!AËơ'‚ ÛV̉¹O‹rn’FÈ׿E‰ê1iọ́¢a&Ÿˆ&¡ûûûq÷û}Ù‹ …8¹À›r5éN)jWX úôóéåơEí5îß™`AƯ©‡ nGX¸Vç¼ô°7?¨ñåÛIPî^­CĐënđCåm“Q) d³[ªĐÛë|¤¶éª@ç‹K=ÖWcAí:cÊMëI“¨ưKEæe~üñhZ«ñâŒ9°̃ÀémÄÛ(¨Ư…é!8ß †÷ qD¢ i+|×;u¤51Í\Xl²O†t2£ucC)“ÍLu,˜§iº¿»¿¾¹~}y=¡å ƒgôñßâBô„èv§ÂåC^oè'Ü_‰G+úÜễÛëÛ_ưu7́ŸŸï]€&[!ü*C~CçSƠ5: pæÄ™)u;üp’® „Á²…“îXOˆøC0¡|áNâ¾ÎC'%ÍfẠ̈ĐÉ{ơ§µ!~z‚­Đd!X\v§Bb@>öB~íÄLˆÈé|z}}}}}­[£[1qç{x \•s¤êñ«†?€µ&L7ÈJZ—‡©ôƠ*k±ûưסø3ä³ëKd_@¡«#x8t²I/fÏ÷hftóqpQæ›ü(́Ç …óŸêv*øYi‹'0@?doD]“̉Đêæ`à@«´£_áz^ᙟP6 Pô Ƕ[M‚¹‰́nñ̀Kæ\•à” …ν)Vz#L̃®Â. case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mecanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: pong2-0.1.3/m4/0000777000175000001440000000000010473646145010073 500000000000000pong2-0.1.3/m4/acx_pthread.m40000644000175000001440000002224710473646145012542 00000000000000dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) dnl dnl @summary figure out how to build C programs using POSIX threads dnl dnl This macro figures out how to build C programs using POSIX threads. dnl It sets the PTHREAD_LIBS output variable to the threads library and dnl linker flags, and the PTHREAD_CFLAGS output variable to any special dnl C compiler flags that are needed. (The user can also force certain dnl compiler flags/libs to be tested by setting these environment dnl variables.) dnl dnl Also sets PTHREAD_CC to any special C compiler that is needed for dnl multi-threaded programs (defaults to the value of CC otherwise). dnl (This is necessary on AIX to use the special cc_r compiler alias.) dnl dnl NOTE: You are assumed to not only compile your program with these dnl flags, but also link it with them as well. e.g. you should link dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS dnl $LIBS dnl dnl If you are only building threads programs, you may wish to use dnl these variables in your default LIBS, CFLAGS, and CC: dnl dnl LIBS="$PTHREAD_LIBS $LIBS" dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" dnl CC="$PTHREAD_CC" dnl dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). dnl dnl ACTION-IF-FOUND is a list of shell commands to run if a threads dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the dnl default action will define HAVE_PTHREAD. dnl dnl Please let the authors know if this macro fails on any platform, or dnl if you have any other suggestions or comments. This macro was based dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. dnl We are also grateful for the helpful feedback of numerous users. dnl dnl @category InstalledPackages dnl @author Steven G. Johnson dnl @version 2005-06-15 dnl @license GPLWithACException AC_DEFUN([ACX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_SAVE AC_LANG_C acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) AC_MSG_RESULT($acx_pthread_ok) if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_TRY_LINK([#include ], [pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], [acx_pthread_ok=yes]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($acx_pthread_ok) if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_TRY_LINK([#include ], [int attr=$attr; return attr;], [attr_name=$attr; break]) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with cc_r AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) else PTHREAD_CC="$CC" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else acx_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl ACX_PTHREAD pong2-0.1.3/m4/.svn/0000777000175000001440000000000011103705356010746 500000000000000pong2-0.1.3/m4/.svn/tmp/0000777000175000001440000000000011102252642011540 500000000000000pong2-0.1.3/m4/.svn/tmp/wcprops/0000777000175000001440000000000010473646145013254 500000000000000pong2-0.1.3/m4/.svn/tmp/prop-base/0000777000175000001440000000000010473646145013447 500000000000000pong2-0.1.3/m4/.svn/tmp/text-base/0000777000175000001440000000000010473646145013453 500000000000000pong2-0.1.3/m4/.svn/tmp/props/0000777000175000001440000000000010473646145012722 500000000000000pong2-0.1.3/m4/.svn/entries0000444000175000001440000000057211102252642012252 000000000000009 dir 17 svn+ssh://ypnos@svn.berlios.de/svnroot/repos/pong2/trunk/m4 svn+ssh://ypnos@svn.berlios.de/svnroot/repos/pong2 2006-08-24T03:07:08.219329Z 12 ypnos svn:special svn:externals svn:needs-lock 5ce0cf1d-66ef-0310-bb44-d85e78f408c5 acx_pthread.m4 file 2006-08-25T19:15:49.000000Z 0da6c37decf5e9e041b5a42608433db7 2006-08-24T03:07:08.219329Z 12 ypnos pong2-0.1.3/m4/.svn/prop-base/0000777000175000001440000000000011102252624012630 500000000000000pong2-0.1.3/m4/.svn/text-base/0000777000175000001440000000000010473646145012653 500000000000000pong2-0.1.3/m4/.svn/text-base/acx_pthread.m4.svn-base0000444000175000001440000002224710473646145017035 00000000000000dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) dnl dnl @summary figure out how to build C programs using POSIX threads dnl dnl This macro figures out how to build C programs using POSIX threads. dnl It sets the PTHREAD_LIBS output variable to the threads library and dnl linker flags, and the PTHREAD_CFLAGS output variable to any special dnl C compiler flags that are needed. (The user can also force certain dnl compiler flags/libs to be tested by setting these environment dnl variables.) dnl dnl Also sets PTHREAD_CC to any special C compiler that is needed for dnl multi-threaded programs (defaults to the value of CC otherwise). dnl (This is necessary on AIX to use the special cc_r compiler alias.) dnl dnl NOTE: You are assumed to not only compile your program with these dnl flags, but also link it with them as well. e.g. you should link dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS dnl $LIBS dnl dnl If you are only building threads programs, you may wish to use dnl these variables in your default LIBS, CFLAGS, and CC: dnl dnl LIBS="$PTHREAD_LIBS $LIBS" dnl CFLAGS="$CFLAGS $PTHREAD_CFLAGS" dnl CC="$PTHREAD_CC" dnl dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). dnl dnl ACTION-IF-FOUND is a list of shell commands to run if a threads dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the dnl default action will define HAVE_PTHREAD. dnl dnl Please let the authors know if this macro fails on any platform, or dnl if you have any other suggestions or comments. This macro was based dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros dnl posted by Alejandro Forero Cuervo to the autoconf macro repository. dnl We are also grateful for the helpful feedback of numerous users. dnl dnl @category InstalledPackages dnl @author Steven G. Johnson dnl @version 2005-06-15 dnl @license GPLWithACException AC_DEFUN([ACX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_LANG_SAVE AC_LANG_C acx_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on True64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) AC_MSG_RESULT($acx_pthread_ok) if test x"$acx_pthread_ok" = xno; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items starting with a "-" are # C compiler flags, and other items are library names, except for "none" # which indicates that we try without any flags at all, and "pthread-config" # which is a program returning the flags for the Pth emulation library. acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) # -pthreads: Solaris/gcc # -mthreads: Mingw32/gcc, Lynx/gcc # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads too; # also defines -D_REENTRANT) # ... -mt is also the pthreads flag for HP/aCC # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case "${host_cpu}-${host_os}" in *solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (We need to link with -pthreads/-mt/ # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather # a function called by this macro, so we could check for that, but # who knows whether they'll stub that too in a future libc.) So, # we'll just look for -pthreads and -lpthread first: acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" ;; esac if test x"$acx_pthread_ok" = xno; then for flag in $acx_pthread_flags; do case $flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $flag]) PTHREAD_CFLAGS="$flag" ;; pthread-config) AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) if test x"$acx_pthread_config" = xno; then continue; fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$flag]) PTHREAD_LIBS="-l$flag" ;; esac save_LIBS="$LIBS" save_CFLAGS="$CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_TRY_LINK([#include ], [pthread_t th; pthread_join(th, 0); pthread_attr_init(0); pthread_cleanup_push(0, 0); pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], [acx_pthread_ok=yes]) LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" AC_MSG_RESULT($acx_pthread_ok) if test "x$acx_pthread_ok" = xyes; then break; fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Various other checks: if test "x$acx_pthread_ok" = xyes; then save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_MSG_CHECKING([for joinable pthread attribute]) attr_name=unknown for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_TRY_LINK([#include ], [int attr=$attr; return attr;], [attr_name=$attr; break]) done AC_MSG_RESULT($attr_name) if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, [Define to necessary symbol if this constant uses a non-standard name on your system.]) fi AC_MSG_CHECKING([if more special flags are required for pthreads]) flag=no case "${host_cpu}-${host_os}" in *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; esac AC_MSG_RESULT(${flag}) if test "x$flag" != xno; then PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" fi LIBS="$save_LIBS" CFLAGS="$save_CFLAGS" # More AIX lossage: must compile with cc_r AC_CHECK_PROG(PTHREAD_CC, cc_r, cc_r, ${CC}) else PTHREAD_CC="$CC" fi AC_SUBST(PTHREAD_LIBS) AC_SUBST(PTHREAD_CFLAGS) AC_SUBST(PTHREAD_CC) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test x"$acx_pthread_ok" = xyes; then ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) : else acx_pthread_ok=no $2 fi AC_LANG_RESTORE ])dnl ACX_PTHREAD pong2-0.1.3/m4/.svn/format0000444000175000001440000000000211102252624012055 000000000000009 pong2-0.1.3/m4/.svn/props/0000777000175000001440000000000011102252624012103 500000000000000pong2-0.1.3/config.guess0000755000175000001440000012463410473646244012021 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-07-08' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in *86) UNAME_PROCESSOR=i686 ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp 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` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: pong2-0.1.3/install-sh0000755000175000001440000002202110473646244011470 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2005-05-14.22 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" chmodcmd="$chmodprog 0755" chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test -n "$1"; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; *) # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. test -n "$dir_arg$dstarg" && break # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done break;; esac done if test -z "$1"; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src src= if test -d "$dst"; then mkdircmd=: chmodcmd= else mkdircmd=$mkdirprog fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dst=$dst/`basename "$src"` fi fi # This sed command emulates the dirname command. dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` # Make sure that the destination directory exists. # Skip lots of stat calls in the usual case. if test ! -d "$dstdir"; then defaultIFS=' ' IFS="${IFS-$defaultIFS}" oIFS=$IFS # Some sh's can't handle IFS=/ for some reason. IFS='%' set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` shift IFS=$oIFS pathcomp= while test $# -ne 0 ; do pathcomp=$pathcomp$1 shift if test ! -d "$pathcomp"; then $mkdirprog "$pathcomp" # mkdir can fail with a `File exist' error in case several # install-sh are creating the directory concurrently. This # is OK. test -d "$pathcomp" || exit fi pathcomp=$pathcomp/ done fi if test -n "$dir_arg"; then $doit $mkdircmd "$dst" \ && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } else dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. $doit $cpprog "$src" "$dsttmp" && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dstdir/$dstfile"; then $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ || { echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" } } fi || { (exit 1); exit 1; } done # The final little trick to "correctly" pass the exit status to the exit trap. { (exit 0); exit 0 } # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: pong2-0.1.3/README0000644000175000001440000002472110473646150010351 00000000000000 ======================================= Pong² - A Three Dimensional Pong Game ======================================= Written By Johannes Jordan (sijojord) SUMMARY: Pong² gives you the opportunity to revamp the old and famous gameplay of Atari's first game. It uses OpenGL for drawing, has really freaky visuals and adds another dimension. Now every player can move along two axes; and instead of watching the playing field from the side, you're perspective is first person. Therefore everyone needs his own PC - this is a networked multiplayer game :) MANUAL: To play this game, you have to start it regulary on one machine as "server" and tell your friend to connect from his box to yours. While you're in server mode, you also have the opportunity to do some practicing and get a feeling about the gameplay, your paddle and the ball's movement: You can play against "Mr. Wand", but be warned: nobody could beat Mr. Wand before! First important thing to get started are the command line options, which you can ask for by using for example the "-?" option: ------------------------------------------------------------------------------- Usage: pong2 [-n ] [-c ] [-p ] [-w -h ] [-b ] [-f] -n set your name (default: Hans) -c connect to already running server (default: act as server) -p set alternative udp networking port (default: 6642) -w set x resolution in pixels (default: 1024) -h set y resolution in pixels (default: 768) -b set individual bitsperpixel (default: 32) -f operate in fullscreen mode (default: windowed, toggle with 'f' key) ------------------------------------------------------------------------------- Now while you're running the game, you can press several keys: ------------------------------------------------------------------------------- q Quit the game f Toggle fullscreen mode p / ESC Toggle pause mode. Note that this affects also your opponent. In fact, really the whole game is halted in paused mode. Toggling pause also toggles wether your mouse is grabbed or not. F1 Set camera mode to "Free". This means, that no automatic camera movement will be done. F2 Set camera mode to "Follow Paddle Reverse". This means, the camera will follow the movement of your paddle by giving sight onto your paddle. F3 Set camera mode to "Follow Paddle". This lets the camera follow the paddle a little like you're standing behind the paddle and want to look through it. ------------------------------------------------------------------------------- Let's see what you can do with your mouse. Moving the paddle along is a kinda easy. Please notice that the paddle has a maximum possible speed to be moved with. To adjust the camera, you now can hold down the right mouse key and change the viewing angle by moving around. Also, by holding the middle mouse key, you're able to adjust the distance of the camera to the action going on. By pressing the left mouse key, you serve the ball, if one was attached to your paddle. Be aware of how the ball leaves you're paddle. If you got some speed on your paddle pointing in a specific direction, the ball will drift to that direction. This is also important for bouncing the ball. You can give it some additional speed by moving your paddle along and also reduce it's speed. It won't help you against Mr. Wand - but to stamp down a regular opponent, you will need a little knowledge about the ball's reaction to your paddle movement. Additionally to this, as your paddle is bent, the position on which the ball hits your paddle is also influencing its flight path. While playing, you can count on the reflections on the walls to get a better feeling about where the ball actually travels around. One additional note: Every player gets 5 rounds to serve at a time, regardlessly who won or lost the last round. Now have fun playing and kick some ass! IMPLEMENTATION: I want to discuss several topics here to describe the main challenges of the implementation and how we get beyond: * Abstraction of SDL / object orientation I wanted the different modules to be strictly _not_ dependant on the SDL or anything alike. They also should never know anything about our type of networking, and so on. The only thing reasonably for me to let them depend on was OpenGL for their drawing code. So one big point of the OO information hiding model was to let both Server and Client to be inherited from Framework. This not only made it possible for them to not know anything about SDL, but also to not make it necessary to let Framework know anything about Client or Server. So whenever the environment makes it necessary to kick either Server or Client to do something (like the user want to move the paddle with the mouse), virtual functions help to get across that border. The Server never knows how actually the user generates the movement and the Framework doesn't know wether the server uses the data for cal- culations or the client just sends it over the network. So there are functions defined in the objects which only get called by the Server or by the Client and not both. To not hevily rely on this, I decided to let stuff like the global detectCol() function to remain in Framework (no matter it will only be called by a function only called by the Server). To make the program extensible, the Framework holds vectors of objects like Balls and Players. The Server yet knows there are only two Players - and which one is which one - but the Framework doesn't need to know and still can satisfy the needs of processing all of the objects. * Getting Timers to work This one also belongs to the last point a little bit. I didn't want to make any object aware of what an SDL timer is or alike. So I had to think about layering around it without too much overhead and hassle. First, we have to think of how a called Timer ever reaches it's calling object, without knowing it. So all Timer calling functions have to be inherited from EventReceiver, which is nothing more then a pure virtual action() function and an enum to describe different Timer Event types; everything else is to be handled by the object itself. To add a layer above the pure SDL Timer, we need another structure as part of the Framework, which has to be accessable, in our implementation by an index over a pointer holding vector, just for one purpose: to be able to stop the timer. A pointer to this Struct is also given to the timer itself as userdata to handle it's event call. We can't operate in the timer's processing function itself, as the Timer ends in it's own thread and nothing is thread save here. So we have to push an SDL User Event, which gets passed the struct pointer and then finally collect the timer in the loop() function - which is a cleaner way anyway. Deleting this structure on the requested removal of the timer (mostly when it's done) is a very bad idea - it works most of the time, but if a timer's event gets delayed too long, this will crash. So we can only cleanup the SDL Timer in time and need to clean up the rest afterwards. * Getting Networking to work Our networking protocol is rather easy - after some small talk on the beginning, the server continously reports ball and paddle positions, while the client reports if it wants to move the paddle. Some random additional packages are needed too, like to tell the Pause state or score. We have to be aware that UDP loses packages; but in fact, if in our implementation packages are lost during initialization, it would just not work out (it's very unlikely to happen as this is the state before we start to send lots of packages). If gamedata packages are lost, this isn't a really big issues. The ball for example would not be updated as often as it could be, or there could be a scoring get lost and when the player scores again, it will again show up correctly.. To have a clean way of building network packages, I wrote a little Buffer called helper class which understands every packet having a type which is sent first, and then random data which is pushed and popped (on the other side) according to the packet's type. We don't have error handling here and have to assure ourselves that packages really contain the variables the receiver expects from them. To do this, a versioning mechanism prevents two instances of different game versions to get in touch with each other. * Colliding This is a bad chapter. First I thought I could do this in a very easy way for walls, a not-that-easy way for paddles and a nearly impossible(?) way for other balls (future!). After having some not really working code, I had to rethink the whole issue. Now the ball doesn't tell anyone where it is from and where it wants to be, but instead iterates through alle positions on it's way and ask if it's already stuck inside anything. How many positions are tested against is determined by the ball's speed factor (the biggest one of x, y, z), which eventually will lead to less fps on a high ball speed. Because I think of having very little time and place difference between these steps, the collided object is allowed to just move the ball a little bit aside in the case of a collision, which seems to indeed work good. Collinding can be done very simple and very extensive with that model. As there is no real need to be physically correct or something like that, here simple methods are preferenced. While rewriting the collision code for the paddle I found out that even the simplest approach - doing without more expensive tests - can lead to very well results. To go even further, some sluttery can indeed assist in a pleasing gameplay. * Reflections The main purpose, apart from the visual appeal, of the reflections is to help the player track the ball. So I chose not to spend any work on having the reflections go 'right' dependent on from where you look. In fact, they are drawn just are mirrored on the appropriate axis (X or Y). To get them drawn on the walls and have everything look nice, I draw the ball reflection first and overdraw it with the real, translucent, wall. This worked out very well, after not only filling the stencil buffer, but also drawing a solid background to where the reflection and finally the wall itself will go. But it resulted in a little contrasted wall texture. To get beyond that, the wall is drawed two times fully textured - while filling the stencil buffer and after drawing the reflection. The first time, I darken it, the second time it has a decreased alpha value. pong2-0.1.3/AUTHORS0000644000175000001440000000004510473646150010532 00000000000000Johannes Jordan pong2-0.1.3/aclocal.m40000644000175000001440000011212711103705533011317 00000000000000# generated automatically by aclocal 1.9.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # Configure paths for SDL # Sam Lantinga 9/21/99 # stolen from Manish Singh # stolen back from Frank Belew # stolen from Manish Singh # Shamelessly stolen from Owen Taylor dnl AM_PATH_SDL([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]]) dnl Test for SDL, and define SDL_CFLAGS and SDL_LIBS dnl AC_DEFUN([AM_PATH_SDL], [dnl dnl Get the cflags and libraries from the sdl-config script dnl AC_ARG_WITH(sdl-prefix,[ --with-sdl-prefix=PFX Prefix where SDL is installed (optional)], sdl_prefix="$withval", sdl_prefix="") AC_ARG_WITH(sdl-exec-prefix,[ --with-sdl-exec-prefix=PFX Exec prefix where SDL is installed (optional)], sdl_exec_prefix="$withval", sdl_exec_prefix="") AC_ARG_ENABLE(sdltest, [ --disable-sdltest Do not try to compile and run a test SDL program], , enable_sdltest=yes) if test x$sdl_exec_prefix != x ; then sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config fi fi if test x$sdl_prefix != x ; then sdl_args="$sdl_args --prefix=$sdl_prefix" if test x${SDL_CONFIG+set} != xset ; then SDL_CONFIG=$sdl_prefix/bin/sdl-config fi fi if test "x$prefix" != xNONE; then PATH="$prefix/bin:$prefix/usr/bin:$PATH" fi AC_PATH_PROG(SDL_CONFIG, sdl-config, no, [$PATH]) min_sdl_version=ifelse([$1], ,0.11.0,$1) AC_MSG_CHECKING(for SDL - version >= $min_sdl_version) no_sdl="" if test "$SDL_CONFIG" = "no" ; then no_sdl=yes else SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags` SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs` sdl_major_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \ sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` if test "x$enable_sdltest" = "xyes" ; then ac_save_CFLAGS="$CFLAGS" ac_save_CXXFLAGS="$CXXFLAGS" ac_save_LIBS="$LIBS" CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" dnl dnl Now check if the installed SDL is sufficiently new. (Also sanity dnl checks the results of sdl-config to some extent dnl rm -f conf.sdltest AC_TRY_RUN([ #include #include #include #include "SDL.h" char* my_strdup (char *str) { char *new_str; if (str) { new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char)); strcpy (new_str, str); } else new_str = NULL; return new_str; } int main (int argc, char *argv[]) { int major, minor, micro; char *tmp_version; /* This hangs on some systems (?) system ("touch conf.sdltest"); */ { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); } /* HP/UX 9 (%@#!) writes to sscanf strings */ tmp_version = my_strdup("$min_sdl_version"); if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, µ) != 3) { printf("%s, bad version string\n", "$min_sdl_version"); exit(1); } if (($sdl_major_version > major) || (($sdl_major_version == major) && ($sdl_minor_version > minor)) || (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro))) { return 0; } else { printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version); printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro); printf("*** best to upgrade to the required version.\n"); printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n"); printf("*** to point to the correct copy of sdl-config, and remove the file\n"); printf("*** config.cache before re-running configure\n"); return 1; } } ],, no_sdl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi if test "x$no_sdl" = x ; then AC_MSG_RESULT(yes) ifelse([$2], , :, [$2]) else AC_MSG_RESULT(no) if test "$SDL_CONFIG" = "no" ; then echo "*** The sdl-config script installed by SDL could not be found" echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in" echo "*** your path, or set the SDL_CONFIG environment variable to the" echo "*** full path to sdl-config." else if test -f conf.sdltest ; then : else echo "*** Could not run SDL test program, checking why..." CFLAGS="$CFLAGS $SDL_CFLAGS" CXXFLAGS="$CXXFLAGS $SDL_CFLAGS" LIBS="$LIBS $SDL_LIBS" AC_TRY_LINK([ #include #include "SDL.h" int main(int argc, char *argv[]) { return 0; } #undef main #define main K_and_R_C_main ], [ return 0; ], [ echo "*** The test program compiled, but did not run. This usually means" echo "*** that the run-time linker is not finding SDL or finding the wrong" echo "*** version of SDL. If it is not finding SDL, you'll need to set your" echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" echo "*** to the installed location Also, make sure you have run ldconfig if that" echo "*** is required on your system" echo "***" echo "*** If you have an old version installed, it is best to remove it, although" echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], [ echo "*** The test program failed to compile or link. See the file config.log for the" echo "*** exact error that occured. This usually means SDL was incorrectly installed" echo "*** or that you have moved SDL since it was installed. In the latter case, you" echo "*** may want to edit the sdl-config script: $SDL_CONFIG" ]) CFLAGS="$ac_save_CFLAGS" CXXFLAGS="$ac_save_CXXFLAGS" LIBS="$ac_save_LIBS" fi fi SDL_CFLAGS="" SDL_LIBS="" ifelse([$3], , :, [$3]) fi AC_SUBST(SDL_CFLAGS) AC_SUBST(SDL_LIBS) rm -f conf.sdltest ]) # Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.9.6])]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 7 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH]) ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 3 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.58])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. # # Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories # created by `make install' are always world readable, even if the # installer happens to have an overly restrictive umask (e.g. 077). # This was a mistake. There are at least two reasons why we must not # use `-m 0755': # - it causes special bits like SGID to be ignored, # - it may be too restrictive (some setups expect 775 directories). # # Do not use -m 0755 and let people choose whatever they expect by # setting umask. # # We cannot accept any implementation of `mkdir' that recognizes `-p'. # Some implementations (such as Solaris 8's) are not thread-safe: if a # parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' # concurrently, both version can detect that a/ is missing, but only # one can create it and the other will error out. Consequently we # restrict ourselves to GNU make (using the --version option ensures # this.) AC_DEFUN([AM_PROG_MKDIR_P], [if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then # We used to keeping the `.' as first argument, in order to # allow $(mkdir_p) to be used without argument. As in # $(mkdir_p) $(somedir) # where $(somedir) is conditionally defined. However this is wrong # for two reasons: # 1. if the package is installed by a user who cannot write `.' # make install will fail, # 2. the above comment should most certainly read # $(mkdir_p) $(DESTDIR)$(somedir) # so it does not work when $(somedir) is undefined and # $(DESTDIR) is not. # To support the latter case, we have to write # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), # so the `.' trick is pointless. mkdir_p='mkdir -p --' else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. for d in ./-p ./--version; do test -d $d && rmdir $d done # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. if test -f "$ac_aux_dir/mkinstalldirs"; then mkdir_p='$(mkinstalldirs)' else mkdir_p='$(install_sh) -d' fi fi AC_SUBST([mkdir_p])]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/acx_pthread.m4]) pong2-0.1.3/ChangeLog0000644000175000001440000000201711103714307011224 000000000000000.1.3: * minor change for GCC compatibility up to 4.3.x 0.1.2: * documentation is bad now * base support for player count != 2 * rewrote networking code to use libgrapple * uses SDL_image for image loading, therefor PNGs are used instead of BMP * fixed bug with wrong lighting if the camera distance is adjusted * adjusted timeunit to 7, still investigating timing problems 0.1.1: * added stencil buffer initialization (the stencil buffer got disabled by some drivers before, which caused the ball reflections to be drawn everywhere) * fixed outdated sdl initialization * some minor fixes and changes * removed unused pixmap from distribution * README updated 0.1.0: * textures are now searched in the PREFIX (alike /usr/local/share/pong2/) * bug about the bouncing on the paddle "edges" fixed * cleanups in Player::detectCol() * paddle can't catch balls being little beyond it anymore * ball will soon be able to accelerate itself * added some math includes missing (gcc 3.4.3 is cool) 0.0.9: Initial release pong2-0.1.3/doxygen.conf0000644000175000001440000014205710473646150012020 00000000000000# Doxyfile 1.4.2 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = Pong² # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = doc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, # Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, # Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, # Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, # Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # This tag can be used to specify the encoding used in the generated output. # The encoding is not always determined by the language that is chosen, # but also whether or not the output is meant for Windows or non-Windows users. # In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES # forces the Windows encoding (this is the default for the Windows binary), # whereas setting the tag to NO uses a Unix-style encoding (the default for # all platforms other than Windows). USE_WINDOWS_ENCODING = NO # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like the Qt-style comments (thus requiring an # explicit @brief command for a brief description. JAVADOC_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the DETAILS_AT_TOP tag is set to YES then Doxygen # will output the detailed description near the top, like JavaDoc. # If set to NO, the detailed description appears after the member # documentation. DETAILS_AT_TOP = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources # only. Doxygen will then generate output that is more tailored for Java. # For instance, namespaces will be presented as packages, qualified scopes # will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = YES # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. SHOW_DIRECTORIES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from the # version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the progam writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = NO # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = src/ # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm FILE_PATTERNS = *.cpp \ *.hpp # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = NO # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. EXCLUDE_PATTERNS = # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES (the default) # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = YES # If the REFERENCES_RELATION tag is set to YES (the default) # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = YES # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compressed HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 4 # If the GENERATE_TREEVIEW tag is set to YES, a side panel will be # generated containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. GENERATE_TREEVIEW = NO # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = YES # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = YES # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = palatino # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = NO # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = NO # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = YES # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = NO # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_PREDEFINED tags. EXPAND_ONLY_PREDEF = NO # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = INLINE \ VERBOSE \ TRACE # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = doxygen.tags # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = YES # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /share/pckg/ALL/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will # generate a call dependency graph for every global function or class method. # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. CALL_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_WIDTH = 1024 # The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height # (in pixels) of the graphs generated by dot. If a graph becomes larger than # this value, doxygen will try to truncate the graph, so that it fits within # the specified constraint. Beware that most browsers cannot cope with very # large images. MAX_DOT_GRAPH_HEIGHT = 1024 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that a graph may be further truncated if the graph's # image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH # and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), # the graph is not depth-constrained. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, which results in a white background. # Warning: Depending on the platform used, enabling this option may lead to # badly anti-aliased labels on the edges of a graph (i.e. they become hard to # read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Configuration::additions related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO pong2-0.1.3/Makefile.am0000644000175000001440000000016610474146212011515 00000000000000ACLOCAL_AMFLAGS = -I m4 AUTOMAKE_OPTIONS = dist-bzip2 SUBDIRS = src data EXTRA_DIST = \ doxygen.conf \ icon.png \ m4