From 7c28e4ce2955d8d7fbe5740c4721386404a3d0ac Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 13 May 2010 10:49:17 +0000 Subject: [PATCH] New lib for EFL: eeze! Bringing you the freedom to (hopefully) never need to learn external apis again! So far only e_udev is complete, but more will be added. Add stuff to the TODO or yell at me in irc if you want something in. If anyone knows how to fix the doxygen css, I'd be most grateful! SVN revision: 48808 --- legacy/eeze/AUTHORS | 1 + legacy/eeze/COPYING | 20 + legacy/eeze/ChangeLog | 0 legacy/eeze/INSTALL | 302 +++++++++++ legacy/eeze/Makefile.am | 22 + legacy/eeze/NEWS | 0 legacy/eeze/README | 3 + legacy/eeze/TODO | 9 + legacy/eeze/autogen.sh | 16 + legacy/eeze/configure.ac | 105 ++++ legacy/eeze/doc/Doxyfile | 141 +++++ legacy/eeze/doc/Makefile.am | 32 ++ legacy/eeze/doc/e.css | 273 ++++++++++ legacy/eeze/doc/eeze.dox.in | 23 + legacy/eeze/doc/foot.html | 18 + legacy/eeze/doc/head.html | 68 +++ legacy/eeze/doc/img/edoxy.css | 486 +++++++++++++++++ legacy/eeze/doc/img/eeze.png | Bin 0 -> 98436 bytes legacy/eeze/doc/img/foot_bg.png | Bin 0 -> 173 bytes legacy/eeze/doc/img/head_bg.png | Bin 0 -> 214 bytes .../eeze/doc/img/header_menu_background.png | Bin 0 -> 192 bytes .../doc/img/header_menu_background_last.png | Bin 0 -> 637 bytes .../img/header_menu_current_background.png | Bin 0 -> 1200 bytes .../img/header_menu_unselected_background.png | Bin 0 -> 1596 bytes legacy/eeze/doc/img/logo.png | Bin 0 -> 3825 bytes legacy/eeze/eudev.pc.in | 11 + legacy/eeze/m4/efl_doxygen.m4 | 99 ++++ legacy/eeze/src/Makefile.am | 2 + legacy/eeze/src/bin/Makefile.am | 21 + legacy/eeze/src/bin/eeze_udev_test.c | 162 ++++++ legacy/eeze/src/lib/Makefile.am | 2 + legacy/eeze/src/lib/udev/E_Udev.h | 137 +++++ legacy/eeze/src/lib/udev/Makefile.am | 21 + legacy/eeze/src/lib/udev/e_udev.c | 513 ++++++++++++++++++ legacy/eeze/src/lib/udev/e_udev_main.c | 46 ++ legacy/eeze/src/lib/udev/e_udev_private.h | 26 + legacy/eeze/src/lib/udev/e_udev_watch.c | 228 ++++++++ 37 files changed, 2787 insertions(+) create mode 100644 legacy/eeze/AUTHORS create mode 100644 legacy/eeze/COPYING create mode 100644 legacy/eeze/ChangeLog create mode 100644 legacy/eeze/INSTALL create mode 100644 legacy/eeze/Makefile.am create mode 100644 legacy/eeze/NEWS create mode 100644 legacy/eeze/README create mode 100644 legacy/eeze/TODO create mode 100755 legacy/eeze/autogen.sh create mode 100644 legacy/eeze/configure.ac create mode 100644 legacy/eeze/doc/Doxyfile create mode 100644 legacy/eeze/doc/Makefile.am create mode 100644 legacy/eeze/doc/e.css create mode 100644 legacy/eeze/doc/eeze.dox.in create mode 100644 legacy/eeze/doc/foot.html create mode 100644 legacy/eeze/doc/head.html create mode 100644 legacy/eeze/doc/img/edoxy.css create mode 100644 legacy/eeze/doc/img/eeze.png create mode 100644 legacy/eeze/doc/img/foot_bg.png create mode 100644 legacy/eeze/doc/img/head_bg.png create mode 100644 legacy/eeze/doc/img/header_menu_background.png create mode 100644 legacy/eeze/doc/img/header_menu_background_last.png create mode 100644 legacy/eeze/doc/img/header_menu_current_background.png create mode 100644 legacy/eeze/doc/img/header_menu_unselected_background.png create mode 100644 legacy/eeze/doc/img/logo.png create mode 100644 legacy/eeze/eudev.pc.in create mode 100644 legacy/eeze/m4/efl_doxygen.m4 create mode 100644 legacy/eeze/src/Makefile.am create mode 100644 legacy/eeze/src/bin/Makefile.am create mode 100644 legacy/eeze/src/bin/eeze_udev_test.c create mode 100644 legacy/eeze/src/lib/Makefile.am create mode 100644 legacy/eeze/src/lib/udev/E_Udev.h create mode 100644 legacy/eeze/src/lib/udev/Makefile.am create mode 100644 legacy/eeze/src/lib/udev/e_udev.c create mode 100644 legacy/eeze/src/lib/udev/e_udev_main.c create mode 100644 legacy/eeze/src/lib/udev/e_udev_private.h create mode 100644 legacy/eeze/src/lib/udev/e_udev_watch.c diff --git a/legacy/eeze/AUTHORS b/legacy/eeze/AUTHORS new file mode 100644 index 0000000000..0d3b42d8ab --- /dev/null +++ b/legacy/eeze/AUTHORS @@ -0,0 +1 @@ +Mike Blumenkrantz (zmike/discomfitor) mike@zentific.com diff --git a/legacy/eeze/COPYING b/legacy/eeze/COPYING new file mode 100644 index 0000000000..3d6eb4ef45 --- /dev/null +++ b/legacy/eeze/COPYING @@ -0,0 +1,20 @@ +Copyright (C) 2010 Mike Blumenkrantz and various contributors (see AUTHORS) + +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 of the Software, its documentation and marketing & publicity +materials, and acknowledgment shall be given in the documentation, materials +and software packages that this Software was used. + +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 AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/legacy/eeze/ChangeLog b/legacy/eeze/ChangeLog new file mode 100644 index 0000000000..e69de29bb2 diff --git a/legacy/eeze/INSTALL b/legacy/eeze/INSTALL new file mode 100644 index 0000000000..2550dab752 --- /dev/null +++ b/legacy/eeze/INSTALL @@ -0,0 +1,302 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007, 2008, 2009 Free Software Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. + + 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 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. + + Running `configure' might take a while. 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. + + 6. Often, you can also type `make uninstall' to remove the installed + files again. + +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=c99 CFLAGS=-g 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 can use 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 `..'. + + With a non-GNU `make', it is safer 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. + + On MacOS X 10.5 and later systems, you can create libraries and +executables that work on multiple system types--known as "fat" or +"universal" binaries--by specifying multiple `-arch' options to the +compiler but only a single `-arch' option to the preprocessor. Like +this: + + ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ + CPP="gcc -E" CXXCPP="g++ -E" + + This is not guaranteed to produce working output in all cases, you +may have to build one architecture at a time and combine the results +using the `lipo' tool if you have problems. + +Installation Names +================== + + By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' 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. + +Particular systems +================== + + On HP-UX, the default C compiler is not ANSI C compatible. If GNU +CC is not installed, it is recommended to use the following options in +order to use an ANSI C compiler: + + ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" + +and if that doesn't work, install pre-built binaries of GCC for HP-UX. + + On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot +parse its `' header file. The option `-nodtk' can be used as +a workaround. If GNU CC is not installed, it is therefore recommended +to try + + ./configure CC="cc" + +and if that doesn't work, try + + ./configure CC="cc -nodtk" + + On Solaris, don't put `/usr/ucb' early in your `PATH'. This +directory contains several dysfunctional programs; working variants of +these programs are available in `/usr/bin'. So, if you need `/usr/ucb' +in your `PATH', put it _after_ `/usr/bin'. + + On Haiku, software installed for all users goes in `/boot/common', +not `/usr/local'. It is recommended to use the following options: + + ./configure --prefix=/boot/common + +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 option `--target=TYPE' 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 + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of all of the options to `configure', and exit. + +`--help=short' +`--help=recursive' + Print a summary of the options unique to this package's + `configure', and exit. The `short' variant lists options used + only in the top level, while the `recursive' variant lists options + also present in any nested packages. + +`--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. + +`--prefix=DIR' + Use DIR as the installation prefix. *Note Installation Names:: + for more details, including other options available for fine-tuning + the installation locations. + +`--no-create' +`-n' + Run the configure checks, but stop before creating any output + files. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/legacy/eeze/Makefile.am b/legacy/eeze/Makefile.am new file mode 100644 index 0000000000..c360aad5dd --- /dev/null +++ b/legacy/eeze/Makefile.am @@ -0,0 +1,22 @@ +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = src doc + +MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess config.h.in \ + config.log config.sub configure depcomp \ + install-sh ltmain.sh missing compile eeze*doc*tar* \ + m4/l* + + +pkgconfigdir = $(libdir)/pkgconfig + +if BUILD_EUDEV +EUDEV_PC = eudev.pc +endif +pkgconfig_DATA = $(EUDEV_PC) + +.PHONY: doc + +doc: all + @echo "entering doc/" + $(MAKE) -C doc doc diff --git a/legacy/eeze/NEWS b/legacy/eeze/NEWS new file mode 100644 index 0000000000..e69de29bb2 diff --git a/legacy/eeze/README b/legacy/eeze/README new file mode 100644 index 0000000000..d081aebe34 --- /dev/null +++ b/legacy/eeze/README @@ -0,0 +1,3 @@ +eeze v?.?? + +eeze is a collection of misc apis wrapped in efl for ease of integration with other efl projects. Dependencies may vary, use at your own risk, i before e except after c. diff --git a/legacy/eeze/TODO b/legacy/eeze/TODO new file mode 100644 index 0000000000..0f72a3a46c --- /dev/null +++ b/legacy/eeze/TODO @@ -0,0 +1,9 @@ +udev: switch enum to bitmasks with categories probably + documentation for all types + more functions or something? + +TO BE ADDED +mpd: implement efl mpd bindings +xen: common xen control/info functions +libvirt: same as above +??? diff --git a/legacy/eeze/autogen.sh b/legacy/eeze/autogen.sh new file mode 100755 index 0000000000..1314a9896d --- /dev/null +++ b/legacy/eeze/autogen.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +rm -rf autom4te.cache +rm -f aclocal.m4 ltmain.sh + +touch README + +echo "Running aclocal..." ; aclocal $ACLOCAL_FLAGS -I m4 || exit 1 +echo "Running autoheader..." ; autoheader || exit 1 +echo "Running autoconf..." ; autoconf || exit 1 +echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1 +echo "Running automake..." ; automake --add-missing --copy || exit 1 + +if [ -z "$NOCONFIGURE" ]; then + ./configure "$@" +fi diff --git a/legacy/eeze/configure.ac b/legacy/eeze/configure.ac new file mode 100644 index 0000000000..3e8e77aa6f --- /dev/null +++ b/legacy/eeze/configure.ac @@ -0,0 +1,105 @@ +# get rid of that stupid cache mechanism +rm -f config.cache + +AC_INIT([eeze], [0.0.1], [enlightenment-devel@lists.sourceforge.net]) +release="ver-pre-svn-05" +AC_PREREQ([2.52]) +AC_CONFIG_SRCDIR([configure.ac]) +AC_CONFIG_MACRO_DIR([m4]) +AC_CANONICAL_BUILD +AC_CANONICAL_HOST + +AM_INIT_AUTOMAKE([1.6 dist-bzip2]) +AM_CONFIG_HEADER([config.h]) +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +AC_PROG_CC +AC_HEADER_STDC +AM_PROG_CC_C_O + +define([AC_LIBTOOL_LANG_CXX_CONFIG], [:])dnl +AC_PROG_LIBTOOL + +VMAJ=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $1);}'` +VMIN=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $2);}'` +VMIC=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $3);}'` +SNAP=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $4);}'` +version_info=`expr $VMAJ + $VMIN`":$VMIC:$VMIN" +eudev_release_info="-release $release" +AC_SUBST(version_info) +AC_SUBST(eudev_release_info) + +dnl Check enabled modules to build +AC_ARG_ENABLE([eudev],[AC_HELP_STRING([--disable-eudev], [Disable eudev build])]) +AS_IF( + [test "x$enableval" != "xno"], + [enable_eudev="yes"], + [enable_eudev=no], +) + +# pkg-config +PKG_PROG_PKG_CONFIG + +# Check whether pkg-config supports Requires.private +AS_IF( + [$PKG_CONFIG --atleast-pkgconfig-version 0.22], + [pkgconfig_requires_private="Requires.private"], + [pkgconfig_requires_private="Requires"] +) +AC_SUBST(pkgconfig_requires_private) + +PKG_CHECK_MODULES([ECORE], [ecore]) + +AS_IF( + [test "x${enable_eudev}" = "xyes"], + [PKG_CHECK_MODULES(UDEV, libudev, [], [enable_eudev="no"])] +) + +AM_CONDITIONAL([BUILD_EUDEV], [test "x${enable_eudev}" = "xyes"]) + +EFL_EDBUS_BUILD="" +lt_enable_auto_import="" +AS_CASE( + ["$host_os"], + [mingw* | cegcc*], + AC_MSG_ERROR([THIS WILL NOT RUN ON WINDOWS!]) +) + +EFL_CHECK_DOXYGEN([build_doc="yes"], [build_doc="no"]) + +AC_OUTPUT([ +Makefile +doc/eeze.dox +doc/Makefile +src/Makefile +src/lib/Makefile +src/lib/udev/Makefile +src/bin/Makefile +eudev.pc +]) + + +##################################################################### +## Info + +echo +echo +echo +echo "------------------------------------------------------------------------" +echo "$PACKAGE $VERSION" +echo "------------------------------------------------------------------------" +echo +echo "Configuration Options Summary:" +echo +echo " Modules:" +echo +echo " EUdev..............: $enable_eudev" +echo +echo "Compilation............: make (or gmake)" +echo " CPPFLAGS.............: $CPPFLAGS" +echo " CFLAGS...............: $CFLAGS" +echo " LDFLAGS..............: $LDFLAGS" +echo +echo "Installation...........: make install (as root if needed, with 'su' or 'sudo')" +echo " prefix...............: $prefix" +echo diff --git a/legacy/eeze/doc/Doxyfile b/legacy/eeze/doc/Doxyfile new file mode 100644 index 0000000000..8aa5782d64 --- /dev/null +++ b/legacy/eeze/doc/Doxyfile @@ -0,0 +1,141 @@ +ALIASES = +ALLEXTERNALS = NO +ALPHABETICAL_INDEX = YES +ALWAYS_DETAILED_SEC = NO +BINARY_TOC = NO +BRIEF_MEMBER_DESC = YES +CASE_SENSE_NAMES = YES +CHM_FILE = +CLASS_DIAGRAMS = NO +CLASS_GRAPH = NO +COLLABORATION_GRAPH = NO +COLS_IN_ALPHA_INDEX = 2 +COMPACT_LATEX = NO +COMPACT_RTF = NO +DETAILS_AT_TOP = NO +DISABLE_INDEX = YES +DISTRIBUTE_GROUP_DOC = NO +DOT_CLEANUP = YES +DOTFILE_DIRS = +DOT_IMAGE_FORMAT = png +DOT_PATH = +ENABLED_SECTIONS = +ENABLE_PREPROCESSING = YES +ENUM_VALUES_PER_LINE = 1 +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +EXCLUDE = +EXCLUDE_PATTERNS = +EXCLUDE_SYMLINKS = NO +EXPAND_AS_DEFINED = +EXPAND_ONLY_PREDEF = NO +EXTERNAL_GROUPS = YES +EXTRACT_ALL = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRA_PACKAGES = +FILE_PATTERNS = +FILTER_SOURCE_FILES = NO +FULL_PATH_NAMES = NO +GENERATE_AUTOGEN_DEF = NO +GENERATE_BUGLIST = YES +GENERATE_CHI = NO +GENERATE_DEPRECATEDLIST= YES +GENERATE_HTMLHELP = NO +GENERATE_HTML = YES +GENERATE_LATEX = YES +GENERATE_LEGEND = YES +GENERATE_MAN = YES +GENERATE_RTF = NO +GENERATE_TAGFILE = +GENERATE_TESTLIST = YES +GENERATE_TODOLIST = YES +GENERATE_TREEVIEW = NO +GENERATE_XML = NO +GRAPHICAL_HIERARCHY = NO +HAVE_DOT = NO +HHC_LOCATION = +HIDE_FRIEND_COMPOUNDS = YES +HIDE_SCOPE_NAMES = NO +HIDE_UNDOC_CLASSES = YES +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_RELATIONS = YES +HTML_ALIGN_MEMBERS = YES +HTML_FILE_EXTENSION = .html +HTML_FOOTER = foot.html +HTML_HEADER = head.html +HTML_OUTPUT = html +HTML_STYLESHEET = e.css +IGNORE_PREFIX = +IMAGE_PATH = img +INCLUDED_BY_GRAPH = NO +INCLUDE_FILE_PATTERNS = +INCLUDE_GRAPH = NO +INCLUDE_PATH = +INHERIT_DOCS = YES +INLINE_INFO = YES +INLINE_INHERITED_MEMB = NO +INLINE_SOURCES = NO +INPUT = eeze.dox ../src/lib +INPUT_FILTER = +INTERNAL_DOCS = NO +JAVADOC_AUTOBRIEF = YES +LATEX_BATCHMODE = NO +LATEX_CMD_NAME = latex +LATEX_HEADER = +LATEX_OUTPUT = latex +MACRO_EXPANSION = NO +MAKEINDEX_CMD_NAME = makeindex +MAN_EXTENSION = .3 +MAN_LINKS = YES +MAN_OUTPUT = man +MAX_DOT_GRAPH_HEIGHT = 512 +MAX_DOT_GRAPH_WIDTH = 512 +MAX_INITIALIZER_LINES = 30 +MULTILINE_CPP_IS_BRIEF = NO +OPTIMIZE_OUTPUT_FOR_C = YES +OPTIMIZE_OUTPUT_JAVA = NO +OUTPUT_DIRECTORY = . +OUTPUT_LANGUAGE = English +PAPER_TYPE = a4wide +PDF_HYPERLINKS = YES +PERL_PATH = /usr/bin/perl +PREDEFINED = +PROJECT_NAME = Eeze +PROJECT_NUMBER = +QUIET = NO +RECURSIVE = YES +REFERENCES_LINK_SOURCE = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +REPEAT_BRIEF = YES +RTF_EXTENSIONS_FILE = +RTF_HYPERLINKS = NO +RTF_OUTPUT = rtf +RTF_STYLESHEET_FILE = +SEARCHENGINE = NO +SEARCH_INCLUDES = YES +SHORT_NAMES = NO +SHOW_INCLUDE_FILES = NO +SHOW_USED_FILES = NO +SKIP_FUNCTION_MACROS = YES +SORT_MEMBER_DOCS = YES +SOURCE_BROWSER = NO +STRIP_CODE_COMMENTS = YES +STRIP_FROM_PATH = src/ +SUBGROUPING = YES +TAB_SIZE = 2 +TAGFILES = +TEMPLATE_RELATIONS = NO +TOC_EXPAND = NO +TREEVIEW_WIDTH = 250 +USE_PDFLATEX = NO +VERBATIM_HEADERS = NO +WARN_FORMAT = "$file:$line: $text" +WARN_IF_UNDOCUMENTED = YES +WARNINGS = YES +WARN_LOGFILE = +XML_DTD = +XML_SCHEMA = diff --git a/legacy/eeze/doc/Makefile.am b/legacy/eeze/doc/Makefile.am new file mode 100644 index 0000000000..5827e7aa81 --- /dev/null +++ b/legacy/eeze/doc/Makefile.am @@ -0,0 +1,32 @@ +MAINTAINERCLEANFILES = Makefile.in eeze.dox + +.PHONY: doc + +PACKAGE_DOCNAME = $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)-doc + +if EFL_BUILD_DOC + +doc-clean: + rm -rf html/ latex/ man/ xml/ $(PACKAGE_DOCNAME).tar* + +doc: all doc-clean + $(efl_doxygen) + cp img/* html/ + rm -rf $(PACKAGE_DOCNAME).tar* + mkdir -p $(PACKAGE_DOCNAME)/doc + cp -R html/ latex/ man/ $(PACKAGE_DOCNAME)/doc + tar cf $(PACKAGE_DOCNAME).tar $(PACKAGE_DOCNAME)/ + bzip2 -9 $(PACKAGE_DOCNAME).tar + rm -rf $(PACKAGE_DOCNAME)/ + mv $(PACKAGE_DOCNAME).tar.bz2 $(top_srcdir) + +clean-local: doc-clean + +else + +doc: + @echo "Documentation not built. Run ./configure --help" + +endif + +EXTRA_DIST = Doxyfile $(wildcard img/*.*) e.css head.html foot.html eeze.dox.in diff --git a/legacy/eeze/doc/e.css b/legacy/eeze/doc/e.css new file mode 100644 index 0000000000..2dd6b44798 --- /dev/null +++ b/legacy/eeze/doc/e.css @@ -0,0 +1,273 @@ +/* + Author: + Andres Blanc + DaveMDS Andreoli + + Supported Browsers: + ie7, opera9, konqueror4 and firefox3 + + Please use a different file for ie6, ie5, etc. hacks. +*/ + + +/* Necessary to place the footer at the bottom of the page */ +html, body { + height: 100%; + margin: 0px; + padding: 0px; +} + +#container { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -53px; +} + +#footer, #push { + height: 53px; +} + + +* html #container { + height: 100%; +} + +/* Prevent floating elements overflowing containers */ +.clear { + clear: both; + width: 0px; + height: 0px; +} + +/* Flexible & centered layout from 750 to 960 pixels */ +.layout { + max-width: 960px; + min-width: 760px; + margin-left: auto; + margin-right: auto; +} + +body { + /*font-family: Lucida Grande, Helvetica, sans-serif;*/ + font-family: "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif +} + +/* Prevent design overflowing the viewport in small resolutions */ +#container { + padding-right: 17px; + padding-left: 17px; + background-image: url(head_bg.png); + background-repeat: repeat-x; +} + +/****************************/ +/* Top main menu */ +/****************************/ +#header_logo { + background-image : url(logo.png); + width : 61px; +} + +#header_logo a { + position : absolute; + border : 0px; + background-color : transparent; + top : 0px; + width : 60px; + height : 60px; +} + +#header_menu { + background-image : url(header_menu_background.png); + font : normal 10pt verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif; + text-align : right; +} + +#header_last { + background-image : url(header_menu_background_last.png); + width : 15px; +} + +td.nav_passive { + background : url(header_menu_unselected_background.png) 0 0 no-repeat; + height : 63px; + font-family : "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif; + font-size : 11px; + padding : 20px 10px 20px 10px; + vertical-align : middle; +} + +td.nav_active { + background : url(header_menu_current_background.png) 0 0 no-repeat; + height : 63px; + color : #646464; + font-family : "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif; + font-size : 11px; + font-weight : bold; + padding : 20px 10px 20px 10px; + vertical-align : middle; +} + +#header_menu a { + display : block; + text-decoration : none; + cursor : pointer; + color : #cdcdcd; +} + + + +#header { + width: 100%; + height: 102px; +} + +#header h1 { + width: 63px; + height: 63px; + position: absolute; + margin: 0px; +} + +#header h1 span { + display: none; +} + +#header h2 { + display: none; +} + +/* .menu-container is used to set properties common to .menu and .submenu */ +#header .menu-container { +} + +#header .menu-container ul { + list-style-type: none; + list-style-position: inside; + margin: 0; +} + +#header .menu-container li { + display: block; + float: right; +} + +#header .menu { + height: 63px; + display: block; + background-image: url(menu_bg.png); + background-repeat: repeat-x; +} + +#header .menu ul { + height: 100%; + display: block; + background-image: url(menu_bg_last.png); + background-repeat: no-repeat; + background-position: top right; + padding-right: 17px; +} + +#header .menu li { + height: 100%; + text-align: center; + background-image: url(menu_bg_unsel.png); + background-repeat: no-repeat; +} + +#header .menu a { + height: 100%; + display: block; + color: #cdcdcd; + text-decoration: none; + font-size: 10pt; + line-height: 59px; + text-align: center; + padding: 0px 15px 0px 15px; +} + +#header .menu li:hover { + background-image: url(menu_bg_hover.png); + background-repeat: no-repeat; +} + +#header .menu li:hover a { + color: #FFFFFF; +} + +#header .menu li.current { + background-image: url(menu_bg_current.png); + background-repeat: no-repeat; +} + +#header .menu li.current a { + color: #646464; +} + + +/* Hide all the submenus but the current */ +#header .submenu ul { + display: none; +} + +#header .submenu .current { + display: block; +} + +#header .submenu { + font: bold 10px verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif; + margin-top: 10px; +} + +#header .submenu a { + color: #888888; + text-decoration: none; + font-size: 0.9em; + line-height: 15px; + padding:0px 5px 0px 5px; +} + +#header .submenu a:hover { + color: #444444; +} + +#header .submenu li { + border-left: 1px solid #DDDDDD; +} + +#header .submenu li:last-child { + border-left: 0; +} + +#header .doxytitle { + position: absolute; + font-size: 1.8em; + font-weight: bold; + color: #444444; + line-height: 35px; +} + +#header small { + font-size: 0.4em; +} + +#footer { + background-image: url(foot_bg.png); + width: 100%; +} + +#footer table { + width: 100%; + text-align: center; + white-space: nowrap; + padding: 5px 30px 5px 30px; + font-size: 0.8em; + font-family: "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif; + color: #888888; +} + +#footer td.copyright { + width: 100%; +} + diff --git a/legacy/eeze/doc/eeze.dox.in b/legacy/eeze/doc/eeze.dox.in new file mode 100644 index 0000000000..d09a56f8dd --- /dev/null +++ b/legacy/eeze/doc/eeze.dox.in @@ -0,0 +1,23 @@ +/** +@file eeze.dox +@brief Eeze Misc Libraries +*/ + +/** +@mainpage Eeze +@image html eeze.png +@version @PACKAGE_VERSION@ +@author Mike Blumenkrantz (zmike/discomfitor) +@date 2010 + +@section intro What is Eeze? + +Eeze is a collection of various APIs which may or may not be useful +to developers working with EFL. The aim is to eliminate the need to +learn any api outside of EFL while simultaneously providing an +extremely easy way to manipulate external libraries. + +@verbatim +Pants +@endverbatim +*/ diff --git a/legacy/eeze/doc/foot.html b/legacy/eeze/doc/foot.html new file mode 100644 index 0000000000..d43cf8fcc0 --- /dev/null +++ b/legacy/eeze/doc/foot.html @@ -0,0 +1,18 @@ + +
+ + + + + + + + + + + diff --git a/legacy/eeze/doc/head.html b/legacy/eeze/doc/head.html new file mode 100644 index 0000000000..2d9ea9224e --- /dev/null +++ b/legacy/eeze/doc/head.html @@ -0,0 +1,68 @@ + + + $title + + + + + + + + + + + + + + +
+ + + +
+
diff --git a/legacy/eeze/doc/img/edoxy.css b/legacy/eeze/doc/img/edoxy.css new file mode 100644 index 0000000000..311ca23d46 --- /dev/null +++ b/legacy/eeze/doc/img/edoxy.css @@ -0,0 +1,486 @@ +/* + * This file contain a custom doxygen style to match e.org graphics + */ + + + +/* BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV { + font-family: Geneva, Arial, Helvetica, sans-serif; +}*/ +BODY, TD { + font-size: 12px; +} +H1 { + text-align: center; + font-size: 160%; +} +H2 { + font-size: 120%; +} +H3 { + font-size: 100%; +} +CAPTION { + font-weight: bold +} +DIV.qindex { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.navpath { + width: 100%; + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + padding: 2px; + line-height: 140%; +} +DIV.navtab { + background-color: #e8eef2; + border: 1px solid #84b0c7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +TD.navtab { + font-size: 70%; +} +A.qindex { + text-decoration: none; + font-weight: bold; + color: #1A419D; +} +A.qindex:visited { + text-decoration: none; + font-weight: bold; + color: #1A419D +} +A.qindex:hover { + text-decoration: none; + background-color: #ddddff; +} +A.qindexHL { + text-decoration: none; + font-weight: bold; + background-color: #6666cc; + color: #ffffff; + border: 1px double #9295C2; +} +A.qindexHL:hover { + text-decoration: none; + background-color: #6666cc; + color: #ffffff; +} +A.qindexHL:visited { + text-decoration: none; + background-color: #6666cc; + color: #ffffff +} +A.el { + text-decoration: none; + font-weight: bold +} +A.elRef { + font-weight: bold +} +A.code:link { + text-decoration: none; + font-weight: normal; + color: #0000FF +} +A.code:visited { + text-decoration: none; + font-weight: normal; + color: #0000FF +} +A.codeRef:link { + font-weight: normal; + color: #0000FF +} +A.codeRef:visited { + font-weight: normal; + color: #0000FF +} +A:hover, A:visited:hover { + text-decoration: none; + /* background-color: #f2f2ff; */ + color: #000055; +} +A.anchor { + color: #000; +} +DL.el { + margin-left: -1cm +} +.fragment { + font-family: monospace, fixed; + font-size: 95%; +} +PRE.fragment { + border: 1px solid #CCCCCC; + background-color: #f5f5f5; + margin-top: 4px; + margin-bottom: 4px; + margin-left: 2px; + margin-right: 8px; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 4px; +} +DIV.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px +} + +DIV.groupHeader { + margin-left: 16px; + margin-top: 12px; + margin-bottom: 6px; + font-weight: bold; +} +DIV.groupText { + margin-left: 16px; + font-style: italic; + font-size: 90% +} +/*BODY { + background: white; + color: black; + margin-right: 20px; + margin-left: 20px; +}*/ +TD.indexkey { + background-color: #e8eef2; + font-weight: bold; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TD.indexvalue { + background-color: #e8eef2; + font-style: italic; + padding-right : 10px; + padding-top : 2px; + padding-left : 10px; + padding-bottom : 2px; + margin-left : 0px; + margin-right : 0px; + margin-top : 2px; + margin-bottom : 2px; + border: 1px solid #CCCCCC; +} +TR.memlist { + background-color: #f0f0f0; +} +P.formulaDsp { + text-align: center; +} +IMG.formulaDsp { +} +IMG.formulaInl { + vertical-align: middle; +} +SPAN.keyword { color: #008000 } +SPAN.keywordtype { color: #604020 } +SPAN.keywordflow { color: #e08000 } +SPAN.comment { color: #800000 } +SPAN.preprocessor { color: #806020 } +SPAN.stringliteral { color: #002080 } +SPAN.charliteral { color: #008080 } +SPAN.vhdldigit { color: #ff00ff } +SPAN.vhdlchar { color: #000000 } +SPAN.vhdlkeyword { color: #700070 } +SPAN.vhdllogic { color: #ff0000 } + +.mdescLeft { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.mdescRight { + padding: 0px 8px 4px 8px; + font-size: 80%; + font-style: italic; + background-color: #FAFAFA; + border-top: 1px none #E0E0E0; + border-right: 1px none #E0E0E0; + border-bottom: 1px none #E0E0E0; + border-left: 1px none #E0E0E0; + margin: 0px; +} +.memItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemLeft { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplItemRight { + padding: 1px 8px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: none; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + background-color: #FAFAFA; + font-size: 80%; +} +.memTemplParams { + padding: 1px 0px 0px 8px; + margin: 4px; + border-top-width: 1px; + border-right-width: 1px; + border-bottom-width: 1px; + border-left-width: 1px; + border-top-color: #E0E0E0; + border-right-color: #E0E0E0; + border-bottom-color: #E0E0E0; + border-left-color: #E0E0E0; + border-top-style: solid; + border-right-style: none; + border-bottom-style: none; + border-left-style: none; + color: #606060; + background-color: #FAFAFA; + font-size: 80%; +} +.search { + color: #003399; + font-weight: bold; +} +FORM.search { + margin-bottom: 0px; + margin-top: 0px; +} +INPUT.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +TD.tiny { + font-size: 75%; +} +a { + color: #1A41A8; +} +a:visited { + color: #2A3798; +} +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #84b0c7; +} +TH.dirtab { + background: #e8eef2; + font-weight: bold; +} +HR { + height: 1px; + border: none; + border-top: 1px solid black; +} + +/* Style for detailed member documentation */ +.memtemplate { + font-size: 80%; + color: #606060; + font-weight: normal; + margin-left: 3px; +} +.memnav { + background-color: #eeeeee; + border: 1px solid #dddddd; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} +.memitem { + padding: 4px; + background-color: #eeeeee; + border-width: 1px; + border-style: solid; + border-color: #dddddd; + -moz-border-radius: 4px 4px 4px 4px; +} +.memname { + white-space: nowrap; + font-weight: bold; + color: #ffffff; +} +.memdoc{ + padding-left: 10px; +} +.memproto { + background-color: #111111; + width: 100%; + border-width: 1px; + border-style: solid; + border-color: #000000; + font-weight: bold; + -moz-border-radius: 4px 4px 4px 4px; +} +.paramkey { + text-align: right; + color: #ffffff; +} +.paramtype { + white-space: nowrap; + color: #aaaaaa; +} +.paramname { + color: #ff0000; + font-style: italic; + white-space: nowrap; +} +/* End Styling for detailed member documentation */ + +/* for the tree view */ +.ftvtree { + font-family: sans-serif; + margin:0.5em; +} +/* these are for tree view when used as main index */ +.directory { + font-size: 9pt; + font-weight: bold; +} +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +/* The following two styles can be used to replace the root node title */ +/* with an image of your choice. Simply uncomment the next two styles, */ +/* specify the name of your image and be sure to set 'height' to the */ +/* proper pixel height of your image. */ + +/* .directory h3.swap { */ +/* height: 61px; */ +/* background-repeat: no-repeat; */ +/* background-image: url("yourimage.gif"); */ +/* } */ +/* .directory h3.swap span { */ +/* display: none; */ +/* } */ + +.directory > h3 { + margin-top: 0; +} +.directory p { + margin: 0px; + white-space: nowrap; +} +.directory div { + display: none; + margin: 0px; +} +.directory img { + vertical-align: -30%; +} +/* these are for tree view when not used as main index */ +.directory-alt { + font-size: 100%; + font-weight: bold; +} +.directory-alt h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} +.directory-alt > h3 { + margin-top: 0; +} +.directory-alt p { + margin: 0px; + white-space: nowrap; +} +.directory-alt div { + display: none; + margin: 0px; +} +.directory-alt img { + vertical-align: -30%; +} + diff --git a/legacy/eeze/doc/img/eeze.png b/legacy/eeze/doc/img/eeze.png new file mode 100644 index 0000000000000000000000000000000000000000..08d601243353d97aeeba859ec658722dd3d082c6 GIT binary patch literal 98436 zcmXt9Wl$SkxDM_T+$GQgh2jnc3c;;~;%>nqKyeEmic?zLt$6t;8r&(tt+=}vC=Qo9 zckY>;v-|7J&YpLleIMEA4;qRDxHPx`0DwSQ39JPGpvb&jpJAiE%ukwcBwtRVpXK#G zYgu?RLET*;_D(iTpM9Y=Oz%H@-~-_P?~Kdze?tsch*wZdP=J@0m!HpuUyzrNmlwBz z`)uH44ID4%d)xnC9Ps14i4y<-11N*vfAU#CKHk^7HTv&0W}jm$@>bvRc)(XjZzfRC z6Oq|YDJMcw@`^Vu>D31omT>g96Oysvy&aK>#D5&P48C`E!0<7z`<71{;ueovbUY6v z|E(PI?IMwU3g9z2>zype)B4f*(sCCw+qcIVwpC&tka#*igPz0j_+{ikwSixi+ zyWAeR>tQUTYGAilyQh7q`ceVXvb*0uc{byB_yh-T+-0L|MPKx;!w6k4PeQFBFl@EM z`l?+KbVZ*H$(=pThju=}pba!9WWQ$C0C`{#1(>XH=LAzTxJII7j3vM~TS;NqqxIp@ zW5Bz0-I7r9e*WTGDnnpZS_)SuAB9Pjl+OZ{34p2yW9yg$9B-Z;TE)*AI=(fHfe%V* zs&Et|Jv8HHZhKB`AP`hufPh{d?hin`3p%6F4&N>T6>s1TLkOdvdzk{9iHbHqfRR${CDvGn< z!MQ!KIz6y@|Fwq4l@SNymBPMzA*jG6!(>$aIjy--QrA%Gs`vaO=EGiB?%4g2gjFq( zfUb7yjke0go5?(Wa}^K>qI=NF>7MLqd;g<{^ycg7Zc{Q*3B8n6rzR0GDnBXrFe$S* zaBVB1LImD{9&ffnpOD%MHbp@?2`?G=P|X1g1<=$DzA6Ms)+1cUD>v$S50wr|!Q zYWuk81-JwNoN`V^pX_F)ZJoYJck>4Q=|Ud1wzbZC&Y{5E_=Vy=ei`amp%#^0%3uME z^xq>d9--#ngM;zVB4fy>a}65a1<-&YuR#z@fKK+87DvPQtEUKT6f3NfzC%nv9;5gj z_EYR|+`sVQW9-h|v7lTOHdf}0fkm|u;?AYX) zU(%=QQV~sR=>&lwBqr1?ZT@TIH6Px5@q|>)(o0=LdaawAw4!(tL@?wk44SyR$I~cM5Hu)O?Abp9?bO@MC6tG@kiY=o#W>4&ix-RK z=!Lnum3((r9ilX)8zv79&!7NCzglbkQc7m~)7N8X_|(%|$J5&|e%R3`;M?bYS+gcM z=8fH$K~!LNQ-bEz*(6h!<;*=%L{nSnL%(^%#Hk(h>bIT)aLVh?s@Kys1<)@aOyUp8{f_98T8Ch zC9i!-u zsvjrm=czc*zN$~~%XUIK$`4&3JpdaBzy|g9bD0R~^Wi=P(G~n0x;EYzHnH9k=~x!dNvEsL$r79m>D5rHEyZCGl5&~ieeqY<4OJD&JKw6-a|v-r?aBdGaJ@apd< z@}E^K-ok6PR{6FQIaf0_PGN@Q-@ZS5xT%jfSN(C(6~6_e`cC>(1aCrgJ*5Bn#baDK z@V(AOJvNz&BDb!dVg)y3=x@#pEAa#nhBNUBm{$n_)J3oXa{_<-D zjYW1RB09Q0l%;nmc8@`k_8n0@1*M-H_H?Em+in2pUE^{e$zwO1FMan!wOUjhtf+_u zyF`Yoq3?0k8P$)v0}{cAWd-%k+GbKvhGCf%a_3r@Q_y*3_S^5z4A=1(Av{U2)ALXU zgZ&6MKVjDlIO8MgYgSPn zEldC*dhcl2;RpeJrm$8~&ZjD0zPglNdg72Zy7{s<%*}|f(zsqrK?$YawUf@+1kBz~ zC=vH0?7Rb>tFo3>BVKGz zpeZSe%rXJ5))RdA9d7r|xlZM?YxwRTay~9%4@_lEt2wSgCP1|z3Jl(F54SM_cSmlT z37|o{Jkr|Ssh4*2FME17>k#Mjkz<%nD*&gUeh+s}P%KT1ASyP~7+l+$mS?o1cgsq5 z{uMxmjgdxok3(G>1MSmAIXD!4Sj-1QkODG78hb0tolJiUx(=p+!GDh!``=cJnaP8B zJ)l^UR$t)kH>L-6w_hvs6)UyePQ`O!?8Vpazxf(q9)36g*t}{wAKq(JN`SWWNl6LU zsH|nAcrIIWmxlf-*e+Vb-56Ktow>i>c8dlkLq_J??ZoVYq> zB^3wF$rxC|0Ljf2VFo?A_?;-~=)3q|!ai(Nvw*r4@m`a9(bvq?p+X|TRDYz_wtrtq z@;^|zR|30O78n5nF=^$I-)0R*0ti6gcO8L0f6ZnrPH~r_0hqOZ0%md8#teZA5zb>z zvGAgB#;-8b%^p=5cZ_jjAl-9-BKY8|}-5ZjT#g#sq4cHTFAs#fkJ~7$^_9vR2 z1i+7jG6vIa%}q-jUjlJV{sNK;uqh`>ii$hJ%pvg9Gzya1bd#G=0Hb2K4^L!pc#!n5 zgDF$GYBCW(!4<-%E1XbB+Qbesk!7>vLPOtF6dIM`(i+5^X`1tefs$!VWzglhk^-*-k1cG?5iULIk`9WQSQ>1 z5{*CSkaeQm3~+M+Z+)xwiVrd9WMn+YQUE|96c%;xJgW1@tiRiS9@G&v3W#Nw9v}D7 z)aLM+^gT$>y)ZDK6wy^C;H3}?QD;JeWETT|q*?cSJ-Y@Pe*bY{YI}z zBoEWm%5)Rxed_iNwIQf5Ax~UN6f13$i-M|ps3A%xJ&sMk`}ZtfkjkjLecP@-?<+xI zkmUMN8~r^$-v`GCjDCDH{UNH^52DW_00${zZFE6jiry;4IRhwaYAAmcQ7!b4$BaRkH zLdqbq?YKI-)odvSvT6g6NeT+Db9|L3_s$CsxRogRj=hVTxXNfFURYKP)v3VLX#nl46Gs{ak?gFkLi1P0rj0*X!qEYsL$Bt>A<-PT5*YoJ)UVh! z1wTvAXvTNnt`3$QtLkS5x%E}LPJLeuAZ3A{&1WG4O!3hA zOz7!;MTmyLrvwQ$*G_bqg1_L zCSGlsCQ(f+)9iOdri~goF1+R;-|X{|kK7%%BV0^k@U>N8PY4Vj$YStWkY&|&=U z^u+j{UpZA{>>E`=-U3!&7EqG71`(VV`a^z%CK(ta(L{n7jYcp8wA(Qk1xl90OMT-( zFkvsG`)??K?ao6V%jo^*i^oc6F*Z`cDPrMn${f_OoPKnw)*rg)1k4S86KB(PR?Tc+ zlGhLW{(DQj^I?K{(%pPlhn$$_!2|6RItt|(A(I<-_&bt0%jMTVk&D{>Pcv}#*}XI^ z*f?pjk$^n2f|ExZi>v_DOm!YvSr)^K8k=xz%^-)4l^Ly$cS7u)z+LMjrclE9pV>cp z;Roi6{da!d1Ally#g`}?h;Y@s0(b`FG`f++Ne^U4&iL}d(IiX=@EiZ6_E`-D9Ug%qW3CZ2N*evCHkc$8#pJ{C@)n7anU3Wu**NVSo5Q1^d$U~#2B z;#UEb&6oNq(j*y%$pNeHo`Z+2aRT$=paUD_#%!-*(*g$(vRE0imT z_Bvgq*Y0vCm;V$*Sv>q5HZz)0ZyXUD(7)Fj&y^T52-UCCC36v`1;9lR_g)ABKxN9` zlaqfh!$&elqZC#zk~tF8v3iBL>Az8Oe9I7NSf#_l0MBOI*$|{>B=iQ^H?~1ET&6uU z?aS9Z=>G|-*T!M_8fEfZu6nDciD>F#3Dv-7Gv;Up2}HrD@}TDYg@WG}%8L(?Sf*!* z>W^62>?v|^(J$BlCet7H4xKTY*x=X)JAV;9le5rLJti~Ji>DlvdyMLaMEdijISUA! zi;Jr*I)4PwNBt$Cx5rQ6dXSJ;fTe8ClAyAWHJ`PLEEr$WY>S^o9u9uM{s7h=A~^%% zGVj_w7dk&-(R1~-P9MM$Hi-=~QxM!^f=K%e2a|3cTjt3Kl8SPQ8OY&we|3{fPE=1w zx+=#@@qq;(qKkZ!Bz!X~ZEcTr()WFjkB=^O^UgmGTONZL<1hc?*|w1E|8eXk0hY|x zsQq|!?GKDrm&n^pnS80l=|DO~kl*9o)mYHKx)I2fXSR^u%+CW=^IJhWL&q1C?%`Gc zTK-)t(t@gVa~*2ClN)$fn95^j?*YO|*n^6qe^k?HTy!>m!#X+{QkU7M6>7Ht(&xwW zXtZ}A%t~fr&S%nc`i}e$qP}8fW5O`jr;&Ox-+VJ4Ottfc{RHx*%CBM+36v>AytOG< z$6+zA7YtItH&+lRF3P?H>0Miu4J;BYF}Oj6i7#%%D^#8O4^P9Lk}rfv)EJOlIh3w6y{{HREc7X3KB(@B|5~du480>2g=}yZE-;&?KEI^9-*If z3NfLcIV_K~S!qxMkxT*sv^%cW5s(x#10FXC|8m-d>ad`jm?|AY4{@#Mh z&@ppl=VDBnF*54;GWUtCbm~QXiJ|0aX_eoKit=_{3CboZPT6SJQb8=A+}+)M)vLK% zN=E@TmQ;<9*MVeZ%MA~$t9!-`r`k_hU!4iuZlP-V-sMYCO1yizYDRsE(v563aGcGk zdh+1Kg5;-kMlD4T(yQ3Jj3$Ru6I2Rizd=ONRyk3 z_eS2QB+rbltG11f86u1>`^j5iN~`nTE>bK+*wq@_ssdbeQeIJ^d{JT@32^Y>UtV@} zRxR%YRZ)qME2{(D&@4v96zQ&W2!c<4K2r!Eo$UTH8>Nd#gwV(eeTWftGNHU)au7PZu@UW29Y3_AlCb6CQ%y(DY}BhUJ-)uz`rWu1 zU-ZuY39_pNGVctdPSW@mH!7m5Wy zf<{L#6}?25_CSqo^9F@G=dxnpeyC+cpw34|E_On zbY1l_8Q6-*JH4OU4~G*G5iK5jA(kg)8*#@isUpv;KV8jK=zX-IS!LkdKx&(29q(Fu}J%NWOzI@{h>sFs1S65%^`|wbx zHTUagyl0k!GkiKDry`>gTG|PRy(08g&h^e58m{ayX)N5UqP;0`fJB zHDSEsdt>QfF9SHTs7l(5zp6Ei=Ks8Y(rp&B0$c9#Jc^Q)4yp z0>Qwm#ITD9=cw`# z-^6U{ZO(h-6vp0OtGEnePj3Glxou{QV%DuSi0-rC>H`Q4O;4BLER|YVcXGRqe~=;U zK`UkeuD1E_p2&Sv*#oGQauw)*T3o;UxwyN`U9X^|uc~u3b^gcD%0kxf>cD2Mcxu0> z{Dm0j;DO<>fRd4AF`NFx0{$rlwY8J#sGfIBt$w$-Lt*R`gR{R8vf%g1;U))a%W94s znL+pSY$DQk58r$vB04A`;V7 zH_e<`+7Q@M0RhU+JA@=TzMniEU0d6cMx(zrZhzJ*^-Z*5e(pu``XiLUox4-wu$E>- zA}O1kqNgRuT6?-=5L|5zBZQc~ryio4#ti|{2(Y2RBL5@;-hXi&P1;p^@98El3+Rs%n;n7Lb?R!CQ5n9c! z=^4JO-eS9JhF&p;rR8fH*h5(i+)h9A6f0L zd0G<<>!R$~(%HgI(v>qI^90ak=%h`claUbi5bT|NmK-&5sj`|9SMOPG8h&Ja*t!;8 z#w7d3=h|T9?7G@6#EP|gR0I3b83y(D4!GYr7FjuRsH-~uEXi*4APn)TPE zaWmpI`F`=Wi+_n6YJ(Ok)CI4G)7w3;PMRU1$4Ah$HlQTs1r2Uy))i9>Nebax&MsB< zS_NXqlIk;*Z65IKA>^OLuV@)Mz{diq(Z;ETkcIYRJcb-eRY%cjb$f(`Ah=XImW(x6bqE0s+5@ z$Vk)x!)1!re&DZhO&5cc7UUIS4%UCD<|leW3IaqAoUnkxq$DkNo%>X*T161HO*Y}E6d!tH|`H0=#@(L1oYQahW;>r>> z4$vTt3P}U35ChI<9k=^XXqMjwELA@Mg#(l+&aS=ub8kyq3dRq9?mXhFgV}N9`NX;O z`+i$+7cVU@>s<6a_LLk3KYYz?^}FJ~Zp);mD(LXN7|9fIeR*_6Nm1*c=~k|cs5DBW z5cd_wL3E|dx+BKuJ-5cux-Y1USSFEk6xih7qfUx3^`%Ej;>#I)Zh+X7VerQG@&nMX zIkO&S7s`v|1$z7yfM{ZPv$g^IxFMr+3K{p!{cG-m`=}TCjIrqiJwH>nbNjf7&-s&D zOnE^I0@>&c21njfSAah{!?HWRMaDu_eUz195x;T6w*)!YM!2~xr{|?JzU9}zVl^On zaX{<>88q7>VK_-Uub8yf(o-@554Bw2w@^huzJ$J`t|rB8-}Rv8;bzlx3Q8JjK0tFg zmha+CEjy@PG67&m`4eCpmrx=;Z25q(k0R-5eDHBI0wq;TQj!cEN9~6RUHxp&Iy68u zaZ8WK^ywys(ZtMzqx;iq9nYPpsKw3m_QRsX-qsf1si7_hH*j-v(9G_rit~)TxPYEB ziotf)_5CBHju`~S+pqk&s1x#bH$apQB$H8sLrGrmM%QBtk6^+Vavwe4nc7EJ{ell9 zB`t_@QwXQS#8>qp4dfd&#}s#uJ8dbl&0MUc5f0n(`0ihBNXd7X_9}+y-@JyEy0Q7c z@UgurlaqeUcIHuOQoT=Y*=3c7P0T7kf)}hN3<~mgnMVm+oHUGJrnCM$nWbTPqGL+7 zd%Vp&onL@?2vSi|;?cW5FliY@7mcY%e!>D~s*J*B-wL7WLGG#_r}sKDf+W-)A>Ih~ z_ieDhJQt0?$tY@gVMUABq_G7m0QO--w%Fmj-%UF?2XZHO(Jd&0vOQ$v&A2(>Kh#5@ zFnZX=(~~J{M~m-yYS6>xASPNTIt)=6_)3xITb7y#SKqQAP)2?RCsq3HrTUg2) z4pgCMRvj(=l` zreuYJTTxec=Uuy52RlF3FyXDzsJBg6s1S>OpWv*d^T{@p#)9K*MhVB#zWG?VGf~e^ zEupXGqY34yvqRVPUjDaCJU$q|a;)1FfzcSC1BFom+8<={tk-{v z?u{^M)t$+jvPs{8V*@yfbF?MmfUQ|kt05@iVXxyD(Tsib)Sivcs>t7( zMM!Om$QtNmf9S$UEy%T?IypHZjOy9{yx`J^IDUdOx^8|Vh8wW39r@8{1V5iXADRVT z&E!4|<+l2q%Yt8egBRM+qRwq&H{+10bx_@aIDFI@r3G7R+&>1%Hv{>0xnz6CJ?T4m zs`ued^G+ZlI)sby`u^t@1R};+EO~PM_pD)*g??EQ?{%vv+Xjn78;$SLt;yUsEz1_t zkCne`O$P2aH4WgT1G06px^O$0tQP2?-cEXY{f;*E%bmUeNs0Z!>Gj;)+~P3>@yk-E z5aZ&-v-E-r9eywMMy|}Cm@W0ys28+Iz?d_;?xOIO77Zx;#=r8b5+;Le9bX&@WgATt zE)zUomi|fymjY5F1LW%b-OJ0?`}y{0c21K&oi0lt>e4uD=Lj%5Xr0V0{;iU+S<+Ur ztk{AcC%0#CW+s-63LywU&zAwi#jZ@IUUP8;%sy5-zm?)czdGHgoLSQ0aj<`qtcy$? z5;nWyN}{9lfrKE78lah{r>Bez3@_bLbxloQI(?h{3I8sBcd6SA(ese>Q{(e-@Zs~{ z>*u)Khb=bg$2P|6%+`GMlV0W>3a@2IW+P(6>!sOhkx~V{HcoD=pj^0a^OybW>D{K* zyB@)Hxb0d%<~HIazZDA~*mR>C_~S44rT9=hzZcK{q>afz$Dg1+(SmBpv{ zb)YLGx>l7=xA8SC96LSCHk8ta^JEmC%MM}|{OAd7_C_r4<_52L8x{O=IN88*$5<7z zH;kD9>(Hm%8uQVjk*7{CWL0*A)f-y;sbThletrBSe;lU5(5MJ+Nf4jN!Ga45Ayq78e(p%zG=H ztF}|Hc}shf6K~f)-*r4Ao)bErU7s>tR|DFX|A~m`y&Rxli_Y-Q%6f&8#3IDP@n8}M z5GM)jti4uTAy5L3HQ++M>T0gz$#XRG7}BwN z`Xc-Ue8js~8r%X#Dl&-Wkh>Ysy|s=Ms%bYR7v-xJ1HWrCgs-RhdR*TeZcZy@R%DN- zW%2j^b0S#!mBKfh1hoeD@}YThemMtfyE}he2Sf@EtY9mR4R)C-pdY^F(L&MGyc>RN zp&RC=r(oW|E@m9B(PTsgN%h^|jfV(`ZRCy-;tyAch0FLbGrsFk?9V6M^a&1@WQZCm z(RSYSc_Z%!Nu>3x)UMTf$`0Or{&)JkpZijiv%wYbAEh4|pNT|7cr#z-@iGuh!jI;*JKeH_gc@6LvV$$`$?HI> zm2y28{GhH7vE`O1zmzSYS=I7}X;zD@HT{jxu6!DHhP@nR5;|cyWI=`rwEHK-*0@{* zYp1iASmwj~<&Zc0U!m>IC)G7(Ck=XL!51Uz>+2(p($ZU14Vo?ZCM~aJ6yQpiLz2)a zCy03-VfpMfcR1C^8)g;~0TYKHR~KQsz1Ota%cirk!*(8ZF3>VZPoOvfszX=#6VaQ1ZgQ| zO?7a5{J6Xi!-Jy>-FN z+1vm1fqTLih;9!va{|eGQ|$Q)v&PE8hLR43U3`d}uaH0-Dm||UD1HOJ_aD7c6ucq_ z74hY(YvZCmM`*_k#Ktb6TSvfK2dy!!7Q1YC*-KmH{dzkKn5URub*-V7KV@P)R&^|( zayAd(Nm)g(n~Cl%Xa&*|0{C1VOuYycFGAg6&HCBd)#I`rqRP69+m%$6DOYnhg#M3Y zcvPjZM`{*v5-*ne@3+D=s_6`D8|{n4U800L*ygd2*`?S)QkBg9tu1!X48ZaXY@Tu! zgDNdm;fqoimApBKd80QXkGX)!a%a}ie0s#NiU_7Oeix*fNQ_SWuDNau52Zi?g+!E^ z%FNPfH_hOYC0XlGKb>et+qlPyEuMI8A<#&~XmZ@zlb6jy0aXYpEmU!W%;FFb*bYBg z8K?LUz{hXyj3I-v#2bR3`izSTkfkz_FeYw^84l=<+^ss?uWnqm>47V?OCAm|rqs0G z9UL#Z$~Pfahbz1uD0!W1Pr13zhHE&i05dI^4OEww;s^vi)^l*Y;u2rRM$dOoK z0&&#OVk*hGofCrpV{vS6N&?OVq8e}Y$VbwF zRyTmWGkzc{Gc!~A_AvO-?55`FoagC?@_9}38KvBo#Qo<&d=E;<>?E8Do+aQZHpy_f zU2T8KmLUH$fTm?SbyBYG$$jVPUDtjn4g{Ta4;V%8%&}0UR3Cz1Sw_|QK;JVt_t7N7 zRs>>LHabbn)5KJ(tBy6WC;}u<8!qzmm#M32P9j zE#o79Wf%zvDSA%LFD((zkIW3s#O-k0{7|7|R>h?Xpo{-*I2!j;jwB=f+d(HGZYKb@ zW0>opxU*9n`uW6lN5eKR#{B)5QPpe)fH}`h22i^<_Q_az%h=K2i>+PBcNPKuk#3>& z3N#6-KN$@7glHuKsrTNb(!)U=jEXJ6P0#-pUA+-ObtBB5`Qzo@df-@aTz&RaihkNl zc>4R2qn-Hm_@o(h+Ht#jL)r20S8wt7yManN@~7IaZ1);#X$rB0b1YdQsnIKDd1RgC zCtjWq@GwmWXlqIkC`K}E=vV>S8Hc~y)etrOi$u5#`l0`ap(+K9Ym*CQ+okr!<+jb6 zebLWF)k#CEE#ouW*-k7^-!UWvt`0~LEb$ETrEVV|P8oh3JJC?e4f@LxetD7mJdf}` z1#MVH#=-slh*mPIl0x8gCSd$spL8UNTPhu8BNuke=7j5lR;4&--J?uU_a`QOSXc)uqI4t^S+B2jG7(OeCUV z^95IAG>xaJPY;+_Nu3)yrlEUdxr``oy3b61Bc|g-cM}U`nRea^;K4-%(V!qT^-`FL za@fX~#I$H5#~*KC4lbAMl*gK7ES0U12_MOP=nSQfo6nx_%?~H z*MEBv;?R+M=8MZaHBU3rcdF7)KvY~l7Tk+rN}lR}_nC)>k1mb#PK}7b4>Wh}9nHnHQgk$eXJd)nRa{%I@D6Aa>$fhIy9(2VmFWl8pF2NLc8t zozj|%jbt;$UxlKo*cF9o2XST}RupW2aXJhb4XbSy!d2r$=Kx0d@P&v`r5kVqPGVuP z;cMZ9)h9ERKg!W~lZm7BaZoYGsB_wbp7U3PKo+n%nTtb%7x7!Zs7`Rwn4My;m5*dV z&_hoeO^~x@h$a-nejE9f1%!*O19vaTN+d=qEdv*jpWf~ELn@DZb}t`(*PqxjcFSop z)GDjYZI{KCPRWHQ-9MU!tJ-I(2YYz*AOkymAMeP4jb*nW>9)k1MAnxu^@x!H$M*Jc zDo1gahb6et_qsyJFIYf8W^~y=JBWaYSVmoM#r=cOi=CH2=%D?f?7n^V*gxtYv}wfm z>r^p}B~okb_kOdQ>{eFv1Jntat7!1-goF%O3>tWx+_fui8R{5Sc?R4b_?cwt%`iuE zJG)dnlyg$USf#(NzJe-8OFwSarQGP5J#8!_M8pJ!|M9ooN{DqIdyi|qt_k~Yr3%geRg@1l}8v%-N@$p$zSNN z4^fQY(qK_#pL3Uw6Z6SVB>4V!di+b1|4)tt7_34aebyI4$uW@-{I~CLj>luPcMlUN z!!2iCr2|I2l3`01MfdMHb8zG+9+SGSob{7rC{(heV^h$Ne*X(TLaL2kz&U4~FKDsH zTH~`!v!r1osLErybaahqC!!$R8K@%R@$GB4l+nMX<;;Kcs}RMUy#Dpi7iQzuxG3-n zK%zlJG=M-Lw4z?Ts-3L4J)0+70d#m>Rk5w+TpkLs+q4+V#?_V3WWv&-y-(sVmX)gf zr_P5rRZoPj3p!MYRX#kAbiVae<$ad;eU^gv*NCLidQW4O;On`14U=4vX0-5L94abHv+cIeRR&> z-8JgJ8NQY&g-&M9&N}5|lUSaJ%bw4x_E9*tuFYJHo~oWe(&M4)FZ{pX?cs8Y@mNGm zpPBiRe9D_{VDs_?PlmI^Jp??U@%W#T<9$J_&hed9_0_|%DPQ?)&^ffphhFG6U|?S` zezT{iXE>E-vwGJLa|S{+-$PgoE{+x!pOe3A(Mw zeSTs*(uNe+73A-PcM`4u3jO&|eTt?5Zzx;$@|uOwMdYC7g3#>v>!~w|DVTYo$$jMLZCZ-ejjjCK7DD8RHC(foM5-hKUC%%Hes)gd0lz$;* z@fYw26lHL!HnUN{q^ac)=YI2D6oKHSWD9Jf3Pk_-&?7BnGus+ElEpfSg>CLot-g#5 zm1K0X<-P8Ab~}nQNTa6L6tyo~BT!i!jQo=?$8;dc@j_iiHFokSjstfl8x!zv^jgjp zxwrprKq?mc{*orU5qT5A(>&&`Y4`QN_eGBbf%uR%Pw+bw}}aIB*%_aV;V@H(Ot znY$)x1fqh;-ua^sj#`5q;(M2zf2HVhimv_FR%0r|J`VtnUY&#!>OFFHBx#-dw63~H zVEt>x)VJ7?lLr#}ZE=EdY{&Oxe*`*X_ZQ&8cDAjzrS`iHaE3)e%={5hdemCp*WQ}3 zdE}i0ZxUI=NyP-GngiY7r@h~|&G)o_G6S%)c17P4j3;T7Z}pcPDU`>vXJMnNdU#*I zxSCbpsu!ULG{RWuZ0M%H>~I(md6W$|mH+Ohe650|zQ;!ptuIC5!NSKLhN#p*ioGko z6rBn?Ti68n#3_491oS_3Gx9X)aq<&UJRPN-JMA+v-T*EGZ5=*dzoa>CS+DO4@kKwO z^xOcOXU{*=pycT~tFz3JjGwgRhIdfXPJA`nNuViis0T|e5N3>^SgpFgXnp>iqoyaJ zKJwpWiAyc^w?p9fk5WMbUrpYZx=YeWxv`gzUoRRuQz@iG4wg>+*=A-_iY^rRo{l;y zPgcQd$?E@a(PZh!aJ?7#2npLNo!b8_ethi@&YD`5*=g93@3|7Ee60URKmT9Tl$v{B z;4w~n`~B;Up_v6M0XFHd?-hsZ2@6#BDqAvG?w(au@dG_!>I30%dc{gESV@ZMrHF@I3;W-H*HZ?L?!dLN#~f=q)jWQ1(E&JF ztF-)FzbA2a9&Pu{6kAB|t-d{p>V_i+V@&n93ZUK4$vS#eJ=RATK!6s{^R^gV+C|A@ z+8S^>xvW{L%>^p$K`buToVYOd*Iq8quJ@I!qVn>(6<|xKX3HKeE*nj)iPa>!PqSK6 zIKBspQGRTa2;I#p#C32!0)u5dZbxY(sz{nG`W;=jhz76$X{| z$m?SA+~@Ml!Mh!=a>wW`5&?Ge%HC$wLciO57wDNtz;v0om;U!B!*nJ#!BnM&W@L`=9+&M#%+LD*CWywR z{smKOk!{H(OW5FOzX=i}X~19=+lf@ml=n6N_VEn{v!hwR-J6yhMnY?{7R5#d_zKOlVgH4F&y#Xke)!C`eBJRQ%#jgH~ z68rE=Rh$**aBPdIlY^9pKgj_!Ca>SI?duelz)@^oT3WU_+1}>OS;MLbF_z!2Qtfu? z#VT77^_ShtNlM`_!klHnK<=k+sobobim#ATUq|%MmuEHNG(794b zSfZg=IeNlKH9QtsP%FD>$i+gXqrH!H@|;TNHC?;GZ?;!pW1YWq7m}$51j8@fm&V2R(+Dx}PfNDewQzG8!}6W-wH){i^7rN039SIjM#*mz*HJ=N4zU>+iK_EQ z8fq$?f{Ow=PQxlsW*Udl(2q~UoB`%!{SR5a_nT2GB`>D;E3h)C)-b7&qWFEap|g{& zy{t6|-6;ki?=3ezs*Ogb&My9n_MbZ!E2H=XtdNdp_|pW~TtNf74lgbUr9mvqYIWe- z8w>R=?5Awwcw%KI0q}qGNM|XJ6A4S@_DBRL&z8skRuiG=L zbiaGLxxHPAlJ*l;R^KX%LtK%IrOKriYjdG6&)1eh4%&>O=_?Z`J3UPd+UJj`SiIii z__fuyv)_x~{VQ&|uKt=BYamfNienMb!QiPgX5bk*D&KuWuaVMN0{VNqn;XTTuVP;} z?}H{lberT!>XnOd$DAjjpzhpUUiP{75|{eP`rCf$x;NH?Gu_b8z%zI@!2eTZWuD*X z;^?@>Qwbe)`(y82PWHB6QpKln$Fi0F#d|4Q1s*>NQN&1znRzoq(`O9<)2-EXH{XQD zEBDL7(GBsPe!8u*c=5KbF$5#;rFZll(|ck{ZdX5qWUtmyOafqLPW|r(&62WLM+mdT zPnEQOL#oTC^b5Yf@(w)jT3Q;Zk6@$3QQm&AFxd2{K>-YP3tQTN$joPFmnu&i!Y4n~ z*W;2$6H^T$Xpr>KM1Yk->I{q3Yh|#g?Mb=~_wPd`cgGR9l8H76g)Dj$ z;Sylk1gPoxUxbSNiH@gx8XoybRXvTY%1#crL^e?7CfgZ#gkJVl zTnf%OygXKKK!O>L%pyhjzm+TVbReo1_O_z(K>BR5<6;@)&gyV|K=hyTFGc)cdn}Uv{#7(u{c9(cGjmBl;K!gS zXDt^MzBMsOg6tZc)3BQ2{S`57p|mHFX3u~zzU-Ly)n&iu+hde?bF%obfgxv=j*i^| zzc-h0tL`Usb6%{3WQxyryqq18r``(hb5V+uWdHhmy>dUX&B8n^z*8?d&;U3cC=qP# z0FhPkU(3I&@zNn1PJR_mmy;_$|bv@;bYo-iNmjcUy53*NcDi z3J#W5*PgO`#GICU(jbZ36jj%@@QTtZPcKesTs+tv&-V+k$7z0qq2Klf~M?%D*^McNxRzYbUuJbXsnlFoc5|?lDP$&Q% z?63(Xv3d7Vo%AyiQS?@ItBQIJ?FxA#52&L_2_bPTg=^PxnE88FRq10fSS;x~qt(6L zYScqo5E|KA481WA-?2hXqMmV2lhy0eDYD<5Q-Xce+`bx&Ql++vz1arBwA2F=$n=OG z1U;hJ{o`uK_fpl)`;UB_8l|j=<=N#=w6Ka%13u#eLEYKiZK28u#lZyglxyyA6XTtG zZL2-neL%}>22T?&lX^>CFAK!3`-?vf45j0rVLtb=?UMRJ6}h8G1OW3Di$|NGI+$7&CC zxu`C$M(ChLV=(TcXG!!8DvB^PPbO%78s7U$<16WZu>bwH%)DLD@ba4L#`|++-F1(? zU*N{({{TNhz`i&h4u_}ao-bPbs}qJ7`TO7YkTON@PeK5<+G?u^)5r;hQ*^dNaCAg- zbOeXFH}9&A^xX#Ii|ZW57FKbo1^r&xJ@~m}{WMLpqU|&hQQvJ=wZY5H|MK`=kQ|YN zIM8>yO~2pt`)Qh{X*wP5>okRPu}V@B5unvN-QM0Fj}OP=!;gRRf!T+v z2`no&ExOWRj*JW#mVpbI(9YL(&g;_Bt|h00k!YOX?tq5i42_}P?D*Ybd^j8uQ6y+r zAPvA(Lr<58d>DplI;l!ZG>5S`R~;J~5wplRj;c+B-97NjNE6grrJp?um}R0PmlN6- zPw7axfG0o$*Vd|9A<;fVGjBQ(QCk!O-3k%8HgubnncXAM08`b;(Fn!45eZ6HCnu8T zC2zLlk4sb%vhvN}0MGxK&Z$xy-@J=m@d$uIqE|udcja?Wf^XN(ou)02^lJ2HG$l@9y8d zyM0sJ^s}G+jA+wZi(>I0tDTEH{X8J^vkDZ-+|>j^;n#8ATEH%z<|PIWZoz@4nNP9| zG9U|OXr`qOxBuCH^#5)3m=aIpu<5t+CeKi7Vd8NblBB6jabHM41nydE8>Vr4wF9V0 zfH@K2rq5B^zetzZs+;ZZB1v&>9fXK(uG-vzeG#x(o@Q`2@Z2HYN*SkeaHtMdmAY<+ z%wRSiPy78|2vtj)iin6X_^cgktvNVy@~BcK*HWxbOu5#Pv9DG#UFUA2Nal_ti(JV$ zq4m46la+zLEROT@x^SUAC_wM2Z8(&fMdR+!mVyUzJ3D9}BL?`~y@<6DkxUgl5egF# zp=m=@0tF4dzyv7fRMp!!3Bzix@16HisIUb1?-7#haXaGp)Y>N@WK&}&49Ib5zW}fZ zZs5|NVf~^@e;zOBhfj^fqY`jjvcG+YiK(@=-|t_%c=7JtySH!O9*@V?rlu3IKOAny zaXbwV{U-hNCqE?;;eKuJ6x>WRbC|p9zPDN<0247HsRsp*7I{#A=J8>4OIg{@^AlsW zHVwD!`1bVh)$#VLsZEk4F?&=tsv`BR6(c$xAJ*rx-S+X~czPfrBsiT;UDs_lvwmo; zl_)%;xlQ4kCC)j!8w)c9_cqjO7p~6Z1!$&TLO8e0U27X#t8;%~2dkr22Y@bPEk`Cb zvuQk4oVCs72)Q*gOW9eF5zq`B2ooc@YZ;1&oUFqB1xQBe%)ObTGyOTZ(Y73sS%_bT zTtvK%Ep4SIohLlHLs`}oTiPa{Wys*8L-Z$YSX@UyG8ZIMC|V|wj);*AP^)26YDSXx zlDE|WZC3POavAhq;Y^q(*P8jD%Lt+6MENh4y@LgaxV#Q;U>)eS|uh(mJD zF|opaE*G%Ng8OI2;c03f60M?^wbp10K26i%csrHjZnxR*x4-(;ug3B8AOFYy1i(J~ z^v8WS@BeWbbGs%Ik|k06I5=EscW3MMXPv31i{b#(4H&Y(@$~jT|Ns3%vQY?f?zh`5 zG<8>IRITpn?l(7A>+r^JfxMptLz12GE zlv5uUoltV0H`jT^-ca)U4LY%mE32(3`;+{0|4Ht$Le?30-qat&9Lr#?xlA zNzB#k@NnC0_kG_JCW5G?ad04ao60Z^0IfpWhB0S_3GtkpMCn%pZ?_b_BM8=w{PEE?PvLw7=a*N zI5LT@?1;;6g~fVjY2@#mW{Fmhxp~q&CTEV*?;Zb?S0P4oeqaX*KL`?MTm|nw62xG8=vZ^sBU0vA$t@d4BBNC zk;h8z?hd1Q(Pp)oDY`SbKgoK&QiNT7i;$K z$bf;=$$=uF29fDNB1A*zQ|ef9m;E?RP2YhL>I9Sl*$qpb5Zwix*=Pf^NFyVn10ki9 zu@8S1j1Z<~NYtEy`dv>aRR@!%#MBcW&D%7pNDwr%RUjm727t)ra6Gz2vDYVNK8;OS zx$hjw5EbBXJR(AnGz}rO36T*wBv-)69n4VY{y?-QJOIFeh|}8UEcaUq0v2r=dfK+` zs$A9j^0P@zTW#fVTgos^v8PGyy4F&^*(B+zYFi%jcDqFp0LB%YLoiyQJ4#%$VwNyg_^Upu| z6cAHNw{O3#Rfps8=K7V^Nr`|HkW=EW&ncyl8Ce>#PR$Dub=|fO1^}B45`u_(E7}%* zC4_K10HD>TR$5axH1$PM6U>e!ddh>hTD2iF>sSxv*mW!^=gco&Y`^*D%dYz=0;ZHU z+YSL99`3rl>HDoaAp)3HdWXDmusSt1xZ({1DigT*+}IVCW%9SO>-W-8Ylh#}HXVqu z16@jR%$pgcGx9v!Eq?b79D?3}fWT(%21o=B?)5{jTbdU%G#3UB2_)u>1Yn(e6sC;C zu*=aWy{enHu^G5mBr~XL0D@I>YXVCf0cL_G%tB5&nzJP7TyRp=W>ZzSiCmdB?yL<7 zQnbC^@4C(AYPa2*+1>s9n{U5;`}S>03As(>KBtXY(Kab3ZE6bTG?}QG9goK#50{p6 z&D(?t97&imI3pw?w%L~#BS)WuU|5yko7@CYeiiN5+DJhuY`lA9$)wloP-jCgDz#iD;1{H6@0$#L4nb#b$hOZtfE@d=riU0&w+9)F6 zwM^4AoU-t4x0|L(p@D<7=pd=BO=e{zzuIpZ$wKXnQCktt+f8TYrVWu1P~~3n0kOHO zHFHmOxR;*AdqrB*I{d6uJ^0T0EVjEms=$1N7s zqj(_$o$ygoH(U3?okPv5YMeBqH4yd4}VhRtp-;SqulCA4^y#S+Xn*{a# z_S@6p{`&eFp?aMR;ML6+pS-*h&O}Idg5o|+;NF`i)GV2?h#OZOwJ;|l5$Tx{fH)#^ z$0Xt&je+L`JTVfsCu1jf1QZq&Sh039w@M^*b#?Rk=RX>T;dneA4u^+_Lu+t-b(3?B z&TPXl1a#^CLlYc+fu_zfy=KmWEPgj0?!W%EPN$TSEa$!(PNNl_6%|EN3f`r$$W%sE z>$=>upi%DfG>xh2M5OPwk#;oe|mZrkk+ zz@zMRn&$KbBKCcMI*yk#f#67H;W~|XcXyHA4`U!AL{B-X+Tn26?{8AhwN_?%xW8|< z-S2T6E24m-NJ2(L7P>ZPcSZn*ay-3t)Qm4c`lS%++`s(ejK`mBt#VoS9^uj&XRX?) zmkjMdq}}~=I$Z?AA9Wzksax|v3YTwTbU#;{J~Ch;Bot=_abW^fFaSigV%F4}YH@Eq zD=&gVM7&Xjf)1cyy`;{onxZ2)fdV3i#71cih$%5k2S}jSfl=nET7(arU>8ZcSTUd!Nmg5vBWB6dv3$ZUiJ2BnVG zTM!kdg2FjMXu!VfZ~DGtVnQ(WIqoNU68ADQimsdnvk+3~_vDV9BTy7cS6A2LINsge zF-b~!ZPgoHi~GL+;ps`c&{%?ycSrPx!|hjJ{StM!zS*Ac2I9c*8w+nzj(#!YSVC%N z8b?k5;3E9#r(fLO-cHlxuI?%#K%7z<$1$Z2kvE$Sk>sv(f++b~CrV1mJ%l(nt%9oc zeFunu<#Za{O4K2)E!q!nQk`Q zX7%mcZ%?P=cDvJ7pkGV~vS~tOCTWgplR-O;lQU)^q8#cGA8ER)@vOV(2S)YCo)`VL zbN2K-%q2u>f0Nc{h=gS3ZXN=jgv`t-3jjq<{*eKf;gC{BF*C1C^OixqS#_Ukoy^o- zRf~Be0<}htf^6o@EW!jcp8;IGo=i2A4T&g;Akp3N(9ly#tX$l4PC-Iq-!w~%8)QM? z#D;7DWt&r|8Snayz39S4F|$$!W-jA>N}|Pv5*2RlqY5Y@7-DO>-ENV|%$?l4Ny=J` zSx&>-)9KW-)yn(pFK(`Hx^5$!0mT)O8682>rP^qoO z0xF57as;e5FFyI^+g}IFrlyDEUEcIyX&grYDpSe1XC`+ar%7EylsC#qmO5>irfGC{ z4W~v(;4~an8#oeCC}v;e^K}IUX9bd+H=E5vnN~8-N(u;%RBL6n{q8D+#@v9JU%b32 zHgvrl4i7nZW~nKOF=BFK5=LTjZK1#4+Ue~tKl@Q1{ChxNcw=2t>e%07zRSa;tTkPUHAsJ~C9bDGRh##tMxxB|x{X%e79D@OV5T zVAppqUtS^U?d_Yx;kdTd`{Ii)hNid4J@()s)Ss*B; zwIcFA{q^0EkowFu68I zw`QfD07}kDbpoqyWbVWW)?5p*fTJ6mTS}d&mr`k)$6A;L0gAgI1#fi{^g5m> zF}M<#BN&gIs#-%JKu4=U%^`tpW(tp6w9G?9vbjqZM)3mbLU7483!f7an)^77X6BHj zOV*qm$K&vD_bw7tB%9lZZ(hIJId2)=O%M{OGIth1DJ^$beYY#)sNQPxVH~EZ zjN|a>r=RV1TZi(^w_mr~Hk)2m_E-C9nx-P~*LB?{N#~AbY6jt3&86V6Tej8! zg^0j%6Hcjf*Wq+JoF15jNmj}SF2|$d2KQ3RX0s8IW-3g93%q#oBBI2I)ypt;-6o}U zd;3s|e)`F0W?2nK2aYs>PyeE9IFzkTz*Vd#Tvr@RZlL26vCWo1QxYks*)?_$6xFZqg)QR-b zvky#9$9uri8naMqWf&$TO(`)#B4+B{3Bg@Kfr!M2tK+252{)jz89P#DLqS(i*kA3x zy}vJYVmEY!jt#W9X)TC?Xvj)jt%=)kF%MSFUJTJmBqKHeoo$$|0Mjf_6Vxxjv9wn7 zhPSm%?tVNS?{DwBUZyg18+iNXSJO{_tkS@ou?J9R810~wrj*ut)cGNq(Zzs1UWU*5 zNtX{b%79i`iD1~p4iWG9&{2PKdYCmcB%!8NwN2A7O@o6v=rA5OpxO!|o7&<2APk$# zhr_|$5#f_hKH2Ygwbt9aHzJ&pAmVnnZ>^OwMZdL_cV%jbsLdKQk=%9NRLf->2HM6_l@&! zeykhsWuiC??2=*`zl^6JstJ0bJ^bAZ#3G$W=H@;xxFPB|vx)yV|BL@&bkES%v}zeo zI*rqKBrJ%gty&~C-5HsQy;(rJ09a~u_gV`PDmDPv@3(h%cR5RFAhuS^FbE?+d-39W z8jh_MwZ;ssF{b27s%?hG++4j{K}b<8Uu&sV5ves}GHuPYsaDlSfUUJ!8q2jg=+ay|(0LnNF!hC=CFbqQyE@jwmw%>mH?WeC_TWy2@URyhYk7fsh5%i$tp$xZ) z6m+zDQWOG05`e5oPT*`NBUv(tLYTRO{gP8w@wuf4BckK{uOk?G(AZ{u$mNILX9xfQ zAyCIG0?5P(w4F}()A(?I_&JrMRRx3E8c|jUV#+zc{r0QA-{hRkJn9hozBg-KPKbOs zoZh~@YXz9Q&F0#Gn=-LTVs!;}$v|R+(r-3h*D;Hmm(otdqz!WFR4V`=!Y~|F3$dq^ za&m3z-h>gsM34y(&22&^CUjTuMxYFhpm`m~qKH^)>-&wWrj*T$?A~=~Wkh#yKOTpi zyWRf!)r(hOef?`N-1IvpX{C0#GgIOStqqEl!LpvHzx8$!Pe*2!;?dVXy%{*I?EvgUt03zCKRi7(1+Ll^6%Ly z&fO(LU|8G*P>8Yv*<6F>#4IU0;5e01>r|RJc0gvWxq<3Lt_Di(%^L~`lbKm_1VSe; z1|X5mFpMcBk-38jP)o?e;SRODy55cBDQdC_slVAc7ZJrnkpK zJs!GosOVItiVoxH_|>nz{QA?+ce|a|VY}S|0#jFtW#14dgycr2@oh@I8y4)w{#8!b zEJ?vJAyP9a2*xeLszSPWXyTCYalow302ngJAFi@!PwE?c0`3Tmy#c6C(+F0WrX3JC z6L(XaQrZW5jzB@D&1SdRY`^^S%NH+R48xdnjsSHShHt-pi@^K+&8FWIi8a~Xye#St zksxU1(@>8hgtV!ZTWjvv<&8+c>9R?iVa@A&LfcRH`_Qym7O2k}h9erSC zM?4ObndaPeT~~)gN`gpuL;?ZIE~;)vZD~8DZim!Sq~bjkcF$#-E0YWn(ft1Yox3MN z^MXjzG;TIqHzE=MawzT#(aMR|T4a~!^31b7**LD6fgf7$T10?==Kb=QP(1`>h^(yv zRrS*5K5P!ifA4?xuegRJ7BIP6BXnjoFygZ$%9{9EDZY^g7=|HA&!%bY`|jPlw>e8G zMTCNO+qBkN!7V2#(`ecl(M?HG>Ux~pG%8D|rMiP!h=4h|J1ve!tHrdf$v1ZoF)gH+ zZA)z`_~~?Xx2EGToDdj^nRysajx|)=zW()ByX_{Yl!Or=2}8Il4k6D!O=T)WnMNXT zL=EzGZ2&wox|GNSFA68thk?=Ui*V+IoLM*cWLr>V;3ULM%y8k2lOQpold08G#^G4Y z3B0y?usWPhr%(}tixg{kssNBuy1To(zP=vE(OgfbL(bi2pM9QlpL2I}^J2fhnrZ`z z4h#rj2#`~^+wc2s&(wuVhM9L=FHz6vnli5%v=3B44 zOu&*2a2y8_-fa4D9Hwb>xAAmW#zU)afTgNPx83cDi5dDncU`Wv1j9{)OPP?Uv<8Ug ze*bXq04Zl;0tW#EV1jZ z7O_P82*3c(Ds@Fl={b7uB`W4ffHbRYt&t&m$bOvPwhXm6GypI+0yk@=j)_r#+^v=t zfsH+GD;|JEl)M8#q|OliczW1uI|oad%@he$8(?(no=zv5rb&n>i8Y#9o!VgrHd;e; zB5Y07)Ct@bz|AoWtJajn+PSI;mlnyxFr=<022gX*aXRIkJ5OeIdwcuKU;X0q&wi5A zUK^+ttCiT2a4pljw{N&(z`lQGj~(3rMctraGQ5Gsh=Phq`kH(x<^j# zQf#X2&|2%dZoA!{t0NI?VOw7|3E*c!9%R9#IUCN+vd@QENTmbdTuL4Bc|4SL*^c-s zmei}Ot8pARn@y;u)MhVUyg=k}7<2A-yBz?WPA6o}Ic+w*yN)B)h9X^-?KJ8%j;$#G zxwYf*h`{dPP#sEmfNRRv%+Spjbay2)xH}QoR>{p=r_)heHE;p}^qgh8?OSW7)4^R& zr(@2!>#|MVv5c&ajN9!7(T3sJb$J?(ecvNulsfi(cGqDX``yiq{Q^r$&Cmdt*bU9i zP1P$Pizh9|QPuL?74>oadCs?+`TgD7Aen47o0MO6T_+4a_h|%G1q8w+uAW!u<-tGs ze3vYmf2Ww-S#1;aqF?kS7C7gw-jna(zxQ|lWwXi%4%*7-R)x{59gasJis1W_JSt?SEL_Wki|YD{)VJ0S#|I?5yL-3YZV@2}Q2>7b@NSw;%o%|0?;ntS zoDMfPyW{a5nqKX9ZhF1nh7@Hh6PUXrn3h%U0wOyAH&`C?(V+JeJRz{Thq;EoBIx#qW|J%vlGb(oTQH)lA->E zNUCNU1x5y-D>An_euT545iGqj;yq?+KBxM+Bsqzj5dtzh!s&EyH+N$uVgQKpjA@#h zq@24h_q}96guDA&05exJWu|c&#%W+CPMv}@RW-YL@e+e+jpR;}k|U`D2}@4GAPm~H zwWe({t$j}5ieLbW(3q6T!P~FD{KdoFyIO{EcTk+21FO}l;w0B z5%BA;zqz{FjOAGB@ZxHJygy9i@R$Ga58SltauNoxS{tLF`!pWQbW)w%N=|OpPRE1R z(=^@-&r7i&pQd56>uzptf^WD!QF8?ZbyGJWY&IA2F%Uc9T<~#$TBFY<@*c1ev}RyJ zM&vr3%5>B=qL0=_oOK@0LveR^H>=^*8nT2DCQZ{Ym9gu30NiYL``uManOO{+Q|kL( zBmvOrIQ9KrxT{5@AVegYxvD40BFS9=9%-k>bvY2$Ql{1lGu2w^I5Hrjgc?5*Hf`$Kb*alDLamk73V^p(RBJUJ8$BFP!&pjF zl0=er`zr(N`c3XS7Rh~=b9BNCDPl9N+R8MZPREA;-rVar9>(GL_19m%d-p9flhy!<4k9NGT01@W>m(o;Xri_$Eaq|4@myWMV;tXMN}EbQP-E6$QBE5>%-%rChd z{P+Iu-zEanIu1wI)@257!I316tV&uNk*u#H?hW$}H#>LS+QdvEe0z6GOxHKpB7ArE z;DAi%rqk&ZOe_GewK$@?wN`UZvA!}B5C9nxMnBF)c!|K~GPO`$#iii(aD0$NDM{Dm z{eE{iJgBy-tNk#Zx-JdF2*BocJl=oy*{joVfBWW*IJ#=9<@KwVLZr32Dq{lR)~4Zf zR2{XAh;6q`2CcKrgkbnS-B(Q>nGo3TD=uB|dc zYn2Iy(~*RSG6J|HZmpW>RK})Nr#2qPrkZnq{o*Ef9gqP!GfmUbS_SlJ8mDOlbV=Mm zPLuuW%P+tD^{?N)d)M`S*Z2Kq;{a2uNQjK3P6Q6tAh-sAOrC@Y&9s=7X*?YtZdIql z!`=PuJJoV?y+0iv?rz_Tbk{FF>HCdH4%q9$p~Yu@o;Yl2yR(W+gfejikC!F!>-bL$=%gKbIxO#a_-DbTeJm; zC}nowqZP}3zYnfr*X7&Wx9{G)`_YenRO^%y-`*b0TB)aphx;z?ulD<47+<{j#KFwl zXP_WgdZ>dZV%4ZJcZ)#?m6cfsyfbyGN&Q8=?CNe+M_?1V(ps1+;n%!+2Ps&NUE0X++U;Wd=;ZW88u$elFh$Jbk2{Ym>v4##{)eR`nMer2#P^L{M zwN1R;FhZ?WYx)2Dd;hQfe!so?u1_RRm?d>{189Iy0G$_C9hiYw z0aR^lI@ES*`oNGGxz*h(`ig12qeU+et#S~q>lTm{>qABZ35nr zx2A4}3au!kw2F*bxOW(K+s!bZYMn|gn|>S2-lm7!+izany#CXF{~vwv*-x}#o!YAx zuim`7yLs`l@3vi+>ok1*)vuDcxc~fDzq+}8VF1XSy1um5Z+DJ#`!IAw+Dc-I$LwmZ zP(TmIvfJ;>&D67GC{r8m-`sxl$?MOzT}Q^Dt4e@G?nZ77Kuie$Q;Gnvt9^&kc}m5# zf;tl?p+qPEf++Of4`d)t?g#*`Z5W2b@rcOXmTQ|%!vu(>w!6E#zVBMC;MQ+D(*|H_ z4cri&7}acdwHv4D_U;~u)gh(KlA4>Tf`geep=o1AA~QQ8a#RA1Tjr$D6ZzYBhoAra*Z=PS^H2M(e{pj~b|9G03m8}_ zpx{ltHmzfIQ%A(Pt}DV&{BYN~E(+R8K%BLDCH-v4MCN|{D*7s1@~RF9>NBH5i`sgR7+5fM%0h@=!H^jLtJ zBqMHGQ6P7@+w_~9axGPx-dx{+dCxo?9_lnQ5xC#qADEL)1G^{8sIrkhIVLu0qk}es zR+=^!?#EMcCGdo3eUEpy@2;=+M07kHi5P**rj-2k%g+hA+qb7W*(a|*tEC)IMW&&h`5VSx>Btj-+B4!exGzb^)<1|)R zAmoIUh%)0-28<*t2G&|@+Q6w+taUsb-?1cje7L_S^u%1twAuB<&{{2JVkQSOS7rpX zVH&4WxBI=SZMHk+j*)sR(e|(F;_qXH*KX%Cnjih5~kW(otia`C2|}_SKIcRVHmiV&2B?NO=pQBL?lG_ z;-=cXjEyMYT)#q)akx!FW%PgaPyX3|@E`mqpMLUs*V(RXebOvQW(m47G&CRtLThRY zfP}&8thGhyx?5{?!jSt#{MpZb_RZH{fBxBLFK<43`QnT1W~1tWtaAu~i0W3trH26U zmLFUt1TKCF&;Uok22huu2G|e~mwv(_AQcFItu>k{n3|hsNqyJHf3CSM({?%@wAGwM zniliMOeuFP;!&GJDf-f^4nX`{YmKHN5ONkC2qZ!%NP?K@Fr31pODR1(+>fXGPhP#? zq=(bJ!_;+M*Tenco87(#YbXHh)wG&+NgPu{H$Y%?HG@i`DLZoku+ZIg_nVuWufKZJ z_x;`NeX|oMnx=9*9^bw>{H?$Bw@$;u>2#Q;>Gt8S&+^IZ*X&m7REE=VI`sYiv)7-x z*)SeKM>CyHx7!}~8`*3&<2YVjZ%N!+Gp}ZV?6n@=jt6x>qDZ z|0jR_zy9X!n;&mKl?3W%l6thdo&9AnH!x5@5EnNSqRhkuwHB?O`Xou<|qJ+PFe@66AMO3<{Gd5oxk&U{=q-^2QOaSY!^I)iwAsH%;lHRjUiD)d>ksoT8jsI}8@j2)osxRxUevLK)WC?`Cg z9&(4dOUMbhD`t~9=B}WR4U8mjwo|FdAWY0C;s9Q1Nhu-V!^1J>9ubMyv=QU|-Raj~ zzB!$SpZ?xY$LVl&vpF7*B;0DrN$NE2wi^U6ZJWHc$ue^p4{yHt^|mM1!P*H}n$i8? z;l-<)VH}#Zv5d7fv#HkO=`=K?Uw-xG*LTNXzB~Nu|JMI?9Hy817cXDFe)am(ahgaF znE)9%QbqGmG;oN-5&<$oCnN-5l?6B3{!%yV!$&+PC=gBcbUY5H0boR!S}kU}?fbsV zZZ=J$c@vR%E~= zb=THPZ7xCvP=i6NpwRvJ5C4d>yuJPA7eD`}yKO3N04ZaN(?)8sm)J^VZ6G!dN>R@=h8;vTw4|9oKnA$Z|+VHr{Trx&;O18{r~x& z{^ISozkK&cKmNnN@>l=*o3~%Sdi_P!3dqd4c|~%Z>5)iC9vwg&UCmtqq3c9ar&%G*P@8n_kA0OsAzNW*RMZ093LVB9K96gzHoJFrU3N%^=ra3j^*X6 z8$@=8Rm3> zzx?}u^q2qekN)s4QJV-`>Lhj%AYnm7HB%q}bvJS+;l#{tO=}rSBjJz%Ld4+Y0>Ey! zVSy!tfGDlcooxFa)k-OAYk@WRU-!97sc(;otk|PeJG>|E1qM9uLQ=H=q9KaJVnFX$U#Jc(uJkA|Tc9f3E$YC`l^Gn=m&)fzO|ML> z=vl9=5xScq;51FKYQ$_0fOi;%Qp)x9b+_3;R1P_sqOb@H5jpjSlDpJ(NkopPduQ)< z>Hb|g+}~ZlPCxnaD?{9E!Rn9z)moW~ne4ZHt7ROG1rEv3#wkef46LSzIc^q@e- zq7%u{S}RF99PW1eDKys*N3IjikpFg)yY>ml@$%1=Za{h}q1>ane>JO?&zF zz?MTDVLe+E*ndzA2LQnT^%f`%TW>tdr^$=wJyEnI2yBnhP|L5*cV{OgS^Dyik)>_}Nr!(C7-kQ3r zt4B83B56{xsUZ$5T7oFHB9o5tLlO))${=fieklHt*ohPv5aJLHVE-^O0|^90LI5K| z;#o5#n%xvdvf1pps&3u!Ondl-wbuK-`LXu??zz=f-9^!~qkK3hoVxeiz4!UP^{({} z&ybTM@Gzt_3K$JpxtjNb`|tjNpB+;J?l@|lX@=b1y!qhXz1Mb|KBer47|0WeTFSY6 zHW6*xdCo%2Im>E!1mIL)7)FD1a=Q5T+h4nP|GpXr?;O*1eRX#BTv8f_K7n=;F?jUV zkRjB^Lvn_TES2|j=b98@94%+c8B@lpY5{p1t?$y!lRKpN$NuQgEPU9VUtC^XiAG;x zKXl90Q8ioT2v(#DnBM;-#sUbXISk~$3XADOFw)mkXi#G!&n~4j^p`4K97o9+R7|tv zlu|M8fTB&+G|dE7BPKPS&E~sZ*EB5=S5+-igk$NtSj2>{wLN5pO1kTP5K+-28WDl0 zp#RMWGE)LfF~h;FYN`m-bcp>p3`Li%+ik(L3O=P=P-lf*=%*{x2CQmCTrec%dms<& zL+yQVS;t+!9^*FY;87M${k3m?%}8(DI&Nw=3x4K{+194ftVZ>h7>sjF7sjM zT+=jlUDtKpG)+kdO59CH`iB{yxufHynOGsho3Nw{6?D?|bHeR_EBq5$E%{o3#bj7rcM({PGX| z)F178s@faI3o{&29CF{SH?wy6xgYrPFa7*~sj@{zLKTU`l(Q5FXV-OARd>7YXmwP~ z%2unRqoeh^@4oxS$M5vrHpWpksOG-g=A6BAaY$9=`#iL#C*vqLPH%qxpZhdpE!lb3 z?5?gHLUlN}o;`hPX4~zy8?JWiE{|-9KJm)yH*eg&Sy!XMqpQnZ7lTsc!aEP&`{uVF ze&Gwh`{eZX%2)P*z>JKL1i_>@02M3JeVl%uiwKd6LMRYZ-PDp|GA+qB9+;w*tvswE zd{JVFnX~SrI;9NoLT-Kn!(8VlU)Rel5uH;mC7+t8<}8T_05zpdg`ALI{Cwg4A|f&% zp!W_;OS@{{1Qk@1^20@kwE#k|t~Q}wOv}%Ew?_&g5(6=09mdqLHwDcSz30v4Wfl13 z-ii1&OF~A=H)UxoKUx*~8EqBt%gWgh1pZ4@6!PszNm9TX#KR_T{LI%FuN? za?Vwam;w;&yIC)OUpNel$Z&T;+W0A`}*SIYBp=P+s$m=#@L%Fs1f@(#HLz~!$=J5JRzFSJ;mG) zdE6YYX7j2}S=?;3Tjz0D9UZ;)J3jR(AAFesUR+#^WB%;#d9Nl40RWp0_ zWQklKpWMB=;HsTpU7U%UXaKi3zHx6H^5?(sgYCR2fq>wfX5qL(a2e{xq4&W#e|d3r z=hc%c)Bs2<{pHiA&z?Me^!SH9|M{H9^XE^Q@!jwIN)OfYXjav?Uw`HGzx(&U^yJZh z^rJue6K{R?E!o4-r%|B-X!e9z3{4S$ZSNlhfI!y)0H#{>=oAt_@#iEXjH4p3uiB92 zeYYN>AQGVg5IVA?3b5^C-OO@|>&wg4Y5|(T@SETK_PqzMF>&Rpe#kC_BnHG8u;Nhc zNX)KD{8%C)Kody@IL2Nxs9M`Fq8O;=)D698GS%agV>9)hMO2H6N)j{e`yp$rYmpR# z^PAm9bJm=4j6~iPLsc&q^I?p{E@l-~v8;(^el8#?R<{kZ14N4nnF%#Z-mb6IvTBNH z2!p!DEso}w=NFX^r>D1ckRj_RQ3pI)kz*D~h{)_y&MFu|Duyu|q8Ih!5COd<(X=D> zOc=+lqZ$biRQzSz+?uy1XtlGsWN=Qz5|ZEx_0nR*qkG_AG~*^ z`D7p>5kMKCsyr52dhyXy0L9?z06KF>CIEERn}y{kKL7h4eByWBd*gE!juI`@t)Mz? zj_xgQyiWeaaHi;sXEcG3?=#bYkaO%1 z6eNR4k$ampGv^qH6wrX1`J$OEL(}-mwX>$3wV|q!9297<4-UyhP}LEmX^sgE$ioo3 z&1Sott!B+)?6UWj8jS-WRyo;zOuZkYa3)J&SKDzA4DHFUfBoSuy7!)MyAe(Jm;cGH zJh*?)J3>prnPW-PUvAExKfQ`Wm^XL8Dnw*f&|J!ng9OY$$DvqHd;q@kCA{>(W`GgR zU??+TfDDiU1yB$X!IxG-N=Xk+t0D?U*Feyvq3QW&|L~6&+*avI#~7#PWX|FoBNfNG zJsl+YDvo1es})T0o`u68+M6Xa0IGKbQg!m`8=t>@|4koO2SVbZ!(k?3cqr(vci0rv zRLYvRl`{3N2HHGOJY8;zhb29WfW8 zvWPHi-)*W;udg=V`Pj$4>j~KmybI?S7Yab^#+ZCnJMUwP+|T{{|Ji@~ zcYoo(`qHeK&1Z|0autG#5fGpgvwlc@kH7E>zjAtd_vqxfnA_vt)8qPd_xtmKKj@Na zyi{=72&G7_5ZyFRFKM%x7ZFWxO@LI_wIkXs&5TRRiUaHRRF_M!2>|~K<_Kf5tL9t z%#u37?&@N-nyoiiIrW;;V!nLx(|m4pC9sKgwqAteDKUkyoT z%cFa*ym5JccD!8pP_^yCh3egh4@I=^`^)v_`T5z6o2N&sKG%EAr;kts`7MhI6|!)}-Vga6?F{QUXGjQc+Q>aYCTYp=fE zHgo2niY9~>fYHd$XQ%(*AAI@s*WbK-@2)^3E)S6RCu%`P?Z2n*I}ZG?04_NHJ|OXCgcUT>z1F&E5>NyM z69dOUgun#FeBJ;wr`T;Tavmj%nVRIBM#pE=K~N_bzwv(liOzluvcS^2RRPaoO1>+?dU;BDYdA%Kc;Md=H`h}4t}z@&CaY9~}DBRI?Zp^9MX&8_f;@T&$DI z_ePA)ArJwWspM#qW9oBEP@F#d0aOry&>XugGLB;$hd2%h2BzLQCQ^g+q~Edt0Du5V zL_t&{u$M*DkeuHWd=7n+>lkJLP?IwG$f*clk#`=ER1<!_mxiIs zIi(y^8isyXg{qJ)RH3RWVkUNV(;Vh0II;PX=$N9268oxd?>~6;-u(xk`OIfO`?*j4 z#P9y+Kk>;oi7-hzdv@0M0}{{Yb3hM3J~WHf(uV+Oq5?*s1cnG?_P!GLH^ng1X}t6j zLJKJ+nfh3GFk$vSsM=H#!=aYppZ>`&l>aZH0VRuOW}+hIDmf>SOpGZ-Gi~ZRrx$a- zuItK{9AjFn?(AaqyZ^%U&tb&R9;o*nMG%>YM1xW4V%H@3T;xjw&mzTI6uc;y}d#!+8+@Ud=K zkFj&kgSr3s|MQ>RxN*Y;3>EgF599&v*Uq{{6fCFl@SQiaF&hS)M7%j^nPv3Rr? zpcVN2;kIAfQDn;e&47saL8XbwCg-Fnbt*_|J4l?D8D7^8qB8I$BJl1140*Is}9*6rK3@7;Li^?SsY(pUv{OvDHXAv8rI)&)PC zx8z7c0Ey5cFd|t&$9@F2!S8trzdtUV^WKFCO+yCfA#kj z=>~Tw{b4W5!ox5)$L*}yY}O@!t12uP%f9PN)1oLs&FAyBZD;LC%>H-%o{k-+t$tZ+-Gj$38|oTHRJi-EdWf_O(|&_SLU`eHglS=2PCia{rD)R?ST4{hl(4 zXk$t#r<_tsF{fNmvZ{iX*%Dbs6*gcqHe~}a%{iwmYU-;nTeR!-)q1lg@3&naLg@P; zC&{8upFaQ8CqKiC9~i)p2@`&I0GoH?JA%uvh4+ z^8ftld7rGl_2A>5`@--1)aQQmtc>8Ndi#wBuYcz5 ztDoLUYj3<3LQ{om zy&ZP3pUsx%7u%ThowuLtcIm5M{nn>G`H8x&b5Lx6LfY$V62LSt4SY7#$G8Sg1<5-*siGqM~t(IVBbCyWL_j z4?d)EJUKoB)62{A_2qftc+D3pB$vdP1CbMj;(6hyR1IY^pj>oTQOr_|!_ar*(5VOl z#-T563{};b74;qluwjh-FiuvzyWOswW*o4X8v;5J4WR~-n1)qdJJQOz%6T%9q}?t$ zS6^+$A@#`Y>#A-S-q%&t)^!_mDusrj5rLtVFMK(M@%vo>`vW{@i7|SO-V-}A4u#~&}^hMF^hF(ENe z(Oaa+$~Piu9J`dq(&ZM(MFcO#L9{>wC0kCZH`B`bp&xosnm5Vp*S`AIs;Sc`nqU|t zIMf_B>vhg>e0=xl`0kBc_tjiV8%aGFGX*5*`>T(?d2hL@``xx_XS=?eFPFQnS3nUE zL(2n5cFd|OniR8P6db$Mjbe&;c7EQpZ5&gKv2I#*IZ_gnB*_rE-FWBrT~PXmU;0wJ zI(q#0xfy@$Yu_11I6vPFL;ipL&A<8D>#rQIP6#;%8ksZnKpx2>Rt#(y2plAf zNXCe&`M`^CSs@FE8p2@8 zScYcTO0WHwp(BPpRT#m{IYuzER9G(8IO_ml1Sm;Vw61EuhxFLc58j8;lyXb}I&|A{ z=!k&Xc^?p&T}W9i1zc9t{9*lXo;JZv%4q6{pm_~&HWoATsd7Vj!ZmQt{ zI3`G00SUy>}*cmBTB(cR5XCL_to4ea_=ez9VaSQPiB-Dv7z5}|=vQ3+CL>N>}yYV%e5 zfB3)r@9*5c^Lu{cCytjZO=-8;5K8cra}=@F(edp&4_Db+jYC4xCL#uyQfc{{k^~UxBmKH|EquGk9?7dg7c>8iho&| zE={@fp|;F9)1kRIfoerXG#glsDGps4`{2nWr#LdRXciF@B}B&zYL0nKqnOSY3vwY; zH91e@%9Q;BwYU)X+2MiGFv+PZe&El8F;UahF^*?v&vQ;G#ipsNrYcQi$vLMujzj6I znL*d}p{j`;AoW9R+LoOk$3ayJ&5($S&{x-W#euzmfeT*}4rWULP=vu!N?q3#^%!QC zMW+esM3xj$0~m)W*;2}CP~cBRWk%EhNdZ&Vlq6*t;vklqmP`QRurp;;#ZocFm97L9Az8y6nrK1}(~{kcEW z?Rr&Uazj5l_NAp(e7pB8Y=A=ks_VMzM&NnU`jyu|{prvB$b;8E?W&`r(^rNOs;VuH z9`Ez@dQn}e7J!(DAYLoN4vo+`QW#W(%?gk*Y=(-dKAqrie8sFqx{G9}V2)%RFZr7zG|L`CF!jSTJ-hH^+ z^;cKhDm35z*0+E07r%6Mb>$pN9#cv`{fECebe(g&H%9{%eaR{3dk3&-u`i4<_L@gc zqr_2iG!r$+Ih$$~DkhSgnK(;!!7o=!B(CZ@Wd%TDXQm$_?W8%y@`hz2-pgM)MErmn zo(UzVVd$A@HfuMVb)i6K$%qigL2_2j1wtCf@$zylqD|8hyRIMSi^XzvWPqv~f-gtK zIF4P{4a4A^W2Q1^E>Rj|EZWYK09ZMxoZI7>x4VwnO`3jX8ww$Sfp=a+kvL~XBm+QV z0>~+*oYZWL+4)eEW3wi59I9%J@#6BTZW=Rq=bd*Sy!y)ZB>4jaxGeJN`2D~XdfH-2 zFRJ{>bc{{YTzKI{x_AC6YQ<(!1c_bF%3S)%!(M>z5NzylT1>^OPE`%-O;0HqI%md$ zu3dzv4NxkA4(ghd^W;(%JKMPO+|Vv%a{x+}=2S#c}Pp>2~8d#xZtPaNaEYNM!w1R;P;) z*a7V}-Rk&cx7#&MQ<@)zsJQEgz(fwm*kw}#zquO8&7ME+o?e{2_wb>lbpO_!ySHz9 zZs+aXvbf+)F=YwfA0OS=th-w9*0!EOWGh_;TDOOEsdb+Cb4{3w_a+GXlMLD?Y^A>@Z8=_}yC26aF-zZX*D{P%#VPGn`<#d6 za?#dv=e@705Gv<T~{^XYJFK%byYQlzVAl_p3N5TzW2Br^YdqCmzP(&-7aU@Zr9$q z=T9&H*#F>XzWBv29v>a$m|#C=1{VScS7a=voQjCljNOY9_}Z>dIg4g7i7L@@L=#iZ zl42ShGZ>U(i;1?It)b4BGgTEeGjpMiDXCewre*!UlvpK~6uRi|9K39bdj{Fw5_wPP zEkeqrDQu?WIQ0EaRc7;fjHxKo72v9=#Jy&PGboTVKgOhHv-v_*HtTf}$}h91q7Y!F zDa9gx{l3$zCzmKvqRWLyICvoJG#gFIGp#-}=sXmdjPwcf0LYMCS83yaa$jIsiHLE-cQK9i*IU z<$v9^tAthAgQg_(I>Tvt=p}54srUkv=qT;Db*&fx+3?*}Rs%Q_(AFzEAV{W$o4_uu;uf92P|#lGtLzT5WizVq&9KJ&Td zYPH?1V;cH?bR0~{6q)_;@#)FUd;j;p_WuZ>y1cw9YW2g==Oq97|L{-z+|T`7-*s)% zXcj2!0Yotw<5;%dk{0fjK(XlRzZAd#07fdM@u`}k#G$nOL}E;R+qQ8WXKh<@w}3z^Y>L8>oX&=F9_&57 z4hndPIGZo3x@p_CFl;BO4NnXT<2af^sA@IryWaZ%m;to-JFyRdltq)|3}BACet7ic z$*voa*#I}&UEg)xcB`s)?%XLk=^=oLt|75X414b zv0_i5D*NaK12Ct$x4I>IpJ&Wozi&#%v6!s)gGaQ?=A8Gwae!V^Oo)DxK`WoKY>=gh zpZ1t*DFjTPyOc3g*P#?V^Z9%}pFMf>_|DB+&!0UXh9S%vO}Ln?5N)+OdHdVzy6K5> zRfPu+?i0Dv@{DP#CXSGhQqCbTvFmoZAdN$)28rA4mdFKPd+#Nis!9e%0s}KmF~w-J z_Vm4X&;Q6D`D2g&kN>CjZ@l&So z{P}s?&Mq%6>bmxx|F=K)zxh}H=+83o{k!+gj0{W!vgVu%gmw={J@^T~?^JwW>P76m z4_MVwH*x17xlC+eg<(?H^|aMG=MXiHg93-TL25(=iOota!`EMSN{@?pO;L@RoT*jw z3+?*7_|6{4QM_WD^F$ybG3F3l*T=f9b52!N#W-M*qVRq`Z&Yp94Jsm_&iSgUVvHfo z=wPcmY1XHdm>2*{YQ5X-inYLG=2ld-UbLW_W*7$Nt5TBKHLWj0+RwVOBpFjS4nb1R zkX-;)be?01>+KK|j!6cCOdMk>Ua9NN`q|U7U;M={Z7$cA(yd#!{_r zsPvZkHTwTxGww>OiGz=wc%EdDpRAmp|Km$}j20#-*gT2^$&IVe| z-EOlpgIO~Ng`5=B28*u3xZ9D~m;ce8fZ_X6paS3dsM=RSXWD0YC|onP-z&)?7t-)|!Nn0&GgwNg-)*j*U7f!- z?#{dJJoST7OffcfRd5`e^;O?>VnZ{pL@|VU2=kPYsj2E&(=3Ei8R$;11ONmZP4YO7 zh*(us*L7L)@zJpo86*TS6;J`N;Mhzq&(9Ge9^9dxKYw1@C5Y%BEQbojrM0C?HMK9vvP1!Y}-zgCz<90K*eo$8K{=_En-nYRa<+7?uc$cBV za=FSm<(v(1$O6RmycQ8v3VzT3C_B(znE}bM-z%-+UX2A%Ma$?vtB5B?HBv*sD5IoU zR~%!`IWY$yH^!9B&}%cV7PXySeiN4AowvJr>%Q|?-#D2=wd!QB+==8xJ5Mn>z*KKZ zR7ZJ?0nN0u&I>fiP6x+G_Mv- zw-qzfBqHLFkC#Wg-3|#&l6P(#`nGMEy%=PJ?QUl|Ii{4NWSKQ{2et^oayEvl@-apc zO)2J_o!eKEW|mT#tOb}^jf>GOGtTET$w1^%Qi)?bpF8IZ7NWGHQ%cVHamZ!0BXOaf z#i84DeaO_uZ4~CPSnuMqtC1W$e|A;Mn%lQ;GlgIJ(l0~K)qEbeTT6Pp3g7wG+a_wN z?tm>dEU+f?p3STz%YY+bnzqMlaCjkVFspZP^dXH;1Ew%#7I`+JGL6m;)SUMU%YHbk@H=6$DTbFe5w)#HI4W0eWLO5=7)Z`w zWJFBlOkcE^%fBjVXX%T6mrg1il4r>|If9bw7UX?t?UaOeHk*~6Tv0XMqZ)}g_@-&Q zZpcYXuP)|<46IaMWKV|(VG{Q$Q&aDKLF_ZLL6Ps#qUWlD^ZC+ykE*3{RT9QB{_OkS zln`C9lA7v*oULizHaY~~mR4Eausj7VN^Tij>H;yA@Rgt1n{eh)Z>3fx1F*SqTY}UMQkYgq} zt6Iu3OdY1_g$gcjA`+UJ&vUhE^F-CID zkj9Ivvu1Jkt6%-~Telt{;?Mld&$Mmp*cn(;HzJ9UR7&Ue1*abo=p)e3rtzC&R8&KB zA-GVJtI5^QH|z#dE!@wp>n1;LA}6AzAYciynIc)v!yu+)-UsjY4CLv#WRZyp0EdZS z0q7V-IPk-^^@}j)R^~T=y zUe6R&-}~XF7~>eR9GDF7K^>5?Q%oa(NspHQr+@l?R3MFjmeQCdi)7VI1Tl`~{U<~Y zA|j9~R8@^wP-cix9WS3u;0Iz&+df-<=&fG6i1 zIR{80Qh2Lid&Y^X*xu#P${HvGd1WTcqvdA1bw0GS`52R^&gKhn zlx08cm>3A96rVtav?cf_o#WpqNj6{V@TUAw2g!A6dXNzJKT4Xv(Y>Nny zu!G&E|I(NK$uQvhDtW(PtS>hg95kiW_x-bH&j8@!;zCpz@nf&Q`ZxZ@-zX{iby@uD zht`YlO$+H?4G7&e-Y*yN1Qn4i!FvK^X1PuoIqYK2xv9HUwyMcjkpKLj|2F`jxGk5A zcb_)c_ujpG_x9oyfUJajcbfz0SIkV2iVrrVm`sd}im(t~W83rL5*-1R zIf!5!(ss8kw($(Pa#&_LYPq<&h-5RATrB@05ycc^8og&R!vicCaiX&pq+lwae|qT7 zIrd%+Otrjlii6~ob1FzwI1Elo1Et8dBjRSWnU-?t9_xR{XCl`3gYyBIH=E5~ z>H97S8i_mQ80!+QVskvQZpa1Ni`yV3#I|5KZV@F8fJy%sI zOQ$5p(+*l!ZC%ZnU6D#EBWn>&IeloZ4+k9BwE)gB%a90>k;wqX3OGEQB||V&k(8op zHppfw5_9a?k*E;4rkx8i`ARiP?h$|pOcH{qj&bZHcc6(h+cQgjR=g6S6f(qk@yRI+iYR-uW*$1RjnEQjE1OgzTnx@IFw&YXZdvflO6Bwwf zBrpXq?_9yU7WT|A40T->I8>>7nYmzr$`5S&ovVCtYe*t$STzkI?RLAIOC#omoo)Hu z%UG*0>B`|lL}pT`5lqfG?_4OjCg*+8d?^*6wOox)a+n?0EcG8_1CAvRfvRTc;ykwi zk@vwAW6VYGzkEbhxDNgMC>LXKV$o!yD;42hoDo$ZY7!kqVwtl8s>l#?7ZL%6P*>Yw z7koR$F?L&yI7zRUdjwOl0-l4aMFgxeod+)vVdR>mmvS8b>~5svF8nl@$J!p=kSqs&<{Hgz-f zL&-vm2+lBci)NN`G2L-YFU$eTJC+8|`^VAy+bGwYD0Xlpn7Y0t$16RsGMiM@0&LDX zS0Nygp#UN~H(OLhPQ{LokNcsU)EFlKLpe4Io;k)?IxozeQdScpa*hxgi~)$*BeNbL zL)YuL>zQq7$ClJIgvv9xq%N4N^k4dy{)IO`_3^*{|NNWVk%WRA67thqw?6f$PyO^y z|MYsjd2s*1<<(_59?ibbvR5%xB`%pW!V4dc1D}|gkc=4FOf|5}L{lSax>8DIE?ait z`Fvhz{m#@WkRqA7F(&UBktCBafqCzI@K{&#oO3C3<7hE%%&e-bs;Zc{4CQhjKk$A5 zfI%wxGal}s71UR#4Isvt0HJWt0Y+k!EShZZv6zt5OuBBvxDfF~zT3ssQPcMu0Fu;8 zyks!7p>|Hj-iN|zle($86zi%QcH0=^?rOVW)~@fPvJ1}n)zRtI`qH_ooww(^i+MOw z1V)ceZ7*Mveb9c!0=CFDK)C}l)cF#yP@E|ZuTtM>)oT(sb; zBB4fTJ~+l^>}0p=JB;ka00W0SjAE!lij^XxNg8`H%Q+fh<@joS*|bZg$`njN&4>VO zvPZ%R$~UQ~F=hpnlr*Otd(h+vK})beG3zMC>$BPH^73*R1|{U+!7*1s#v$iKj_2)a z-LF$jZBsig;(Bfz2XlbbmgBJyV#_CKnntWr0AQcA_uf-LazI*}k`I*%5;+8C24*B? zb=8vd%xs8BvZ$#kf&+}iq^fa@j1XhYCeE|r0#KLpO4r+J#>Xc|_wJm2`@Qv}XMNc$ zR;%UbKmUV&_z(XSBVt``wwsbuT(>(Zy|fQFsF;X8z|S240CcYo&P6#15WsS-s%mm< zn122`>Z@cT%siXT9GF*uq)6nMoC-MSB;%lRT^87}-=j~hS1X7sHsdVi!Hplb6&Xf= z7lQZBIU+X05iKGRQF3nIp+NuuXJV#Aq?U)>kaF)m4`Ww{8z)EitI8M6aZszg+iusW zYt&8fP9>p6hdK5s$04xg*!R0FwrytKrW6(G1UZT$^hj|WyX|&)a=Pori>r%UckXYu zUAOIK?TnaIB&Qr>guxY&Of+Udbk2ZOb&S2M*+6&0S=8OI-SmT`WbB%+e&t)QM0n?& zch1kx|K8vGdojk-l5WY1YJfa0wSq6&(NGkjt4?=1=SOdKd=uuIy9Jxzcm?&LQIE zcH_AQ5dy#Ws8#jO<*f60Q;7H%7Z>aG`snEB=FOWx4LJ<;%n;heF|+!>W|}1hT!m1X z7N2fM=v55SAvr`cBmp!B#Vp$(sySk21gb?}qe*3pNh5C{l|#`<+ht}Ho5nRKCF zyutwlDoIoofuB5idhg!78>hGHuyCGLbIxRN=vbEY3~MkQbF3>@KKy30k<_(q8)NLc z?)?1x_U+p_=cZ}Lu~*fqu49bvyz_QDUmc&EoS!{+-Y@2D>@UJ)h52#d}gw5CCH5 zT;LFkPYyuLxz8{r>4)T8QxQ2&&z@hLJ%74dEgn63_)EX^rLTYe>rK-f9WDF5^Ui+P z@A`>HkKT3cLUnyN-M3XexV=Vy`Ex1RED@K(@PlT9gqqEJU)N0+E9MGwCI-i04-G)m zY}0VnIk(&G%CqCmI)gV>b>4tMJYWW7gBNyZaF8xk)f5$&obx$}a}|P5V_!6!7K>&w zL!3shNX$gzIHnj8k%@9jW>!_Tsj)*5387#HOBZTC<2^e&`})_vetdlV?AbH#J^P_; zj}T__+1!9Nse%VE$2B@c_T(5cn4zLWPmX*D9+8b$%mkRdcfL~1k_YcSG53A1B4y6p zHmmvUs8j*>U%L$={cgA2ZnvW-HMefvDrXNOmYHyw-@tF%H4UOB6vy|zUJBsr)F(Sw z#S~C`X)P3p)t)YMXzRmu)5Pz(RMkMP+a;C_qC8GfA*3R;Q+{4V0L09Ov0tw@ZCfvw z$G30ak<4XuoN_7z(Q=hNTSSI_S9{*=Iz}tzT}IS(U14SxoG<`5!tyZY-fyFIX6z1nS?wmm&s^}{gqeNHKG0A*j*-ueAh96(jub~f%ZX?D(CZinqQR`on4 zI61xflsOqH225pzZa17%YqWZ;q}6$)NyYHT-a@-y!>d+#~Kv8N(u;}m({u$)*& z<2Z)8%sCumBYWp$U~;q7tnbI7jz&Z;h7n-9^~MaGb9;?vBz6uEm4FD$G{#gK&S1c< zxS7h6Cr_HDDYihvFgQ^}0uV>+T@(D=a}7YF^@&CUbi^2(WJMt7eBCsa_W-QK3eNe4 zeIOUmAdjPS&cG^{0idd?cGgy59y2JooU?Y2k~+6IIz2veZr2Y}+E|wTM~SH4;x!$j zA90&-6LV-nL0?-~`>4K-tjdy{+oMtoy6yVAe)k&?k?0E+Scy6j$&vtz+F;R+Km3g8 z*moi_j)RD7x7}*BBn&Q81u9%RkorP^-n{qQ?G`~Z+G;sVtZ`wnW>t6bCOzojW%#FV7KhxmxsnA7er^H2eF1|8FB;H*|GX15N`rRg;2O zBifr+001gUD#{WCi&o^J3n3Kt$~HvBrG<#StAk%eFqOpQ%oI@(z zEFw+Qc<DZ|MR zYg}EwuFJ_!#Z}=n7S#_sSebb5yMC*&M_?j2IXN+d+qdr!d9<>m3NWbjHl?ha?JgC@ zIY=sll%dYbjZ=B?uqKbDe zrHCpL#}rla4v2k4pb5yOl#D3UO_JR^?>>HZ{u}Q-et!S{$5N*4MJIVTYy1~}#}9t_ zOaFMg*^24vXi-cTfR|$dz$iF`G8n zqmWd@IiAl~{ctf_uaYGjl8K6929P_U;rDAgLlDF^7x^4aQ-tLgT|;B4fAP?cKVGRKy`!mN8|A)K+zQH9`{; zW(TMMkh2nkDaDvBug;!4c~Yvo37m&+2mMPNxp`rQt|5S?@G z{QTUAcik?DG*#%fYa*(vnW%tdR0)o#a+_V!&1R15L*4hoX1jZSaglfxd3E>x>+e4L zatQNpz4LHBJHEKu9Ie9h=TC0lJh^rIc)Q(pTOInL-}Qgz@BHV8CGf25=+j;KV7b{6 z;@^G$i;EJdzJ2| zAtV4{wLT4FYX=$T`Tecu;cVO3Q*XHYv@ECHbFx>?^f5&yY}gm_o^xoQN8fK zqNoPIA=D{rWhaZ}YHOBNM1>qX9|Q=EfdWCogN!jD7D{c=mH2NaGCyj39SY!5k4%C3 z-2zqR`ppM0ARJg-{}dk%4j$wp*>JCMSI!4B%b6?>{ci1Dedo^I#bQzLo(NX>CDZE^ zpr!X-2V~~+^Yhb_qbE$OCMTA+H5xuA3pr%qhCL{ z_vy>4O*3B&X&2OGgP8UF{Cs=$1ORT|z7^vbeSYxDoxkuG{=yG`;YWtPD>c})=!I(v zk00qWQ_;+&tOUg3fs$qHlc{U!S&Xq*W0NtV1l|k$PjkhBB{Vh1oZ<)u-EQ=*5CFY7 zG`}BU6b}7?4PK=G9HJtzW>irCOfiY=h5m~oS^*EWp+>coQd8B0q*>A!tE%$B0T%m( z;zUJb%G+(X-mJ^myl{G}s@iV1%sljwjfTDt6+e0QHc~VghB&siG)rC*9KOe5)wgK?P==sI*f!WXlfT@~6X=7Z$2!I9&P@E4jsdp|5G6ly*vm2p)61vo_yOa5{@nIaZ8IOIcXG`6UzT!Kl zC*Szm*A}z+IP_z;xjOGojux-J`kJvHcbg#AFNtiqy8V6KDK< z93^eZ&{C{fY#anZ5r#M(t&Vovorwqt8!Q*KNfb1dfhl#nv(uB)VYqCc^TD&Bk4~~gR5u{>=8QDQfQq5*y)HHMFt0cJM&~Z&% zdu{=O8Z(i%$kHX;A7Z+XPXvRE1dy&7h8&PmDDPYU*Z$|_!w?HN4Sp-l>8XG0E$5u$ zAc&Y_EOb9Y^r#tLDn<7&^^d+QTZGQISc_n6=L21 z?NZK&uBxi_dKX-CadE|lpZ({^6=IS@T_KmS9##ZRT`lGd&FSfrCrRM;ox7K3Pj{Qm z$KH6YABQnz<#4&XT&|AKE;p7KDb=BBs$ihI?n+|5v8q1t+AUwN)>rWEyH|?Y*Nw4` zx}nOWkgw|$hnuG-|C9gOzy7cNi9hZgQwU%J0FH2P4pcV6Y(@M;)jX1^sRH=H|A^9##}^X#w;<7 zO>mCp#Vs`EFULVx)6!e9as ziBMGm3=FgEX@*mQo^uvaF=^Yy)zwz=?%A_v1pdci`OKY65?nS;6!IKnNix zLnLNk=47-wy7BzsI}JG^*>*c2mvjE*U-{)*r;Bd8QyGtsj=jTge(h^_@7_IL%*Vd# zhW@?BPtGr|Vpbskt+(F>m8NN)K6{Sr?!WfNY_apSA zCL&OU8%MSC&F&aht^d`peCzyiceT9))b+SsogUAd*^mC%@Ax8mKmO0BB#O+& za1Ao~qB&vcoCj4jBXcRGoXt5juq+7x9HNSp$F|qXx@HhR8P#CHOA&<-Qg){7TqU{p zzV2h!_kGzWrmi777TXhOCT#7+#YI$_t@PsJ43XDYn_IW;K7anSu4e#Fv=~P_L>yyI zc{GqBPg|bvL;#L45@Mn6mbaK-!y!~eK;#Tck5>?F7`v1s02CFga&8yw(Z1KpWM)lW zgYM1Kh&iP+o6mPco>g_sKvEL$$u*;@khKSzP&dJu2oG2K~AHoUH}WCo@nB3V<+xpea;0tYjTg%mkOxH!KGp?>QVpS*wn6$EsS zJ?{C?6H4Sj$DtTg2$f1M`KEKOY3Dk`lha$<^LLTMcfRwD`SH>5ty^3HO3_2DhwWB! zT&-3BqLRt`xb1fR@Zi&1WC~#3z6F$A04OgO7_@my8_G zI5^vLdL?H`hdmof4b{*T#K1C?(1-0|^o;n@~gCGmc)iw9BRs;bPai1I0ciK$AAaU44$(}SB)LGVvv8i1U0 z4!%Nwx~|jE9mwY~)a{t1s+%l89FRS-N1BTEmn@4AK2XOV?Eg2yy6kSM>bYj{DGz2A zDt}PA%c3dA{T_E6h2hG0@O#gWuQUE%`sM9?8{BjPQ_d;Ilygd=u<$!22+TRBj0=Qpx4xmecQGU0s*Lu z68!pdV_<#P&1du3e06rYd+_S(bvwUY?-t9|tvh#yT{rZ@$<6zQ%sy;({oPmJeDBd? z7uxT<{hhk;vsv3#^=5O)t|S;S#?Jfd?Qg#gMuFU-St0W6SMS|__4Sh*caJM#ji$M6 z=Yl~cTNW(t23bI-Su09Pg^?mf`H85UIdYJ6DnD5O6%ADYT27c0Ga@+e*&s;{p+b$C z!d155+tkMp<~fgLr>pB4)ONdF?Sp0!%ijBO9E*VKbPlTsYTj(ul0h{6%CG)%@Rj%O ztxtc#dq=!q362>kxX^B|wq*&KSz#=cggIGelrkJH$y8x_cwY-<6;!dDWwW_bi(S7) zvclc9y^(^HbwWg-8e`)H5*%p+a`9ZbX$-`9&5m9LkU`lem6Pl`ib)fq8sGD+{g{dQfsSru;FxN#14=l0F@ zdh_11XRo~e2C}c3nY#M!z56~?v)PeG&1#}%>^`|V1`a>?1?smQV?_+lo;`j0;p3S4 zx(-$4hix!^bAI23u5 z5P0mn!g?M0p>110Oyg+88H$9(Uh1uY3i_^dOy2u6W<(U#91|i+mifG8sLq~_Rn;hH zn4L)M1^de<=iYl%kd&yd$-q}`Ot#ssiDoOyY36fJ6k~K~^ToXHdt^5xG31g%kqaCea+N0C>xUfNkJY5ied(}1)fA_4 z20v2Zy@+AN?~dUQi<*yqP4Ta&W~E&PV%b;$fE_Pq3!r_(6`kgyxZrlXUCCI!x0>lk z`5mVdxY#V^oK?Y67TC{f-q`5&z)+gLmHf_NPDd1Gg?OeW>c$^6huu zTdt1kc4o-)W}z8WO_8g*C13fv0i@$2yMO1^UAH+qdvXd+<)Z zv5anP2Y4&{iP?Q=QM} zj~+feSsiK0MOoes_Op1H3o=LiXvHY6t<5`eA6BWsXBR ze~xe8Vi#DYA7kCNDO7vEoxT9n_+81K8I8vkjhsvq*AYS$Xz z^x{Lm*dr!7Bo|Ya>+{v$$~#X%6=NKR{b4I0VyOghc_cB$x~@-8Z`9Sy6q=@X&Wl8q zjP#*t{GqEoc~wj|(Tz!KbUxIVV;oW<%waJzFz?)Ev)QiKH*VZ$>+tB|yYu<{m;UiD zz52$RhCGbpa&;85gt~RUszVDxF-ujq;QW}xxoU{fljC3%{j0CP@d~{9{Q2X@PaePb z-n&;X=29g2 z5D1Z&MRwcGvvxL1(JQ-2RlfuV062s=?4_Z${ZI4mB;=JVK(^ZDF+pVgv{05G4=x7+R1c`DhjfDskhgScESLa09dsn6cNeRs87kaMPc zhZiEBWEh4)voY-1k&{6Y01)YVy* zTMnPYI=?o}f$LSOxrx10c*r8s_r06X=M$`Ks)qqyLO#Cqai#Q@4PUAU3;>Ku1q%up z*ot8+fP(A=(5AlBY&L6xXM(0_eP9qpbpV8Bm19ihMU;&SJEtUyo`V`#MgmebE%pRp z2$nKBf8@gP!*6`^=AHShxu}-6$G8ijoh`7716Ser_U*Ud`S$$ADOQVajI(+%tNoIz zs-A^VnO9U-1Es8+tM1;tS7R2>A=^e(IdF!2d3iacygWX+b?465Z=XE5+U;%!%8YQl zJZjv$t!80f3zC?GDpUbH$KBOK@2V7gbAm{UXa*5T0fxb6O`1AW$K=_$-Fno#8@qlO zXm)fT@;2s7NIB)@Sd${q~*P zx0xveA{m&PCAElPm8%CCOl`6nD{a!0QbcqJzOAE3DE7jDs;J;aw=t1QEt#&awm>S9 zVvK=W??cK0NL*Ed9yx$sr8q9;vu?M&xLhyhb3vXh7SSl@TsLz-0zl6pC##4c%tWxR z=1QJ`6_gPXED?V&W!L;(RmsCXKd>Inq5<)Et-_DFWIkmLj^@_Zvf{&7{BeK zs9EEBy`FUOOUhnV)pEJ)`@U?hP31iUfq@~HYTSTK&|+acOm{8EMCMG$%n(SS(A&)r zP{+2S4Bmxh-Q0Zb!6!~nG5B%Zt+O}-bD>S9RJAGh4?h0p<0qF`&6e|%IO@^r7MOD! z%rK7$xSSF`c(}Y+6Z+X~zP-4pTOcmP?&G>{%O2!i2*GvR%Cl>$+Ou;+4v9mZtn?%p zF*A-P8FWNhI|pV2hR8k}5mMF>EqYD}gvOTL`eJ8>n$YtC{VgYzZW@c=*o1RfC zqHev*Iq%}0PXdEc-8knck0O$C;=toL?soZ;pZtL@fBBa_`I#T;x^7fb-=vHuC-bOj zd35AMb#n8@!-o%#Lr~Sat+TQTt`;Xb+N_fs=Ms=|P*pMl*bPGmIs!k(8UNF>->e;M6ro%lUe} zzIp4mh@h{MSwd$iIcCRR)j%OsH5wr}Q#1}3nheN>`*w6m}Gk0!-Wc)xZ(PA4rPjl%$ty!YKMdRJU&T(|3|q{)5Y+t@WRvB@;J zWI=~o^u?LH?@Nh{X_!)-VrW<@;fY;b0(iMxE*1+kphNut*VB)~ta#E@+uuAyRg=A} zE$Chx4v4^oU}`@2cDC4r`f7b)cBMwl^>Vdnn#KoW_Up}6jN{FlcXzvfxeP}~M`p%^ z>_`Pri$)=b;Gvd`iMoQP!+HQxA!@z>L}8UkyLaTdoT!96XRAi#x%~_S>Nv#i-qb4 zn5w!O#~9;~Gacsbib#kypSNH8+ShO2zTNlz$;ruXw`<#3)3oz>c=XQr>T9nvvs_*+ zmq%kvho1rJ<)<#NwyjPQk47FzDbeT_~d^dZmb|A=+M&1c<>9 z3@OwNho;+{4gJ`*Ro%FhQrGp%EU~4ufOrh*=*i*{bJGPq~q8VF%yD$ zLd-FG7p^Xz-MD#+IIE0ts6ybb+qc9Wv7N73;?|M zckbN}bt48qE@dGSa?HepfCoYk5f%1z;Q&s^jqCYgQKH-X&JyLUDT#Nk_&IL-XDS$+ zqX1&&T!=ApsO11(DY%ZZw7mBR12hf3Mc{%kLn^q`Y(>}PpW%z9^U=V(4>^fQY?_uS zsA{o^DmPqJ-TU-xr|>J|_~|GvtrWB3L{FueRD^uRG@CVbmAf=)-@Wn18%41H$&)9G z#iE$UO@CVk1%=jYX6&3DHU$IKL$i8P6d)oI5HLkh03*z*MuqmJ1Zo5VAb@qVxHv~& zEkae`;3kq|Ohj~fv0E;euf6(ajDk3n=1uu4L}wY8JQHV068j(f(JwrD^a%2Bv{XF&1ZVOH-c<-C`91{=q8 za&iKD-`edSGa%z9-ui4A^K^Y$EEdB!GLZt$7As;Rq|L5h9iMJ@+ec5Iz4oz>k1-N> zMI#jgF;&S@niK^GQrLfcWl5rxauISUHf#H)W|kNw3(nid)FZNEPvmk^P-N#q6|#&~ zRf!hjt1I=_Y&M(5iaBQ$Gb0mZ?~*8h5*a(llBz&VtVF6x2L|W~Zm8X~EW=GDE3IbwPhjAP> z+wHtL0)=7dMAGHe`R4L0<;a+VBhMaGnu=954qHSJQRCzTdn9Hw6HzI`6RO#ebIvjD z@q;->k-gAYDG?P7i{#keSd4&~2oadbGkG(Rm>hb?4gqD9Y^4>HnSv@f7gP~|Rf}cZ zp4-ois?hg4+B-iOlRsL`C7XzB)?F3$!g1&rQ5UOf7={P0ef;_J=MNt}`-6Y*4}R?% z-?(|_B;|Z{byd$7H*eh7Y&K(z!0f=h_bHBWFmM0>AAHvhg`+Z#V?k3PqR3v!wB&A+ zz_l4wzR82Bzwhb@Aewaa0*)~o<9j`5HsmU$ACmD=}x$*xOUH)|J;>zI;5LQ>Vt zu3|PoYunZbFX%+6ICFjkcZ7e+==~n^;SY=U0}^SU2IIlOcW)~TXo`rarlw>@2+n&d zsf`|Nv`b3my?-f%_TCrS&KH$!QLG!s>1PB?&;(4;R7C|8K?xZ4!8x1FzOPs=0H_Lr z6{*qdV>BkhgOvOsLlXc{Go^jqYlK!)mz}M`Es+p=~T@NjaGrf~XAW zj2Mf-Naeklf@w<8*cn*LW0ph=Xr?A=61*RV(S<66DvClOS1auS^o9Va0;WpDM4rq$ zbZE$AIcJT?=&It$5LiS&EoTMfs;Zm^)tvH>B^QIf{l2MCyq@;9L?M(L-nI(^%{e25 z7~^L@_d~C|`mt|(^X-`6#$vVEY-jW3jhlC#K7G>6mbdRN4J76097|4~S<+Ah<#Woa zTGF`!EhtI=F{Lao?2gNfs(g$XGrQLNn#mEm*=*j8gJYj?6cHc*D3b04yv0O&&-*ey zDH`i1M-8EqJm#!GWr1YF>|M$6NWSk9{BPs3L+Md&$XDu7AqyB-5&k0t zn%rj#tgX;;Uy3w3I5?JwDy8pUNa5N+T{aL=1%MdicDFOt+Pfn7Fq_Rj%0P@5!7NJz z1VD`kwrYjJm5$M&|FQq|imL&Dmd+xOnu-~Mu;ZL0iLnocxLBRacfJv0a<1vRE@y3< zWm7M_uO(yCwlQZyL;^L5x=-whu~?uy{a4UL%CPEh~21-M5ZbRNiB}! zpu~&>s%ESPW|>7Xyp%OsBn4w}MMpxhn z=*lMTL*u%!7sH&iX_i{lzxM8|L(amy7v(S4IM_HQ?|oH;rrCQL>|5_@8R6sdGEnYm~&6b$U7`Bw5Z=bRx-ssMP< zU_wAOL!gtB8-$^$+oPkC`214YWlTuK-m|NsC_9&OZh~XpPncD8KA(48SJ!pUYDUZ+ zkqXLLL;&e9V9$T%Vbgm z=!V_?pCcM-3El0`neGXOsup8}taonTI$kUsd1eIMH=>HC5x`3w_6al+h%{Tu$vZD% zIqelHw-y_&4Nwd$7dL9tYnYnSzBbjOa_`Y)05DO=poNjeTrU##ohA@DS{(VRT^^l; z(5Mt+Yuk6x463TWTAzE*^A!!d2qIaMjxdZPJAUWg_uhQ-&7@shw`m*zljLNQG$l(N zQ$}*C#>nVANEsgq7^FNFI7BIHMWAWgn6z#eF@XqpMg}6FoHMwfV9ey$rIb|#$v~Ow zHbZIkSzDJUx!himLsJ74 zG$B<;;0$W?fNYB6m{j%d-TTj0#K$xvm051AuE>L1K5g3m&3H5i#=F z$XCZnFGE0fu5Fvm`f}bjso%yCy<6-dy1K9ZWXK7{*GJX-hHGy?eY9+jmaAKmo@_l+ za5+gziNIS*%+S`Y8CGGhhwL3ae)M#)SUi3Dd~tNsnA0$X+RHe)CJ?vGD_@;@Ker^# zQvks|Zy$b*f$zZ!`tGQH-_H|Uk$e!{d$OjKvP9=-`UIuN zEF!LyF2%>Ktd&9v6A*Z@(d@NFV~hoYRb1OdJl;OI7k2%4 zw1jMX5}RHdVmo$b`w^vqF(aa5CbObhrEObx!){F7YBA%`nB*~!2m)rrm~%p8W*&!p z@F?M77?$&<+YN-i3QWi;C1y8{$yd#GyFEO`Jp;_KLv{t8-nK0f9yAXu#uNg^n5K?S zUDw{TS{{aB=m$V(nuhmD3U4<(fqFt;Au|~yRUuaIy<|%%iSFmjrT>A12j`xbR#@qK z+rgM~O3e_l2)l$3#&H~mp>10;o-gV=4wo0t$8M*h%q|WC5hIyehT_3hqxZAwgjym3gn3^?g6(*4MYI z0$?t3fnZdK=Bw4}`1rUGP;$mei80gSk(U`NE0jL@?X)&QC0-$1R zGW9K|aJ?SDQ%I}q)$IU)h)d(7>$;Te>9fn#@@BpPF4RCQW||`vb^84afn+&|Y^wK+ z=nh`hq3gP)X}m))a)eix7kTIzjldkES@9XN^NVxlK;(!397?tnWw+~&j!v1p_q7T% zb<+CXNtf>h_#y+NzAOnc1i4?&XY??YnDTdUnTv|lMbn`k8$PUgO<@_xFyW8#HFw&b^ zQ$*DF)^&Z3xe6_c=EPk$5SE$t3%${tW9gGif?*d8xoRo{k5*}Fs%lXhSIlgRBI((;*v~%7g3M-t|jFQjS@YW=V0hoTfq9(ebUztvq{v zb^CT2vo7njfL%2k1K97(0EU5;ZM zItDaG1sI0m@#Dv{*|M(MuG`LM^B7}FvY4-OQl1AwCng2dA!5!2=Yoi+!e+Crs!GOQ z43CdbO0g!A!HVb(ivS|lb+ZR2sq}qski8FW+p21e`H-Y=2wsgPTi5rX2~>+ai<+hc zgpS!UbF>^|RD~!b5Qb1OduC2a5P^{KaLAON=Y;Yzv!-bZzqjy>j*gCYyPYZ!`M$rp zadLV-#;S6TO;c8|l=jrCs;V4t%DEr<mEhZUwsfL^0#_T+h6HuUEeHAffCpZ%P3p&4V6lpRy3ssr$gR0ObSrka5c#d4*pQW}_fK5uf)pxIK|bX!TI zAUFhvAbDh0$DB(b<&=w>c@~+?mO~$J-MR~akW_l;)Ex^JM8TS#=hGKpEzjqxkZ2c=eSxhJLr0udXi7 zKq2-cl9jnQBE;Aq#tK60?%sRNhepvTP}aOWI^JF0NaJ(A^%I~vguvufmDoLf_U!)s z`z1qME|(=AY-erBsNF%Ly)2Tl#Y|G<*Ly|3sTh9W;rddI`rp(EjMt=dL|*cIZJK5; zkMUvucoKZQZi`+(ZHvX?dgxBS@*#gNDYP6?=od6Y)qO%JB9htkMQtnwhD9s}UplBi zXg`}2y{7v(6}Ify%uLON8F1D0n@5kH{ov<=XwsZQ-LPX7H5F!J=9EXXeGC(Wnm#{! z>YO76B1B?MDfc6Rw6mu2oZ}dWBvH(ys;c>X@#?FurlgzA=IAJ_uP(W6FE_iBlUr4& zH=8acna>tyXBVNKJ6{7pj8R0duGS)2Rdq945PJaXc7xhp+04|890$+Ls*rQ8Ysc&a zjF=Ib$c0e8DMNbzj6nII!$t^InU$+;iT06}q7Y$KHC5FZs)CiYD@6fdBE^)=a^3hc zaovMn0SXs?I+M$)D$uK{YVO~AmC@o5yRJVuy)pJ3su|>d+NQz7SqeqY4eDlqTFz48naZ$Nl`)MlD zN5LTcvvQS#3IIeT=corsrt1go_X^;0ESHxkf=MyP#bPyW&o2v3ls86_!=!;r_Z;KKkRgh~VrxF0hhsH*dhy)yu& z;*XvW1wvBGQOACFRaKR9l+sv)*8sE*fgGA-Fv&5QWDsGZI7R^My3WjwkB-;tZ9(%t zdiUMcja%aoB?A#3t(GYXvsblYh&h*b7j8DYx88bdHk+laV2D6nw;ji^oTyb*v#+9< zWCZ{wkHBE$T?JUSuQK*4EHM)ibO|sPWnV-h2xNptK+4<^Iso#4BpV{8m=pzhZxxRP zlr9Qj&b_F+ii&87UOKqKPdSmQ)^%OnTgI+CIyxrPDsZZr+|IYV^BcET`-Z59_r9vC zVd$I-^ZAhiFoFv-L?ia0YMW+0wylUF@Y&f#6Z@1fcWu*XBC^e{fyr6fmRc6h|*mD(-zjGGWkn+buJz85zYG4dB7OS5~XlFbvF| zi3+IggZLfB&R>{ecEB$0i$v_3s*E1hN ziX&!m?5K>NbKGp!brsO0AGh1}#d0y*j#u^aD5qr35!(9d60vm7l4Ej?`(d|QhA5Iz z2aT=`n$1+kH24s@uAeRDRnsCla>x`^ET{i3bN~Hpdv@iAVQcO54JY6HQoqg-jY+@& z6DUS8NTx{2lvFN~W=W(;yIdNQ`rRtq<)36%`7f|alC5%?b`?vq7$r>L5F89Rm;o?o z03Ba`_uX{jH|?~Rf7s`K-+iyU0SqNdKGoHA`}Vo#e9!mnwf732z)fvOBQqLKrIbP& zw^@=8CNolCbT)lyd7%K9oDB(tne@y;@GS@p;3Y(0kV?MNKBG1RpxokFFF6P7O)OMW* zzv=wNx}LAkgiuT%q|_c4%U0`rymu5(SpsQoW)uSY$oY5&)`O_Wv%}rZx~jVK+1}LK zu4&p#OA$dEQ@71%G-_GGLAbKp+lsx?N40VqghnQ)z)>R!zx5e$$PL6>?s zE{5cragjCEayH(LmI7KtU=i~{2_bTb1mK+)5?ddj;tzlD-p_sM=hxL*W%;J5qCf)hE^485u0rsw zZExRxStuO{h`s7I@bFrqSX9*p1?Ra|CRQDH8)JC8G~*-3qD8@kEw; z2RE}|ZR3u24{xG0AfpRw9eo4{w)N2y(9YftGq0;PNW~aBPt(0!AoNTiBmqX0J*Fa| zH@2q;JVQ9>V>MNhy=fb3`t1Lb2$*F5B2SxG9JhoVW<*Jp+Cb_5KdqV7l^JsM zsa1|ltS-6AZQBBXG$#5WQS`q@26T}j#!FSu^v2Jm(5dcCIge86+O=z`H<0If`d`ef zl@>xEgHf9Ks<==ujs5I{5ir?v5ef!osgOA`|I33_`BG_hiv_>DHYFu-Pq7FwguKYt ztNDCBpNh zTL0pUFJ@UDV`KtE`RMUOW6bsI*M$&uvq{>HMVD*8G;Y#7WfTQo7g-6khrxeD+7Sk088$Z>AP;bmUufNO0)gTh!{B3|Z``7H{A5-IS`vwBZQ_rsN z-}jjSCL*o%U@+(v)zg>P%UR)8Dhw$^k@U8nzLfmTiW<{A2?&4?*%+PpW#PXcRJ9*3 zg%B862oX6Xo+JPuLSix(c~RHu`1p8d@_JQOM&*)3vJR3`cCHZsB$Ri~QAoG1sw(nU zB4`S?+v=D>y+}WoKMQeqSB}uK+dFneC3FmFC?LCnCFFhq<0I>B6MfAbprLJHIUP#bd z389n{$y+E~s(+_G+|KS^vpFYXA2gP1ZWZ?tp*rjya}QX$>JU(aU{RLFMj`rpDdS~@p$sR z?|*ym@X&gC_4PNE+Rk8Rvze4yDTSyIB}GQW>2#9k#yVRL@)!p(#`R{YwHOXdDaU!9 zJLi&kX!4uk*Z{uz!NjGLeV>Q)P0@6B06->a^d%3`7*n@V zDs^^t=DnB0bl^mg-nN}>JB(zdMPOr$K+$=Nh{hN#c(Yz2({MPH5X&qjLL{Z~E`|`@ zR?M{(LZm@PQ#aeyL%3NtZ5uxM^S2PUM zHhn3e@l^5KIhUfn>pFp+p^K4Yl-^6F^w!b|P#NXDPbp6-wL%C*IRwb>KX~|sFMOe{ z?D6r*U@+P}I5K%AfRJL>w9dB3 zU0HmHsCpGtA-1_OT8hf2;Rp)&KOe^x~@9!eF&SPC|`d0 zmB(kB;b8R3zx=NigNZ=BURQZh-n(~ycQ(=5#K=wEZ8ptlI2n&8&O5D92$^hwF2l?$ z7FF9iL?j9Tl;_E^0Ma=3Gwu&SjJ~cnMNt$*)^|IT*g$&OJkN<}wOVPdXR}%Fetz`` zA|kqSOVfR`)@l_(Xrxqa+i0C_kMY1NQwby8r;Y$H91gvg7mKsE-+A}^VlJiG+dn)w zIAq2w%alMSUsr42HV9DyFa;^46vp~)Fqn)7#U~%WzuDAzrf=Q4{crwTf8m?o{N`W$ zi~ru~>FH*3_T?{s`N@+fMKN3~HYPXLStW9zl#oX2ObSJpwmVndvHO+tY^Un;*Bby6 z5J8&QF(Wg?Nd0L6msLahSt6v3@;Mt5X7)a&+&0}|xs^X&F z8ed#OJKR)!FYN#t23MKRU| z>(_7Cw%QT{0w;Nms;U^ma5PAtqwSgmlaNXjWf6i)RwIK!*)$Ci#TdMg0zb3Yz}9vE zJRA=Aitr#2A#ay&T6}wZdsS5>80^)!-QHW0fU;iz>7WJxKx&$eQo3uyWHQxS$4E-4 z7-9@D=~N|%<(8MD)b$%TF3uObdk3pkb+CV=b!M%Th~9OLa~!=Cf}G1eByMYZJcCuH?FWAf-rNQ-B&1Lu z&;90@R3D$ap3emiBjP2VlrN?25I`x7C^R!OFbYA$z(|BjZRs8T1V8;-qU^}Uz@9uy z?xP4%#ORGNF^0aUhbTypl9`VTfJ6{^yZtce&%JeoS3msa{X~?S2`lCnCQsyol!oGBJlPS#E1}9FL&l@SeFoyE{;aH& zDoYt78)HVp>1MMi%G^6^U0W0d#pt>yC9?paKtvQ#BBKE2C{d;IyZ^q^cdvwS9EW8t zk$vz&$^={w*6Iv_i24zC$qbgfg$M4-;KWLOImLUc?Z3-O!V>({D!ljlX%v`5!&zW&DBP179SdhyAF2Y~AA ze9k&br95fxB4a8UF?34?!OX-05I6#`l1eBox~@wja)}sS(!mr_wV!ihNawa|RS1z3 zg1q<4gj+qBr?m_ul^AAX5=ov>JRMUZ3Q8&%L`0;GA&RaGm**ZBlO1ck@F^hx!>j@rl(|J$ocun$>bW0#@D;9X2^vCg&25Cpa~%$GQ~iI2+~?BfH`ursg;r( zWAs)l4NTD^GA8Vr4Q)C&5P;cVEsrQB6r>0tkPk|!=tHs*Az}(qNJ0dHBn;w1v|ZQb zc@7*|B1pwd6p;XwHiO|fI#P@Rfyf8fL<)$++;Pkf_KtRUciXP5>rS9ZJ9Q8dmGBTf zQ3Q!XG6_NuA{Y`01s__cg+SgeatT%o0EpfaGfRJ%*AJg$>QPCNzSC#H$^zjE(u@HC)U#%@NFhyq(0kig%AjoQUyfluP0R? zF~$TePG4A}vuxo<2tw+FBvT-*wLS#z!g{?f%M6JHqselCN=Q|$HrD$XA`k`N3V|;A z$U+)SSvx%3#5OOhU%g14@cWmzm*H;d0zc&T)($P$NPlAA%oGM!1Qy*<`-B zD9eEqN#s~q>#g-l32WOdGe+wWkV)ib;9R8Wy>F{}DFtSEsg)wZ0+TL8h!JA+02rfJ z%H)MX5CDRe51%za5mIJi+nnE`43t7dsZa=T&h<)S{i?&%B6BD$n*^``=3;1>#i!t^ROJb<|a5yr1xKbu^c>9s70~ zUKyre)#>X4I0lzG^3(C)l~-Qb)(D7FN~5=4tZAmQE&hp;zEo<-v~9cPV7e737Uz!f$I07Qz<>2an<8d{`D*w)yEs7EaDWkZXilS&Xp z=g4+#f+cP?o6%@wjLGv{rWRj}X`Y<2hCI(>bTI}*Nd!_FrOK_!X;XD=n`gSME7vxW ze5OS{EYK)v%*A}I4RAmktTrV?jv=J3N4mdxo)>vxt&>uAOfB0I9jcF>YmCFZ(Mq$VX1wnb!jb|>F>KpfX~hsPzZ4$>Yg0gAfvA+!O2kN!Nh_p4h$KW}HHj@F0wG>@ zZi(sA1ymCI&1Ov$OeV`Rv#ztYDT;ivS!r#0ZCd6Kqf6eE zhE`Gy=!q znyRi74rXU(C(E)VXX8Sk5Vh9nOiqJMA%u`+WC8{$Az9uDshoE%NT~`&;R$7y1skij zL7=+sf{#*3+ig&GAaY=_UaWLk#25ikDW#-}aqDBw6qHhRU3XoZ+ym1l6{2SjK0uab zT5BIVrICnGJl!R?x+TbIxm~&2AS4R;)GB@ZWh>QxcUo!?NT^`jsxVprq7X)LbRl@9 z1yKNy0)dg0$&}QW&;S9DFga0xiH?OprIkbxoQp9K$J#ohkr|zHhyp-z>g$G(RIGdP zQy~O%B#x0R05f1`TkkuQNguixeP6Q07$N!8NMr_x42dH~j6_PX#3%%K@3c^YBLX6& zq!c~*2oWPFg~)iR${4Kez$6vhG~?MefCLI>U7yw^IT~h0z{Jw~(T7kk4#`*S0n-dA zeQ+feAZA&XoKJcQntsjqo#W?pw#2i{epQ%^Vwz}0rmcwy07N1mpXS4#DTwhu;iJ!I zQZ{nAJ#TID03d+`2ZO=eZ@+DfWQqVvN{L!eCKCYYjkD9aZIsg47NI7DNE}ol1WLsq zIko-}h=>6Il`>@v0hkdr07r(-by5NlSF39Oa3_!#N`PSRT8X}P0Pf@4N855WiP zDRA;AQpki_fQ}rMP)aL`+sO`rLu5b(Bq38vCMmr*z$}5utaS{LK{{svfv)si0Dv*E z(X{gc6)2^>?Ua%fL)UpGl$aNpMijt+$e2U|IRZvvj1gn>%qWGH5@OgY&lqE*R3T7m zR#OZ_B4uYkdG)s?hh4J7Qptu_)G7K9mRk_AZt)c6H(W7 zTIUowb%UIvgM)(vhf1I~@10bT7zpY4M3J}5YV_Xq&Q$=An$w@UMU*g=_$kMLZI1w? zP$i-uP^<>d1tB#GO~EM;LNYK5rKQLiA|O#DhM0z$C|IfOx{OYRD76GBHGw1Yz{D7Z zFo;F~36*vjN}g80Np;|99h7c1GXoF`OrI15cU{XsDO>5k_e9eZLPU-NF!}(@M8UhL zl#oIJDg;0vB{g#z(?n(lj)24*BcW1S2#p{S1uX@$*jI zt7{UjWXNz?+4g+Q^kMsxIprORI7FAe*?1}V{s#!)%6b$sdBdfFwUiow0|$kw$7){5 zfj4N%6sdD4rOdP@MyXT;j6~^pLjYp$ePq@~8zKrmGNaboJJ)r!fQTR{LR;HR zgSWi4X9hE6GAXn3^K+9)fzgKc$-~WPe+-oHmM|Voq*7g5O-6&vXy&k9uMyc8qlDl{ zLSbDkGqYP3x$UaVh~PVlsFV)gG82L%!CGs90GKdpc?yav5KCqj$Q=R#qm+sWkdOhL z=h>k2K8E0dSqc;g0%M0Qr_mr7Aryy>(MhCCqxS&_i6I1_)Ui^=6i!L-oLi``|ld08SMpwbL6A_FG+Z1Nu9$kAXj%wdim0WxiTa2#2&BqAx54_*jitt-o- z+H`pV2*4f?VUT5!Lg*}_K_R+^2LmaDAa)@{1c4%M4S<0I0YpZSM1WKX)W#U{C^91y zltbm5Gp4N9Yv;WWw#N&7dN=GBBoQG}q(GCIjyl5RqJt5nx1q?4rOjwE zCL5FhBa|cGy2i5~;_PY)-DA0X3d(cAqQK-^6Hsojgh>k7y(nUDj7(~7>SzBIvYo$Nn3YK(+Z46iLPy#Lf5usRzz5|xxdB6dx!rHJ0g z7;W2@WeG&N(JA}TQg94JD1>0lBK1hPr_e~I79k)?CUjkgprq6i<-i#5Q86=dyIyIn zQ-Pita%3Uuq?0cpY8{!Hrfnf&h`?Z!E)lfALSV)uP<2KM&C*)-E;1v6wxMMa8F<^N zy0RgIxD004LSh+MVCwUMl+tL)%s`BU99asCK2l`z{$jD1&1Us#V+^!)wf*i8n`-L| z(KMkf%gBK#IKNHYli3<^Ozl_iEVIu{skDg>G#g1O0^8c_TnVYNT-vTB4o}-psZc~5cQYk6&#EX;>ePC3DjaCWtU8_(?1$m)?i7)`Gt3kJI zdVOlLa~Z&&ioH}=@}-Xh{Ez$SFYZT#y0ta|!G#b4qz|Ew%wC00DFsRm%KQ>ClRkDr zcTqZZlh1hC*qrU8R1!c*!2*dWde^i8fKf0L#>j}W*=*{%nM`JNRly}9swj%}axoed z!3@qh5bVO%dNNHf z(>-^-4d4Vtq@aala>3gWT8IHz07{jxiBd>~fjuAz6fq`0_DB?kkV=WpwkP=coMC_t-3Wo?Xl9N&iWapgJN@|@O16LFs`{MSwwfgjP!P7eCYI7F=fiOa( z5RK5}o5C2Pz(Nu+GHRtbP}f>CdN3%1jY(VzE=7E=j&jn3`6^NAd2b}Xv{~tg)IZ6w z`L7~?f5bd3)qZJilr$VuBdYKFr64Eo^L)z8L>$sUGDPPbT#C7;JCabTA-JwvZwnHl zNTj4paUMcMlv*h!Kp?FI1wR~?!HXC~*Tj0WnayV2wn?U^B+D_(>9~|sSB@9dNEm25xg&3pvA;#!K7z}eEgthkc^wbzr6h*o@Nh2~%!ct~M zL<}+Yd$z_HfC+qp+nyH*OwM;c%Gb;A0F9AxeoVZDkU{BZAH|2o4BP zNr32V6A?tzGO8p=-H(gXo$uq~YRGIq6Fno5->+c-(&&t0z!0OY4TO^i_ix|6Rl5kX zV2%{1T5mu|B{J?5q5#;=pSNw)%a=-G8;F=32-6$MU-^|^`E;CIok#sk%$Kj!VEsPy z%nv{I&r?m`m-vv73708!5<1-y+<|;>eYMbU0bNreN2AqbJdgq?I)RKxQb0mt^})9#Naxn;9W<-*|rVdbBwmLZQXDT0+3^H&UUujY}T1kT1nfs0zoM`pU-=V z(?mT_0vaIo*?f^@dVhZ}&yBU6F*>m@ntGELrmi=sf5SjcQ?+gFy<4x>X^TmXfJ77T zXWi-W*?tx&0WkzmlyqT5;;0gZ7`8czQrhV3QYTd8MVYYvo6Y9o!-t7>$G|aoBM`_5 z_7W-2G{-Hx$2xDaEK;!Eceb&?hR`X6TR1JpEp7ybkdiJDV9%TZ90U_2m}gp;Ap&vN z+8)H;d&vyeg}GI<2HZRKq3Y#nSvF)%wHx=5aZ5L4ohAy5*vPB*zf9{LjOnMF>J)Gn@q z0s$a!Y;C7OaOf2KOvJNCcLcSw-MzpvcJ*d;c6$6^cW<9q5Ex)!^68ExmOo$dE=;@C zr9m$MfV$eYeQxLsKW={eV`CWpWwmqD7n8=~pKh=B^KnFM+KwnBQIZt!X}`?#90K(0 zNF^1sZ`)Q0GWw~E!4@wm1Q9t`Uv*)XQh9F?l-4GhkRU{ffJnhdp=GKythK>)90DUd z+m>aSfG%}ir;tdlxoz7VKY3UVvbtGEa)*b9LbB4xkr8RJxJauueelU-)LGSaZCRE{ z2|1x4Q_i18UstD#LWmGNh$ti^k%y-3wvL`Lq&YD#c<-DI3GPlHrNWfUj7FofEWh`? z@4fKC3sS;xmz@L_en%SR16`aO5OfQ97qHqB?vMm69Rnn zL?ERIK8O@1my$_6d3*ci5d#oMO6*gLl)P7z5P>))0#{2uL@8D7Z16tRRcCD|@?oA0 z2Ia_mzgn%bENhyku4`jVS(el3xG1M7@$ufr=wlSg&M5eR6cHgt2OJPcA_|NY14Y5g zXj349w_Yd%f*DP}XUkl)v&Tzj8I+o;x=G$FG6=$bA0X#-|iH zywpidxHfH`mT;+PAtDaWcFlA;8I-xvlA`mjlM;%$RGfLDDgzLg0$8VbJf&FtER5YBJY~ocI{+5y12OT-Y3R|4x|)G%oQ#PqUmuJyVujcFXdD@QcPQ)5U8~h z0+~q)!4wn8EJm)YrmmZdi~0Qr4^K|cQob-6jS%srmtK1G=+S6249=FhDofEe%Q80t zFj!hFmndbHXDK@m)NMEZ)fEbt}GI;9+BE`rQ zg;F6t<;>8fE))}a7nh3-upAAiQkoDr%gU~^r)MYWgtXS~?(QZekMjW#owvrQRGWn8 zQ2-;_&H<1V;9ZLt5d(t*iok)vBcvM$T5F>XO5+3brHuJ=h^Eg1I3awNKn0_aLQ5u% z5qxE08l`lo77KED$S54Pr+5|<=*a&G0G@G!2+;MvH~%r z0dju=TWf=>qOYuNQ`$)sLU2-Ip5+2103>o1FeI)OBNT&yb2fO_)SJm@)U{2F!59-M zYOQ91&StaGXylx0+oo&l;H`5u1h2IU!EZKe=B?sSf^+sgMY>e9 z?>A%UJv5k=mMLzf6jBPJ*mdo8Rvu!ar)MUYQtj;Q9$mXJo$YpAw^%Idx-QG|+u#27 zOE10j_~Ap2p|fk(ErFbCn~U@1uoxHRKop(zLz8b8#sO&%1|p!8gtW9s3AisUIZ7Jo z2I&sz?iP^lkg*|y5fah}NKU#L-Oc;Ff53j&vuF2x&ULQyx$J72To;K3ARh~5)`Kzd zzh>u_eV~A_EbU?s^wLvL^73J>Bdmx@h`RK0+dnbX$qb~c+RY$*CmAbtEZ*U|@XYh1 zZA6KrS>{s&rCfR$%?xccI*L~+>)%HY;RN&JS~Ft^$oBMuqP~&8;uDa6#iXPY$X=2% z(PV`3Wb7$l`&RJk`TZUSNpf_T2kg~W)%8GVV(UnYg&#uSdQAf=S}FWHyDK&}c3{ti z?;o>OL@kqShh+V)mVDCXM}XN@-N~+QR~xRbNcfCe&w)33>s73udZjBuOWI!CcuW!L3{8dx4PZpbfB9$Y3fXGe3IS}i?l zR?_u2i)antXouiiL9jSP)?bNu=A|kyszZj8AVgX+>g&uD1al;#J~9p{Ri)3B=X>Gn zZGR?r@PkK3RY^%MGKVbnGPJdgF6!V_!I+<9Pp`U)b7!1X`__i3l_>hDDNmmlo$<2tqWNJqo6lhG*|eh791 z_ZS#o9Qs1AxppMhRXF!$G1ANHz~3xxTA%KKfp2cgOfom_z~A3mZ0`N+d)H}=vs#mg zKOTZ)Q~S`?lnF8U4DQ#_w+uJDpq*fYVPR}{V9)3y4$U|sO8X;461Tm^>POV2UBnldAt5gG!5Y&OQeb^GL;F=d6EuOUq&2}|OSuvpKulCph-PY;^T znzcHO=6?fzz!4yJ);};X@Qbh5QjGzsg?s4P#MO9lB(Tg~Jf7vlMe|okr9LJC(hw%i zU-A?qE0|g@m|Z3$41`JWx?kC{{dC$B^55#klVC4;9AU?2OnT^>)FnUNnJITMTU2`U z$Vyk&_WGZ|Gek^8LB`6aI zCRq~MXPTjYEG?J65vJk>yqo3o7-muJ1dYf27pl&9E{KjB6nGMa#c@?vHv?(7%+mpXlu77nUHtg0A!CB3 zv?S?kN$oc>B{H3b?%=J(I)SJBHwqvyG2^DsCUQzYBFW|V*AEyUS=KRZc`Yx9>Ardd zGVdXKyPe++MegseUj|*~rZE3r2H>QW`!90_>t`0q@>DLvUNlYw!M9qbadEd%+a_G2;0h{;rJy7hV7?=$8CyMfRjzrQZ#7cTOX>X-4ri2EW-OL*I*pFI z@Jbw~=h9ixpJQoM2y3EszW#h`C?j1O=kk5NrEZ0VZ5mm__$bbj(VIs4`ed__a#>O`7llmP0=bVG5mAG2I1b=qE>TiHDVk@Qm zOPV8gF+qqO_b@f2RT|sM!j!42B7DB+qxtr{oGnbhz9~6O<2#Gl7I@NK$+py;MVccO znX6;RM@u0~#-WAYSc@dxMcm9h_Ar=?@=jL+H<~I+xE^_q5Qdn=bxRD3I*nG~v(q!bBV$&tIv&mHq?Yv}#E`nDfJr$qu85N^U zEjrb8huF~2$ZB~8-ovG4^kDE$c+ek*T~eu=qnmhi?1miS3d-Y6n;P-#*YY{?DA}X>IdDzC4qe;Ijzg zpzj!cTw;CqrDx!usOXk7#;~w&@gZLm7jaC78wDb2ZTwzd8tFTKfefGx{zUuzgT*J= zpghIsH?qm4u@tyo!$@SNfKf@d+2r3Y@#QS6xBI*XyPl1~E~nYy>59LMnEN<;8D%wg*V%x|eP?ozdK_S-jO{_PfH9tYfj% zYg9`CRAl1z>A+mRopVSoGa_z)Q=Gt^8AG-x>nFNjS@G^YB#z&vw#JzmPg-km-RDDc zs--9JTG&%8BdtxXI0yYDJ4Ae3?{Glo_^70epL+_Cbk)-r#vd81{4CD>c$uAXv zkv=}Z!kZ8H7+S6dUtjBCGnNWx^Rte9WMpwH=VnT=MK%#kfE@ z2myWmss@j>$Q2ya>#?F;sZd75-`ud!<*bxX8@XQ@4>Myb9V$KG$i71c| z;)j`rDAV;2{@Yx=DrWO)54u^7oLa+cbI7o!f{x3)lJq~TaC72&iKT#Pg>-V)2~Jzf zt0WrzeY3i!m`$~|B16a=-o8-KV@72Q=bl?Zb-)yQI=WN6*LvC3 zL%nzNEZd-V!7yC_If5a)x4gh9n*Slo3i@ zxw8w(OMzfOijv*o{Q^bX0eGEJ+!}V3!e~N#f?12ru24K%qxj!zMeJsA9tJokJAayu z)(mwity)C5aKjTBqsQ5tSHd=^Nh2YzG#ya$bEB;Z9E9u3dCjBxH2%N$(&HF~9Gja| zaO!9%ecXk0D@o^*oRg8`+o*FZpJ}Iz)DL}yn#Q7e!)0-Zw|) zQ`cXFB?4T(1`A(Ff8nEt!D-fu@h<6?etO)Fr%uj2d=P!vGuz^%S-Y7!Ueb@t|J_52 zSe_gH8WvnW-+WKT{y4vMWfI%NjS1pN$H{<@%eS34{KWRed}49|E)Wl_mpinc?vBd( z!?HTzR$I_m^0_jt5%89o*^P=&Ax0GoCwTG~3k&|S_V&RY+q`UTGG0CNFuDw-&89U; zA}TIhE4+lW6IMQJP0B9v62=YE`}`d?O${}!FRf5uZTn`ta$*2dAGI(-k3 z?lo;Nqjhfg!&8{Ovh9-fowha|EiH>ITIhV=p;^B^MuOpKq)%BX#_J#4=e=e;B}%q# z^Wl>u72!hU$o=3ViYR>YE>A~d%qVkw+T#6}wHAQgUt4zZ$q$OJW-Mh@`Ua>lQ;r+E zFF72pBfet&QrAbfBR6-cq#Z$?7gqztiE})&Z)Ubg4+5`l%M%ZEhECZM)ykmv$D@BC zNqu+A-J}`0QwyzL9ajfb0KPxbY0>vO{+-m-`Wg`Jg&=fHw-Gj{AjgfTM&%bcz7V#Bo(2Jd>x2IOyQPsJyGZ(O}6mEwreuxc#uxhy9o zB{`J(SwQ}*Xcm?S5s;ZV)C@Rh494LP4<43wK-JmLFSk)(;qYk^f8Z=kBOZSusL-$| ziq1O)E6Dg{&&ZTo8tE!krX@5xhW1Y$3yB1Idivhaza@OQIxha8H@ZaySm6Gu=+3C< zQBK43%BYJj^ZrI?aFmi^3*sx&fMn+F?pY`)ifH5e7V#n~n#l3tXpkw?ct(3lSOryw zBZe)FTRUuJ^nC8Sy%<9%TRklB>gcmT8NizyZJ}v)B9SYl_~bYZ>2%3rl;dFUVJ}g{ zQOJ2y+JOu>^@Zxy>vEYIzoD|7Nnl*hj%F-*^Sh$PxS2LghR*-h>gY}XGBeKiS~pCe zr5X-*Bc#6Jw^!G{Ne^8cKvifz)@KVR>s`n9iMasYl4mp4M>6}3!@K%-v37LH4D?dI zwx!A3}lj#=SIVoS#P_YI!U8M3;G$xl8} ztKB#sl{G)aC}ZBpJ(NB%3J`ziR(H>n!z~+Y42OPZadKEG4#$yLyW^&|L*o*?8i zze!D|{p%9)!D6Dtd?12uXC~4UTwQHQUxcQSoeL z-wNq@l15iPU>78K-BpO&bxAM!lY)#Xv+T@Y<-%HfdvOjK?1oXV>Dn3XnU?L@W@Cak z6*z=lddzR1LDoUh`0mCz5}FWw`_@r7pcxrqk3Qeui;H189Tl6g%y!DL6QcdeuEx6w zwp!Fg30Z152@ef4Ty@OJ`i1Mbb#o&J)vy6X6h2|utD~e+_##A&L&d9_skE*i@7SD^Fhny$5~Ca+Y3bsajb5?% z&SD`eOiP+Ro{M1Wt6`_^x)zgR5EW9PF=vS({?o#VPnfKdArEHVpzRIbM~DTvsv1?l znDy*#^nYBtMP!NCof=Nn=JCGE)$XoA;=KNdcal13DLkuj9i`{2b6y)7(A)G*SUrQS z+`4r#Pn;pZ{dRt(f&CREBOdBX%>*CWyjmw9dO2#PQK|6#n8SU`7US{vW9#Gnq66Ex ztdpU*Lsgl+vw$PzX{@l&($(fW$@bGPTZj$c>+Z{-<>JTb=8pS;g;urEvA`>!cJRL& zAGn^A_maHcY!2LV2rP_Cz@Ki#|A)hn9j2qNKrowFOCHZ!XbquX5*nFW;WN$&wbIj> zd9JbR>bN40G!_7 zuFf_+Rj@&fQuLbrc$wDit65K#yIs`$`K=TUsbIJnOrLZ}!#W`2DW-)eJ((be_|`X4 z>~DWM`@YxedKfW+^Q{#r;-gBY*9P)Uk4B#kF(IsyhPF9NoQxbLAJ)6=XX@WNGN+$( zF%zQiU4+EM#fMI7Dyz0@5A{#rbq2Wq1TM`ez#>~EY04iyW<<3N;IKP~9^xy=v1n2s z{6ok#CL#(jCr%XmxNmu*a`hM3 z_N&JF>ihe-vbqLtea3^u_Yc2v>l2CE+B-6%^NzQzp0RHxpkhY`LbnmycV0nl=1pM!9Ewp-zKA6`?I#L$*Pl5I708QuBej5m$kClak$1zvD-{CLOH z592~A#0~lmhFh)kh(3*ALynQSc5{^Du9J{>kJ(=I7$sFLTj?NmPca@__Dkj8;`Utj z{qz!uPfq@*@$s(l)x9Q!h_gBnoAw1}OLB1`b2Pc~>fO!w@w4R0&IaR=Tr0XFl;|wO z!CvZUeE$aY?@e0Tz~j~9QPBToiE$SRdZ27p*D*`Px-bO zPHW#Immc%^UkK7l1-2P-2VQkENCw_{t7mj~nOX}oGg;TVjruJCH3huuR+$r1ZR7-! zmks8BtDE|Xz}Sv8!*U0yb~B+k3RR0+nGhty7;IFokHBgiE{U6`PQ?vY;*itQe^JXm zYx)L1}RauZs(9D}1=9l(E1lhA9zAv{2pwMXxkkS!q9jrH{&aDaYiS>>;8I{C&AbW>)+s zylTGQ|GfGz=qT`{V<6UykCwcFjq1NNh=}!25eTA{%lUb?7N*F_A20SFK7_E=f+c~B ziNDBZ9&Ve9uaz(;q}KkIaLFmnvDE`?z)h)-PID1<%Swn7a^1PUA2 z2S>`xaGCOz%P>S>Xmp8XrN zuOKR$FsX$ZwJ;zdyybsW|N%_+a zJ(oK6n0LT8yE#YuINckmP}P zu^IPr;IV&6ZBq#yGAt)|gvg2^*#KM5PKFJ`CGpKpGCe@9vc-7S5??-527}kh_7t&W zbc$a71uMP4rH~aK9`XH>LqGwd`(0)mp8<1B8;#JMnq$R%?8*~o3>)x9WSQ(8j!NFG z+@`MBh`fPO);jJY7KG^4GrRL#`2>1jfdxn?f%%I?Uk?UTX>%0=(5b656dMc^xKJ9W|yiwBmiyCGSNqC2Fq4uEI~U);2HwuOFu+$R}B%Bi63LyXaj3V?8JBDG?4xA4D|UT$y&QyT?7PQTJj`RL%|@9SWAEv* zEtRZ40kg$j{}%r&nt;H&lFDg(?h>b5J3*5QvoJ6UKHb>wAxW<`sy1efI6rY0kYszl z)Y1IucHDh7<>5k}G}7c|)nyCkhp)ePR>0jrD2=>4!xC}{UT42+@XlF@?mfJ$zeyN6 zN1-RnrfyjyDGxti^YdDX3G*Fvt%c3hGrafre*|=x+grT8EJU3(^o52{Sw*!R{tNIQ zvE#&NKM5gwij@%dvds_V?1?WUepPGWO?34W%s$03hx zreP74^-G*Cf?rO09A4{{5qb%KT4yh8AJet1>H=G=iKfMPqw6LObYqelT3~^20l}|d zQ^1NCMdxPYTDi#kVk#5gH;wb+ZH(Ia8=+OUzf-^1^_EWS+XbiAzxBl+X5^+ky}!Sg z;Kk_l+IJ1iPxxT2jDjaJNY$a|&E)2;mY0_gAMYRK@O^GCh~7Cbib+XHA>ak+oS*EQ z+>HcjNX=ck8;_=AhCYCO^CZUJ<*Hb`jE_*_C>E4)UnBs$UbDT+|J77+KBuyskdwgx z+dng}sTvf`)Dl5nN`}>;%Tl8$38N5*7wMtb*S#>B+aAd<5XZs(z9OS8Iz7#`MIz|B z6a}`$`m47S{etC*0;7C4BUu@3nBpsZ#xx>qFjfkvB0g^1IeXXWQ-1y6hvW4D0;WZT zk0#9;GU()LH1xK^A3bKpJtacKwU8E|4zbg^~X0-MfKRss;s&foI# zjE2>Mt{x5(fB%0W@J(&?fW<1(`Q;ouWtM~PlpI`9%EV}ngv*g&gh}gV6x&UHqA3Hi zYd2}B!ZFXLr>wUUQFViE$b8<2Ug=7QNjTV&4R9^Rdaz7$7N~lLTy37Czb>C$4V>H0 z82jwJetGb?^f>NZlXGSA*lkk1>m-m(f#rpJZSvstFg#F93hP;uPh{=><+0Dji#$5{ z$eXXLc2cyJVa;# zA4|%58k;lDcACv!Wmk`n zSgW!to6M6r``lL&UzbKmmeuQS-Lda){a-%m1xejL9c{qleWI{OW+pS$7m+zVU8AJl zGPmM^vzvGW2LG$%f!H?Mf31(p)B6UO^b#OQpR}ZRt=5r-k}ZmdK>U23W5;G{o=>UJ z-MUppn;=@npcy{z!1@TZ1ZmFOZeVXMq?K4n$+4IJvWKmF|DaW%i zz!$^p!|~-4$%$()Yiz|hh4mKIVZc^vu>`ZO*ZC?{;7+ElcH8wYs`Tu(hj}8PGB@&+ zbf36gM%M4{Zf~1H^;F8byStGqHVshdB;2tevzI!aBW>_^>IZyb?AFR@qnY6?H_Q~~ zJ_YM?Ye)0+iBw=42{mGcL-CC4m*UglsY{57S)AmK*tHvymbFI8&uk8jtWCyBFkE$_tMq`zVRNB5v-&BBBJ|&UMhFQ| z9XjvHM`v@)#M)VVhMB1oU*Ho*Z3m>1l*|16sKNX=y>v~wB1kPi+|xAmUUg8`o8vH~ zzrTlq0JAg+OIC?FR$?q}AWkt|kdN>Ep%!5#_E~%FROqjXV(Z-tqdH^a!m(<JH$ZLG=NiEjH% zr1O%mqnBriMHdU8u2$S$9tbKh_Q25c^~i@Zp=+16HRi#t_7$N@9F@ey@agdFC)Wz?PSeTe zGkT@UcFLWlBpSe#gIIA%%lW#qry@(p?<`DH>rn=k7^0W-b~(L?_wzdBD8=jkJktUk zKQdo@ecL;NOqC^RGp2=Ehj6=r4FezEl7pIb?tVNDfIeg^2JQ-uZi;V!&0CTLN4GwU zZImeBeH^HNnDkhay1Qz>JkIR6N%sxB2wi%-0Ays3t(7%1|L*Vs3;+G`wM5bUceyub z$9B%nQbUbUXsWoEWJ};$CpB!YCbIi8lR}x(NBxkHuSxyO8tVA;7^gLHWQgg6$Th8M zM#9<=2lx-qtMc6nY)sO;-z5 z_#!~hG+`t3)AOEPDGr=RU$E46UF2AFE|N`85lTiBw|--@JEgU;bR*tzlHCHs__rDy z4T)l1e*-G{Ii>XaM^~*qy~YfjqL@NJ5H~drkrdtI2HQIrP#mjFHH<%ch}^QduY|%> zMw=-4)6#64Vk1g6#EpeEPJ3PC^A4gHn3vC|n1p?2G7cK*j+6VB&Tk&Ey2D9$g2L{~5 z>~r9@^XI;)AcaLyii#$ULHtU&wdgbiRCNQGMNVHfcC8~xB^O11O3sN&NE&bp?~kB( z1Miyy?O}^|yY&I5M2GF?%PY(j0_0MnK459b8MsPu6XBxYAx=zPrAS0tg9FYNs51VC zS7KDu)MQN>VyUc}YXc3m#Kl`e!(*pyjt1t+tHK07-uyRV${RAAKCLp@=7OHKYk5h6 zyV!!vTlhaWgUu1;;kXqLmF#5Lu~K8eozYoXrPDp0l~qdwLA&yuF=E>XOmaAySuikT z_LOYq|7|Ju0yfr|3Hiks3}=8O#m9%4pj)rNwdQuw{Jn=>sYmCJC(R_Dzh$rQ8T^BU z#Ap8>_qa6$-xP=xFSr|BbO*Z7!v!P&RGBdjIzL{+^Dua$8{73AK(VhJ95@O5+s0fU zy{^*ZcoQQ~jqaO!6?RO5ZOZg|f7r8WuxxV9O4Gm|C=>s)N&7|p3-|y^#6pz29D1C9 z{#CXXYEXYj+s2o>zl88{3-o0zbrMH;!24AUoKODsEQfX4N45fN`@5jK%*QcTp#gI3?I|4Bj-_ ztWpywb|>UMIfow%w$x`+MQRyfMed7nz-`}Pl;lT(nABN@z)B2Q{PyNNm2+wf@wXzx znI!%JXOc7(1|ZTWM9~n!*Uw{mzJkCCjC^uR?Y^3@dL{*Ye81Z%5Sq@_piF?0N3t z!nfzAAMd*yfWxQ%9Q4UAuF?bt#DaN#9fUU;4wMuNl*(k=P3GyYux+>6st z(jae7Pr}Y=4}C6samSv_z)h}>>vQM8bE?2i-Jms^;vWfL4+|vhjB>@_(x_apLgB?2 zNs6`dYtU26^hpOhEcK9YTQ3ObJm?A&vT+sSb}JNQQre%2HbVKw+^pBEpzhOaoff_p zt=GOVs|cVYLy2w~CR0KBtDFQlaL90iwo((F4O;^byO75&?udUPGl14Wj2GJLKi8T<1~&>2dsjS5AT^Sxjzl4!rJVngpY@JHD|fYO*$Ha(0tb?OQqV zrL3+i-h18$CC%n{7bJmO1&{MWsTl2gJSIMCL~|}%R}YonL-UYNFu#aM-cfa&R)_9= z_ef8KJ5{@C2{{U8lTe*Phx=34eq*R-{D=Bf+9X_N|5B5pyDRI3NRfum83s$NKOZgW z=9Zguy7lhW_?P78kf;SkJ#j7%N$Tftx9;O%zr+gRBy^);9g4=s3hnXP9cuU@Juzak z%jR!U|53>yS%z!8zv~@mXa<_1}xG*>1AxxYefF5G(*nb8yg(rj7Kii0x$Tb>u}351$;~?LXpwCdmUB?|(7J>z1qO2ih8zKy zQR%N75l8y8QmzCqbvSSZBmCUgdQtUlZ|9INdYAouRzd@=)|tNg?#DNKU633s1Or3Hb)?oW$PnMF5!vapT0aqD7Ej6ztmCFrb{!#|y(>bqLH)_hE@jK5YZB2eS)W zeacX(p0dJ`#&>tUQzyy*36zZV+SX~q7M1(fPEW7h1q`^Slb&XxZ#K~H8tSSi&1K<4 z3k)~Ug3g*BdYu{Q4e^A@hrPA!2@R_`e;%NOt>L zq({0dc`BZsKukR#E+2yWYp8$p`90(`>(Xr(*CZECk(Rn znkMoUsCwxsfVboIZ;pKAbS^mmenDxf6wT_+%JxwQ=;@YZc$i^v7Hewcc}7Wcsj9x- z+0vT6aM>2h*jsXn8d_Jb^= zq5b}SE0Flp8YJ0qb&~nW2jt7qNBLt==-VSJN1@yXj#Uc_bKXJ@Ih%bWx(5qL-FFYL z8ROfdZc>w=bIR{+fep?2`}cpvoga`LmzTzV`yO$UlUAB-po8S1o+=B8VZ;2ik zW&*oE_y4~B&G4ub2aW=Jdb2IbId_c6ovb*bh zjpOCfO0VA`a;xezG%o~3DgBA2=IPq;(cWH~M!r$a1xW%hLrqLjBO$Ff`8H-Pj#mqv z79QF-IXe1dA-l>+z}N}nmT?Ebju?zn!Ll0f_HBd)8*8enpin^><+loPPa#|WZO6Zc z_*c8vQU@n1zO@BiuJ8tIY#sb-IR$uGpJDm{4Eo$Rz{RDLQCP)XytTO_$aU*8r*@m$ zdd>G`a@3>v9KFlb7 zLN1GHsus&>0}u6A$Uih-U3>1y{dcg?|nY6LCl1(QSt^x z^x?Y0p1TG~r{o>Slh8{v(zCeFg_-`(EeSM7R4txFVx zM*S+ANEvwv(Gt&yIBG7zoMtwN1kA{_FAE;B8lFa(*4b%|wKN<(77|Vf9cz8A;>_$seqHFN3Z=7^f}y9pYKX_WEi*{!_ar zj;H`3n;8O6#(#TBaty7SUUvE|&b_B4?xQ-rHuHH{9>0gzniB)3AOcDRmJod(9VRyB zWhGwlueH9>j4ywx)}S`Gx&5eD{F33T0CZu2jm=te!c@prG8mNH8JV<^efqGvXQnwd zIlgWtX;Lc;j=47bG3Sud?hbBaTwPt236)Q9L_K8_@Ackd2;6@+j}PFYvcrnl=_S1X zco=0^;^E<`Ozx>#%W(nh&i%{-35kabuO*szR%Hc>9N+UBuI7(VpIrMk@d(IIo9Gag2E)+ShNTGoz5 zYp>(F+_aqvILoQjk}ChEDShrpm-O3xb)0t5ISe*)hPr99UQS}RA@wa}uH3&%df}T8 zcqx3yO$(>SEXC;Q8sT(gLcD-K2|;7C%1ORa%MrDOu-M4a8zXy-)YOfP-6Q64S192s){a zni$EgrDUkK%qzgtEVS57?ZL7zS@ z@S9yDEB3T>|0}*DAX((pgMj~%i zRc-8WDahsaA{Iz;li+O{n6I-00cTA{ZqA2b0h6m$wT@Fwsr%)w?z$>O)%=UZ#}%o& zTQ7!x1qaGysRLaHA5b^N_PqF&Bnb&R=-!<t)g@FrY=u_VJ;?YA16UCuEJZ=aCE9)ASE zq}$X8OFWM+M~$RGnL^JGUBR%Aek_|w5PJ?wd^LVcNIzHLnyzDZezayFrTonfhH5Jj zesa!&nhArYMba*05L;yIL}6Sn>681@;+MO>41+#XnhW){U56Ju9p?wwZP#`%#G{KO zs`WfJX#0DeZVHkeSI@Z3+XXeB5cTb}^9S|5y=Kv{vCrv8J^l*~;dq!b@hVl&F{zj5 zn!|Z%!Q&v(kKuiwzq65cob1%J(ze=xQ5ZCC-a4NM z$cwgrs>!l+gTF`|LM;4iJOAanXc2mRXVxC1E+Hw3T3Rxxn^vlt_vJ{7l`wh3ni>uB z^mcR>J;N3z%M#yGBPz$n7gBb1fHOdKph~!@Z0NOZoxpv?Ge1j?S?n+oYzi zSdZA{OS^=G#F_N9ssGj@vXOSd@9GNB5k2gs+TFGa{P%UoMtL7DmhP7P_W`}zihw>3Z)J6m7(p1g8+ zbtok&E{3@1T8M)jFH_=o?JwCHckYRG#}35uRHpQ9b_ZnXQY3PN!}A zzg#Cat6$nL>fCM0%g;lT-e{--ZyQVdU+txcvr=k-SFVSYr}e+i(j;SPIcCorkh>v{vY3UAT9H;EdE~q!b_Dis24fg-o z#i$HRKup0hDUA9>Hb!o~o+r@TcOBf8ld$5?FU*&h$5aa_~ z5O+nb)~8g(J+v6~c)yLPe}tM8n0S|dY0>9LciFglA~ZM+>bazUROTrBbJyXR^jvTd z)8nOzCVS4b)w{e>yr$3@tgl$AH93EeG&&4`={I{6#}bEO^dambipgX%Ae6nPFhk}+ zHOZFSU$qA8J$Y&eB)H5nbE5UJt`gZ#y3b*O=M!9 zxZfp19uN|)>-f$D-hKR{@NU#ks?FoxMe{9WP~m8KWep&N#9q4|ntH)1r?u&7xgv|N zUA3EyG@E633a26WSq;@jGjB(7l&_D>7-im!Ebq^l7(32aIX%xQqPEcU3=9MUd0j;O zSHh`)Kza@BbbfvN_}*8~r@Dw3Ese9_uv|Nz{dvaLo4viJDjGLmL`U;vOBL;2aG040 z=V11l&9P=~kD7-Lr`CSd0HN#m^Uk(~N z!VpK4m7eFRWq4P|$*Msj{r@FjhP&m+C8OG{4O0uF;9{k8=Df{nfhM;{p|lhNflAj3GBxJeqlEX> z^>iqFL}}w9x{sY7FPwoPb^G}y3V^>R|E;n`t=Rn2mzvA|mviv2=+$8zFgr(ccP({m z4IOSfpEel2Tkc8?dUSp`H@O`#@w@ALt&ZTM(KAT+kx0mjv)t1asMOVGd=pOK9>P!@%-nlzY zP2E{eXW@8)0le>N5T4ATKTQ-x)QO)(0K@=4HlynacBjdGc)?P(3d+ZgU#i1n4HzIU z_`9})a&YxCyW_$JPry6mKjQeUDWd@P?AYH<#b3OY#wD6*yz##v4V6NDm~xDz5U>)i z>fuyQ zbE!mWo6F1db94RzbIBETMy>RQS<2L#`SeLe>ODG*?A0gU}L?dc7H788ek1EqJ1}X`lq%$b=*QI;QpeT zzSqX}kFTYo33m=_XVH)PHbARgbWBxa&OT>d3_RX%o7J{Mv^IMQn=nX83R<1@(HvrJ z&pAl(Ms)ts%Q~P9yc!Px&G~Df9Ym=2hcmUUZ8dL4F=O`zc2=ij>jT^`$K#8;;ZR8z zBd_EJXrYq>>e{T4OWk1_h7kt<=_skTlwv#rIGeoP?@UEr%9QzC9x_!G(Q=O^c3g!w z2c6qLI!4uTL+b<2t-Z=ZQM|^t#X);RQuh=4$m0s5Q9;Ly(^43PL?)Du63ZhyeR9Q{ zwA3sunMw9FHa=rBQ5HYJ%<@93SHS>vxWW;_SXp9)Qj@lf;YLX;I^s3Y#}r8*y4(x$ z@p#UwP*XL9z!0&US8s1phSKGDJf~eS4H#T#$iwGvM|suQ9obb8z6oM zus9PiTHU^TnHW$CH?ALQ{5G~_q`A-r*Ok6QI^S*9hCZG@ zu`4d#fC&a+JZ1%5TQlbXDDuG6(f9HG(u+`Z;$Ks(my=`xm8BkKuZ_g0z+01VTY65l z+WOkL|4&(n-7q_}xjY_7eYfOqjjYPrxc5s;8_p^7JME=$ZgWS6XBvx1N290q2?Coo<`oTx`)-uko>ZHKS|}-wb4GgH!tVEJO2KBOcNVfT~2cB%o~LsUe*I z2GgK}?5v}MQ!bY_;#T}yQ+wNGo#aqw?R53p+M06!+TeF$;$*~74BAPM{%Kn0ukG#q zhl9U!PA!IsUY-=IBWQU%Kk=d1)8mFFBe%895h#?X^xO_Mp+vwaw{~oWl$4kys8jT4 z=eH7iiM(9&s|QTtrj3^mze$Y)uQz(lzPP)ej|K_PcIs~K2e(w*s3!{1!jhQ#4b!Ck@-%IE>k3O zK%H0=rtj1seb(esdYLyR#&~%~b*iuJ>pSwdS}q@e^7rszq2m@gdS}CtFOobb`NdD?x9{gK0c0ZcJ`VURv97#t|Jq_{pW|>fY0G~>Oeet=0B)$ z9$m-D4b7a(Uy%;4was``^Pz-)f5vJV9dTqff5E?&;xym$DP0Che|DhF;$N7{Qzeb* z3X{dPiP9jfwajSm3G6sX$F8q4598`C31s~St}CE9=c=^LVR=aVRx^3{O!4j1SS8Wa z((fj?uhfB-Zuyfr7LP1z23xYrGUEa&gw)M(>bFj*m9?GcW)!Q0chDe3N=2QAp3K``K9OqIyvl#gg{P|awSsiuD4AEFl4uQ)!-(R0 z7U^6{wYWXQtQY&pf;~eTRWSY!^nAB{ccw`|c@-yv#ln@V_ff}9ZqOExIr(@UbX)-0 zW1SqhGke$`F9xQ+lA?jGVoTJ;)94X*&TtS=DFvM@-I$x)&d+R~wj^)d4ftLf{_9xs zKQ3Qf6smB&J4(g#n>=ncxhV}gN_-g54cf`1%-y`$@8ieb|4BvvgK5f z?$m23@Et>#0l`c6 zvrm7t{xa~ADZL%+2a27A%Ta%d^V8GQ{iEwL6H4%Z@_+t6J%0Gn@uNGhynKVBQ+ZC( zjLOp6_S)h8lgAJL&@cW%RjrZbbTmt3><>QpAc>Rh?(XjG3|GsOvMe7wcrX|YhQr}} zK7aS!ch47VA7C&Tq-%4|ed8P7xOeZ~?*74_{NsOgbN*yvqyh4tsxHpg?OQ+f?#pk! zQB`cpLzctI?g1#t3Zo|p8ZKKieCgGmvVbJpgaRp22muf%f-$+)I{Bw3EhHjRQVY3N zhDlzqAp|LejgD~ZfG31luUGT=TuQ|pm#cYMmSs^&DQB}83aqM1Q<*`zT+OfFIB2_d zQR)W|@BHwG-}~VEzyI=!w_bbmt=Z0AJ{WE4b~Ksh#URf|kwpk0hH!Xz`1tsEI2a6v zLtA&5((9^-TUtOl>J^?Pmn=)zyQSI?O3s?wx7-fb17m54uSI zx3|DZFVX`ldl{WHL;BGnay4a5ZNNT-__3$x)swcrRPiaR;ip-*gwG7%zAN@zIt>uu zv$}%7;Y*$@`ueY4&*xD?*;A+jtR3&<`mpZ?$e z{Ga*PL$&^M|HhyC7ysgSzwyoY_OD<68~@wC`Q-fc?7ZFCe_0p1`EW9rj6DSJiQ_X4 z$-QZVG3HW~6D|v`7(5H1dL4*VM+hMjDEg`O)a6bWV$@ld)_h`aCf&6VT>9QqP&{qT zM6Dr5WE3PM0{FJAvO*h;Os*^kF@OsMs6rq_fl@O<3{fh{#C@kj2^DRu+D2*3LPSWa z?jVR1M`KJctDer+&s}OgT)7{;rVk01$7cVu^xi1}?$hQ3)k^0~-)inpgXbDEKjQIR z8i~&Wt$%co`~;`yf1gKEiTu<9fBc(1cbxu9U%?-=G=S7x6F8?H|xa@zV{Ex zvLq6d+5Y|e_uqK^_0HPmstUeJ2Ha8^=c5ngd~`09<+iWZb=})eMHDg{BBG~8WqIXTN*$QA$}**bCm&kxtu{tW<*$fcQ6v`w z@zz{O8pA*WL9?Qc`XZ=bMW1^DrvOW730`6$`O?;`AIA14SV{%^R&(zUmPpk-ZXwIE zz!WiX?>fo@2~S{_x(z{n@TxBuuL>`ceO+130UVr@h?K0e;x z-(RoSdwYB7R-c~U+uJLXu=df>k=8n$z_#u7_x96XPed0N7lXkd#whc_KmJGm_>C8D zzVX8K-N|S)nworKhST?c_+5hd+Uq}KLs^awi_t6_6s*t(@}8gj_)000p;S-t1^v=R zR9a=JtCvol%Un`>x9!#Uyc#K`kvVxttp*{G8B(V*k_U)aT{Y86jv|6UM2Vn;&|Tw& z(1^l@Iv=PQA`k+hmKm_1NWpKIZE7v0kC4u)KuCmAOCNpUh*~fb0Td!fOWymGx;`Ck zd}aXS70zK_BlUfkbo};`k*Ts$N+E7LUVvz=&9jUFg5UDR6V@up!T#ir{;1y~r9bNg zey(!v|MN3zU;sejfivqz3#H zm!CiT?59s(zBuHMzW%k3e)XSz`#XR6?)&e(`_)gvFoy9qj6*4$d8kuD6@^nuL6mVv zaTo|u8#YH&C1vK2bDpLd0F1>&6;u_WDjwUYhF@TaS)dAkqeHC*xn|Gh%yR-TtpSaHKXouM0xXuww_#L33ta9d3A&QuW%dvOMnq7}06By~p#bRPw;tP>JLxp16k^~3 z&FW!*_~=&eZY-<(;m2Q}=lR9UySvkqXV0GP?(g?c-a8x)PoF;h@#lv}U-{a1zw_sB zzxDWMPk;Qce(ztVJPD3Jdv<@q^4CB3{zqT?_?;*3{^+OAA`eqKjPdR(ckdqP^XJb# z`|tnte-cdp8iJHY z#;9mpWjF4LfVj?EU+)4y>6l6p6pO_K+ts~?sJY~v?PN`wC`3dAsd)ZzH--@Ad6rCG zm&36JED2Gv&A%cGAp*_-pd}*|L?Kj>1W16SC_tnb6@cSVR}KN0RU2Ee0wM+^TSU>k zY_p0wP&n5WjvR3GvN`MaWy|$L!%;pgqqESpKj6b}eD!%RXiod4#`wZlh(NDvtq1@3 zB?RW{ecJvELLiV!=h_1ff?vd?B8WAXVTpaC0rlV|02mO!f`SYhgc?w$Ie)R6gAAj_h-~INpXHz;I2;uSFex8nh^Sz(Gb@$Ove*D9`@n#5F zw0!N8um1G&Pj8+KfAMGEfB(a;{NQ_k{RjW<4}SRlPe1y`2jBjyKfQhDgHL|-y}$k8 zUw-!d#nYcW{l>4nFUqQ1r1Xmph9JrrvRGo$LNoSUk_(h2EaIYjI2;TVXmrH@FplFe z3<9Xg&LC%*6pK+~SFz`+y9Xfk>np`Dg=9jGfGPm0i1c$Qa^Dv81AsR`@VXys1v-wS z0WA%Z<#C8MP`w+wi1CPg8386xYko*86Z!!H44rkL zf|q@1)rb4iKgTPjR0GAMr|LCp%{k`x1#;^azU;NddJ$mxq{=GYnVRwTcKK=kB-yf&D+qV@6 zpjM=N4ziS@P-0|{EI7D`y7F+dfQ%2&bok+L=&|}D^73#(4i>VZ)=blm0~2Xat=n5Y z647c0>~E&1O4U)mc3F_wPAtpyS$u1=_TF>M5`zF> zh6(@}y71aK+zj^I<}$=}gJS!;4{q5~^@(MVrJcun6efj)uu}=3L=1=tXa)`L1H&r& zDpo`R9eZ|LX=%!v@swyCupah=SD(u)_LVHi(2r}=a`z0h?0?sxutIy`^z;~|mB+`J$6cUhAOt+D)@Q!0{&F?gcI zQy!AC|04nw8 z?67ZwSBV5_AOxv>SMdRMMinTR9gk`*uvy8>uslJx+(e`P;vL z^w#?+Llihp`Q_zGGm(4a0&uQVXzMv zv$XAeRdwZL*Uilh0Jtf7b_rlXgg_XF2oQ75AuvGkC`(To=X356C|@`;;|>1p$(`57 zO94Pctff+ja2G6y6f!ZQ)B zmt`-om57@e8DkVR-^%iWHA#`uNr{HtAd)3b3PP;RypQ`_IAc@=0?3I!`0ArbPu_p` zG|xvI%I@~PQ`!}H>-jx>^Vfd+*M9vU?|1J_^NmUzcX79So8sLV_ku`D#wr1wra?s2 z;s%gI;%l_OmB*S7?;%^ytr!5wQe1PEqO~l?PX}#Wab`~1JX8$%wO-jM&@4FXqs2i1 zMWg_%(6T-xw;lRmr!?vt8>hh>;UNi+ZfexPC@wtXIC@&>bV@l@z?Kyiw;xVOY7f6T zX*PS&{;;XpXy9ePHfcPctWA2!BMo05^u4-m5e4zU*fQfnA}FHP$ePFnSl`gEE>8DS>{*8~nb2xtUo9{Ec{p86f zaYwV9-v8kJ`{P_>i1CI(6v=M5E->D+;bUWf5mC#1T78mj57Wj5EjEx-U2EhxjE?_x z;Gk^)E4K4o%qxRC$zvI+MuiEWpn^n$L7r@oCS2xeJNTl%vx%-fi+he+A9y*g&XTAb zrDq%3e*jsexUn6WZ9+kGmRu=yJemiaNNk746cGTyp3V*d5lb$rY6U<{yqFgLKYQAa z-|~t8tHO*BE0)2sIH-V=lwe(mMUkf6Cxn0E7cyyqEJA&cHw}<@)wy9qn(j; zwh%#8m93fuT7S6?-@e2G5z!z909uHcS#lu|G`ggmOBTTa6cHGO<|#2oCLRWq_>&m+ zc@`A`m1%nU_B*@3|KZbJ{MxV|a-QZq37`Tq4|jKWFHfJV3W%n89^zm&o=Pq-6e*y< zfddCbBqjn(r^(SrW_6259LJn9fTm=tTwK}Ac~J@b{eEav=b|$rNs$*X?h)fS?ht66 zljV(|)o(5mh)bSdbrB_m2ml5v##Zv_d&$DFzFubUnDiPuSB!BOh6_NBJ{5d^Ia7xN zvwTA+mfPD~M6?sGhJ_1&II9LgtC%@2b8WvXE-ep`Fz9-WJ`pK)cRdhW-TXMl&nS7oHIY!qHcxLy{FycTZMmt-k!Q z^Ra2kZ?6VZJUG{nSv0FA4@3BPRET-lRHU4*(dOKD8?}3lK&h_*wBO3*s4)9{cCm&b zrwYig+Fq5J6PyanfdeB3q=5qgfI`ZcHP{N;oYal3FddJoYEfk~jC0NcK!Ghd=ks8) z+Q*Yzs}-4;l{uE81_vUFOfi=u@xmL`KghLM1~h$s{zDFq^4DDjN^6K^U%U{+>SJQ( zmqV{SU2LxxDdQLj@N_)ooX2s;fru!hs?-p?E8%lL*7HnOJ92)x4-5~z^onn}y65We zEm=p~LYF>&jjOuPOK+lxy#`({>Uk#lsx@3~lC$wZ7YkkGAv?VEgEM)XNvMB#T;r<0 zw;rb@V|%oqe;wL__R$*V*vC-)PK)a6*b5YgF~%4IDKetW#y&_1c=bO0#a-8~Xw3pJZkZPDY36fn_sMN(9!G`mANb;c6wY^HM!@)To-gbD6QMGk+m0)##wh%Wr zH~78peXpM^xKv4dzAz%P-|zSPy^E9NBFQ>=77JL|T*TcD+JixJ#NkR5%1mg$#oO#R zeeVzSHMH)HU$<4dLU{|rFKxGw9J2#l65ujXrxBZd(AO}=* zBp|XMA}dQ3MYZ&Uu`|&a5$xFR4+tsHKW``er3Z@W0wA}*p>0H45wz(?BwziNF|t0V z`nfvaOR7j1JaOPBokeTyU~f9vzCaevfJWhD0`~0XGmd<--v=Z{l9U;d5OaYHi(g~P zt&}nyj|3GIoKmvxmO1A+CuBxMD{^@J__5`I4~K(iC`~h49yElQ(rgoMLu!>dN`!7g z`+A+9p1x}Cr>tDjW~Ex*XIaM<(7~=sA2+S_K!e$5Fp34_rrs0lUq#JWkCv zZ}TPonawk9wu*1uoC?5l{`y8V?+w6O(ozi3*Ttg8_AxgMcjFC5W{!lIPII18AYx*( z<$AlLGFKomkwG=w%B}PU%`8W(Y@V)%P2=r$yVL2Us>kCoa1qgzl7avTGXWNnED9i@ z2WGrtk~eV*`*n9MEw*n4sU0icgVJZxHhd{1^!~;J?9$bhQZlF-BBCI*jVMXxTp?_S zd`ei+CvSTHYnO+b3{T>I`x+^g6iUE=gt)S$ui2B=JkQH%ArWza$CrGX?sv5zx*iIY zwRBEzwmq<3`r2hsLce);*u7zX`+Ocv?GVK?u;3w9YD^%VUP!Hh)b6iwbq6ht@=nrL^Bi+$*L^f zyj`0CQ{Ar5OpKjn-PX=ANC0qqduwXocsv@q+YS`_aLzfLr;8rGB$l}{jI=<3sZr1I zqJdFpf(m^3GRxmz&Y@)qXQ#hhKZs44l=48I`I-Pxd#41*EIoty}+D3^3u2N z3(qYPyIr=n6u#_fWdR!%nWqW_G6=D~Yt32QE4C=HxntuvcK&8P$b18jQi)^U&)s&s5g=znSZtJ=j9+Fk6Ftfd)o7k z5HY2kNkryW(~1KO9+B&FROgP9s`UgFXnq*9)`SQVKn>U!m?@HiN>S#x+XXW$MFauO z7$zJoziM>SZfb&}6=a`HF*;(#U%*-;rg8=g1CUarWuT2&7AlAjavgZ>&qQh(rat2m z+fY^P02|fGMX12$RsOJ-pIS+Xh|+9k3;a+=OV)g5aOV4}BCMJeOC`VFBz{!26gY1y zg+*n%aCJ+d+O%(ETwxUlHH6b?Iso7>RQmDbDKQfw5e+7CwsB3c4RCJ!IM4!e$K#QR zfDq+~NTMZ|;}9co0FnZNFd8buk26&T(fxj}2o%C;o`EP3iRv&60&0BpyWP$VHVTcc$X5xG z{XpqB3c<^ zH?d1r!ZzFSc--&zxf}pz8-K%K2Sh{|nf7*bOB(s{(X;Ii!(g7RajLq&_i?q0(f(Cj z;EH8;K0g=cvpEsCPO18Xm_2VI(_^#TSg_B(S`0iwYZgTuh9M;*msOF{;Wtapxkxqc z`@B{^1=m*HBlw625G%n1YtFf3M^IKY9z4{}U$qylm^%d3B1I5GoBRtVqR-ST{K-B7 zu?p&lrktGm1S@-nwe5p7mitxt-d9{+?QBNZd8+2xX6j8xtp{A6?1l9on>8wH-}p5n zw+?mMHE?fM51Rexr*JhaAyvi+F#{U_a1#^KE;Xfj5p3#6-Vg*q%xvzfN=?q~Z!?Uw z6*idsn^apPAz2d`U$asl=oKzwTj%FJc+scjykbdJjeM%l?VAhT>x}CHjOxafs7R5N zW~5e^k6N>Ds-jW^%+B;CEbd59yEdUYJ!8g$8i=NnTPH+&F0JT5(Ts0E46s!B^vP!t zGraroOdZi?cy2yjJa^1bgRX&NTdgoe3fy9b+VZHTIYp%wbGLl2(i=&!EiiQ@>@}AN zjC48p*`Mx`NijXyzu2+m^tC;KGKZAwEeG(1N>1XGX zF9lLT0aR5`&N;_OfQ%^9G-IQf_f0IaN}?{$LW>D)MRf)Y4gnwp#CjZTyt!UT>^;{K zrbGN3wH?zpL-CC`&&i+yX5MN=L6~~6qzI`(&T_8E*5Ls0RfMKzYz$S4wy?*_sb2rH zS0nxIQB`Kr20qgzJGJs<7gs`3w?kGu)$7M^g58eVO>A6BQCQ;7o&r2hCn<1ydn1}p z(}9_YmC5jf=%Q=?Eu|1=z}eTrlr1w4aXcQ5wt_K6Bdm8+mVqdZaS>Xvx@{-*?q61o zG|#`kI+_pW3xAsK_xpVia16Jd5q*6!owXoQ z)y0Q|TBKrG2>@BLn=AF#a-p5Qu&JHwof#+iTuGoH0vmc18*`Q4nhBWd!IvxNOXyd? zPrV`wJA|*XJ)_$oJ}PGJ(__9}dg9kN2r5m;L#xZan( z4Hj>|-{_*GQu=esJ~NK7WCc(nc=YJDWnAW*fhn3nXTR$VZOlu%ER#&PR6U;TR-x(q zd7h_fvW2ry(0;!+`FDvm+iJ6y`p_VCZ3*DYbuQr-?QLuc(O%8^-+ns#Gx}NJIFMKP zzzU$uREm_6MG6szNQi_z_3^?}g4a{5%W&O1xWB*m^REw0-#yxwQbFMhS?9)}xZ0TK0jn^pJ0V5Q*!aS2wnGIt1(Y~I|^ZKEoHUaY69hgqA2?XlTN zpf(6OT$_>55O~8t62zLf7D+@DB5~khh@iEzhecxB`X=k1UG4(Z$ zqcK4B0$?7dtKVw^i5)t6l@q=~ocNHdKi66qGP^epjdrd#Ieq6J4u{j}WdD4H4{X+; zb?B-|?NW-tn|$rw^lE4MqDHV4%G-53z6g;Vk~R#(ZWjS`o~Baj*NtD=JptGGYm0G- zDzCJJUc*RSi;6Et#zO>H0TAc`GgB3aNa?iJqS=TEN&NusP1eonZr{Qyo^!s_%`fKQ$I%XsONL#7g3GX0YJ&%B|$4ZHX=2*mRdm~)I&`y ztAz;0cUww9pumF{A+7v*SfaStfV%hjUdrV6_p*C$DdgxQRW(AKeqyghl|3)*4gKKF zflvKq4{lq_&yLz)v7Kwu_$19(=;0;4;jiX_5g1WG3nG`IQVJk41raf_AX_k4PW07L zbnZ4lSCQk}q6f!Ub6*Rl5+VXn2oVHePQx(X-rnA)%s<~Niv6NC|R#8!52IeTD zImrQ}kUi82BzzoQ2W5JHTB(5=mWir8FkX3m=JDMS zm?y~TGqT3Dvc$}<`68l9C8g2i~Pmo>by#L5C-3v9bP zM)e8~{MzMTH%s2lA`hmh8m>f!7z>r!Fbw$ReDaJwjXR_?r&&q~uQ){r<2c4PN@~kc z-Az@MqP~{QmjfG{9NLCM1lF}XsyaY;w7;d+7b54(%7ccouEkrBUJ78Wydok}S#Jd- zM+zJo39dKnHABnxv8C7Q#7R*+E$h*qKs1SpDw)o#NJAwcz{^Y;fL(Edf`Vb|MSB_U z7QI;U2CQ;gAVnInaSiiz+0fkG$72n0!6HJ)1wd;y#VTX%odz>RBpCv8*qu(NQecQX zRV-2vxa8jZ;_4D(09ps?HUT14 z$rKSo8}#vWk9y`D=aga`OD0t!+<{ih&di6y;b5s?r)u&Xj5}W!b43>g?_57?cfIxw zcAZWq3s70vi65zMUm)-_B~{(;qglQH8UpW#5>)ag0c7TkST^N^54rj{n0Xg(muK$_LFf8=m<|oh)nTN~dh{5huiRpFBO);K z67jFwjRH}vjuMs5&wqFp7hmyV1?RF^O;K-lZh}Tr<|uGY)V!+tG1N2-nd&B8fW z1tphA9Xfw|DNaaf^6IwU<4q|akEedE?Qd@)i>QcdmUAg)Th+Z}w2(Ej4ot{5`PDK0tURAB-txsT| z9PTCOO+}zzJKJxb)qC~l?NsXh_Fg_ckLCKwOQXPmyCCbM8~`BnDco}l!T;E7tRDMv z(SC5^?@bWWS;+bd49gqW`{xu0xHh5D{ce|X4#NP1`~BVvwVnGe#^H209*@VnySqNZ zA*yC|TCBoqIHqZO@#2L+UZtaGQB~17M2L~*IiHTF+q>Jqp#h2Oyr~$xxt%M$#oN&g zG-JfK2&gXkB9yR}wM}E6?1IV57__T=kVf4mQY#kE zx1)Bcp(berN+P*GeYBPkkw`%jRbWOAY`*aA-J^M)tocJDH%BBDQJ*5wf(S(lfQHDv z+4lRrnZ(R&f14$Yh{xm6N__2;~gGzNnkGt8#09SO)YWH24*Y zt=azzBcFZOh7CX>i$XS=(X3HzXk6&Z~AaX+Y`s=}1HIK;oz^z_AJbc7cXpA&mh8R9)bOYQ44-SAGjYPb%1gUBhgvCQU7(<;hWyS zl{`UGN)rGK;~0i$h)qSXN;EI1@Z~8f4uLI+N;4>L0& z5nC)FK7RZJS_fyO?4)y>M{xmO9B)x-jG1jYFGCdFe!({cL|cKr{T4oiLjFtF@xEp} zfY^~gEeZfcBqN~_nv2w&b1B91^Q%#+dO4n|l4{DcD4(VzrJ73~F|p;dD6Vb1`}=!a zSqpHuX5Pq&=ac-!jdgiZXV4W|4w`RsaYJbDBXx1>$&hCOQH3m>lH1G=f^ItVNJ; zg^$%YU2Y;{%!LgK>dN&ClwJT3m68*l0X9U6NXD+zhM8OS$VK(OI07O0AWL3v7G1IesMCIn(+ibimA zIvzoBo|3g_;eatjM40E3{rWVex8Hi}a5$(!2n+xeSQP?@7)(fIj3LmCNomemS{rpD z7R?9*ph#J&Bd0|QKt@6Z5fyC4Gm?N3LQxRFq&;mdDiDAwX%sOwAL#2DonXK) zy?2innDI5$T(Rg)@-N_)*Sl=>uYTcpEpqB~)(udh74&Wf1t>0brGA1B6i#VoCIp

Jk4za^C(r~5@~NcVI5@UE=lt^JODh|4jcP8X0j+uq zSsInMKc=JEF9ufE#TBxV?PUR4h~DqK+0X7{p3iyrz^lj4Dd$wfMp;T$A)*imkKWBi zrkt$u(OR+DTh@PcaYcGq?!|@gUy)YrC2I=RUSc<|IFO)s`K03?77@rWPc=e3~87Z01!Aph}@1UgGbaN z=Vg%q`ht5C6$C(q$mZi+rEYY=+f0~<0D{r7*E?Rm%K3M%YK)Fwe)E~0Mts?hqNG5~ zfKU&wIxt48R)z_7Bf-ys7y(Pl^YP@?M+jkvJ4-Q?Y|^7mQgYf2o>#2BaB7j`y25Um*=|U_oYXijHontZ z`StR$szZLmiO~Ar>Ni|WEnd6-Wz+Op#}&7vTxHcKZIL!NSDnRNtSAR_kpKrIv$VGx)WLT zudlupEp$5v@jBGGpOfBT>^15prFX5JinL-WPs{b&#yxgtW$xDk2&ZXEMHJb9VgPV| ze{W=?`Lv{ztXRq>BwTMK{r|4PwD~P|ZdqKh2i%x2=e(4mtvAF%p}vldFJ0suh?i0l zP*LqsvULNE4&!YIuvVd_tuALn19C+_3cQX`{`w{D#+RiL007FBx2}9eX@N<1A3;Ru zsEO@pw=VTo%jvJ%^v=0Rm#*~kAZ7}?op-+UjqdrmjS&j~sbvj^VXzMO002cmm6dbJ zr|C#UOdMj|(@>_PA*d_{b~qfUwV|~Y@!EaMBw4PtlwuNYLwyLBHLTM}tHXV5X&ct! zoaxP8baLMfy2Cu%IxVyu!`Qm{?sy*s=2WQlE;Su)KWCmopEp+3fEaqWwvXRld&u6S zxVS=Zdbw58rzQKjQ&l7gyc9n!6RKoe1v;OklpF^X2>$LDq8&d^RnyIUy*nGvX@84;6|d_2@uE@BN;b1v2{h*^{nk)@GW zxRSROaS!YM{@x8GM6^(CU+ea2nAAqW`s=;*w|UVsFJ8^+rI&r4)f*bZ+A(J4T#>Ss z=DuP3Ndzt6YTp`$VVb7H;h==ELEn9zRW+PW&5=_;!Vrjw5wEf$ZsO0IEaI2HHg=9b zGp_xXPJsLBs6Hf9(I9?udrzi%^c6wXg{;ur-*$1=PSUGSd@lmPJWZ@XuuP?Wra)3c zLKY}RW#9@a>A{kLsbCH6`*x}?VeFBJR5lI);0wFL# zODZn@oA5r=@;b7T2nES`F1bKusIj!1xsFgIH|(*&9>#HG<_IB)(V@XO4)Z)S6En}p z*&<1eetAhQnnUDR-+E8gFvh4dO;bvZKOT=$&T}cm1c=68X)cu= z1k@-ZOuSvTT^YFF^lHo5gVN`@l^!PSX8|;%gPqQvRq@IpkBx7BNLs&ziiHGCQdH`x z7stjH(olnTBpDy|e!tIJ6A#*zh>J*2F-w(duxrXhG7J%s6dq)C{Qr3o)lL^J_t@G! z17Z_eT3Ca&ex;}8u`8VL+)pV*O94g2qGS;oUog$6A_Wl)u^>_m=`Avd6cJRd0dFGv zKUr}S5i-{r^bm$&*w*Na6j1912p)^}0jCB=nqy&lpkQT|gD2r=p!7`OO=WHo!A_5eHh$s|=qJW|qRhbwO040|klgUNxH1ob${9TPZ>xQcgMN2n`13HO8e#t{s4slL1F)Qe4Ix$ko836J; zjpK++VTdKK`Vx8o$s(OTPS?5UrNaY#T$qsmL|Xf z0tjqQgi?xtdWkD71ac6jl!$1~`83aQh!}W?@pL-PIqinfhb7trq$^b~as9E^a0PvV ziGz#zGypGr@0qoW5&}w*qP738rA`Zqm-{i{IM&EEpSq1ZD*_S_GZ*F5d`RXY%~lzY zL1H0Mg(9N4P|gS_D#SxU$_Y!B%mq=1ND33tJgKT>2!MAHlo1g$&vOEunVCaCz`z{i z?sR`R9gg*BRd@TnnMgUOB2}dO22n8#fg>Q4TnvY3g-!tmzG?KpN#~S_$y%e{MkIm| z$`E7DG)>cdIs_!-2uN84N)7)KQ$WsIO39_TK(7U$+t{ zpGJ!ztEyMaKyz`c1yPEsS;z{FsA(LAoC_itqY_!K^Y*Km7yt{3#Q`noFmOaf5|SiD z9H}-~V&tqd06HUw4NO#`H$t-d6f3yS+CRj|M?wMCju@)%;el2hC z#>aTWOD_Jd-*)?>>%O?%BdqRY7+OTcxnNrHLYoSmR1cThYDzf~s9ABQ?WIUA7c|%_$|O@-y3{YuD(bb3(ubga0XyaO`%}BlA*;MsO4BqsU=tCo zNVLY@L6KKJ|LRwXsN-<={;yDkVc{*dQveZrptwiNQc7?o`@b|XvIj7gA|j{Lj4GFG zdb*s3{N>0mzyl)T>z%P|AbZ{N!$BA5Vhn*o$T{bdOW#Ad{|SX*tdvnTiMQL$^Q>A= z2iO*V z-=eHMY3yS#o5;YMMM{AY_O|zn-j~L`ff0R9AlhLGa`+{0Kh~jMdy+QSChGp ze_HQ6UEIGa49n%7sVwp1{^qKco zwI-Hcd~fED0j-boB;aQsFjLM2OP-PpMT;&5zbhCK zF-|XSMZ&G{2t{jcdT$9XtmRc9#Au+X+uPgec<|%jFIC4rK*^HQ9EV6meM;ln3Hl26 z=I4Im8iPk2=c-=hvLh{Pbn%oE005yCL|h!OHj3Py+=DK(OX?Oc5vv>8s61vO>FRrGB%vBDTG$b%DPy6t_+C~;^^%l zYPGY7q?Aip>W55|TVhv4hhbNWN--wNqC$!VE;9w;!_l=lXC(clry)HSg@{tboQ?*i z005MtA_b{dsyG0~1BdSKK;zRA)Xjs`^R=~_ zuaMJMJeHeS_xJbBcg0c`4A4dexlgE#h0u~N&X%~G^rFYKnB}gqwI5NlctEj~%(9T< zxZzidU@HUE*0WDU=F>EA*zHDUOmh*@l2ruYD$mz70oHTZX`W|h9L8UMsf_opIvfr; zFDsIBfeNeOlqU~odZ@xO?M^Ok@N|Sx5wOQIT4QLx^({X0>dbH%}3f zNDP;%#8jn}g^i%EqbgEzH7b{V^?w1v6%~G~)i?|Q001m>MObuWZ*6U5Zgc=cZ*6dL zWpi_BZ*CxBc_2__XJK=7b0A4=VP|P>XCOmwa&Rsx!8RTM001R)MObuXVRU6WV{&C- zbY%cCFflMKFf}bPGgL4&IyE*rGBGVMG&(RaHj=tg0000bbVXQnWMOn=I&E)cX=Zr< zGB7bPEig4LF*8&!H99pmIx#dYFf=+aFq?QPsQ>@~5p+dZbZT&AXF6kVY;SUNaA9L* z05U9fRi6L=03dWlSafP|WoJ5bVQp}1X>MmNW?^G=Z*l-Kcrq+8crh$7cri)(rnCS6 N002ovPDHLkV1mupmI43( literal 0 HcmV?d00001 diff --git a/legacy/eeze/doc/img/foot_bg.png b/legacy/eeze/doc/img/foot_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b24f3a48b4e076b88cf1e802b46087ffbb3fabd5 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^j6iJ9!3HE1Qx}DR1d4;)ofy`glX(f`uqAoByD;nl zL8a%*b^=8>3p^r=85p>QL70(Y)*K0-AbW|YuPgga7CvEi%SZD}LFVdux;TbNTu#2R zIsJTn+kYTPulo1Ll3AD;2!xfDmD#wLvj}>v&@k-CVP=T_%(cphxuXQAk-^i|&t;uc GLK6Ub>Mc;VkfoEM{Qf z76xHPhFNnYfP(BLp1!W^H+WcuRXD>A=l%i;Wq7(chG?8W+i%Esz<`6f_y7NWHH!5o z63R1{^0cb0vMSkFaE_%x<+7O{*?Xs&Ff%xKT5jO&GtAqcqoa~}b>qg&H07ky z617wnX2HUfTT*8{kPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOZ8 z6%`IG`XD&~00I3;L_t(o!^Kz8j>8}fODg_+AF{uksuh}hxC0rJP`W$mkkHl^jB%XM z>f`Y+`Dtd>`gxwMmr`2KIk$cshdiH8N#}XW6$o}5WA?p%5)sKc%eHO9fR!#HlFUqU z&XQ6Z1~3DUmCHm#rjx?$lu|lm24QA+Eh4g2CJ}X<;QbGo;J_$CohD|s1Tu}z3KIrH zRtpQ8-Z|UyQP4caCB~&Z3QG0mMzcQLYIcQ!(sFW-xf9knF@|(?iY~XAOhHzd%#8OD2m>x}XSSsVf@;^obfpX48<@ZgFF$M4@xtjbM#B=Ojp!9yfFNKXj22K7STvD?00000NkvXXu0mjfB76)l literal 0 HcmV?d00001 diff --git a/legacy/eeze/doc/img/header_menu_current_background.png b/legacy/eeze/doc/img/header_menu_current_background.png new file mode 100644 index 0000000000000000000000000000000000000000..de97c9268e4ac68310c8b92d6ab6bd8a245611da GIT binary patch literal 1200 zcmV;h1W)^kP)002J-1^@s6XaB>y00001b5ch_0Itp) z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RT3Fc5TrKj#zpOzs?z2=A0p@aw&u*pMn|G)ug+?Vh;0+zHe5dVLoF=!DBW&zJ?E zp99|S_j0@4%Io#|xG+sqdB5NP{rn5Cj%O+78UIn|DpKcsK9>`B2V6JsOB3oD&r;4a z{-e%Sw9ela{A&{jdu5*U-Tgr1~ zQc-ZvZCmQQrCnTG+COg8zWQ3Lv1sjNIKQPlR|Xsq_}(oT0MbDS91lPg3>xeBFKokrh3I+f~!N36>5GNtP zFb=56FWNP#oK=?bNEQ~!rtXW9X1GX=k~FL`OjOeF$R)LGB-wAZi(5xddgID^{pUl5 z$!2zVWE!iC5c%CAFL=jfl{TW1M$7Wjcr9z}SyPKmlC20r0B}G6Q80PClsJ^eQ9Rdb zuHflIJ5saoBdvW)J5o7`LrQ$sb0li*FS@pt^@$vLe#kJ^<1ntHwKLacEE8!V_VYY{ z^jk0Fa-9o0ILfhhgnDcg*`~%yk#UNgFLkMLQ1xp&>oHLMt>=krgKLZ9aoj&)eVyWk z+VI9yb#%knV zBgOT1iW^1q->g9a$6utrxv^4Ql-s5#yS%xS5>LwpJyaYZ1w-06F426k%%gi2p;YTL zn*Zi$*TU&q<}Gq{z5F%GPa}Dt9$}k233)sorIb>h&nNZ+VE-)`LNtIN1b_p=0f8Pk zSwvore6GJZg3A%uh&UU`%8A$z3ApNcvGym`^9BW5y;mkO7OVYaI#wj=im2;bzSt*w z8j*3rXhhk-tiA%ik?Y6P7yM_$}>d^Cl%aa8a!%A!J=gv)gqCjA%RAmjShY zk&jin$jBj)wrhPzE#o_v^@kLW;DnK~k;Uxogc+{8mlL+=3tKP%4hR4$2Lynj z95C}RO)LJ$<@I?2i7h|tH#%lcU&}tk-(ol0<1_foFDdWsgqjV%=7cRA;M<%KLNw4f z2!R6vT{&RuTk7799C>JZ4;!>{ThW;;ZOYD_SA%VO2ZR&C3B68;Eg1NXEf@e0gaF^` zfS#=57JO;X{zkCF($|*uL^8|wn48N;fkQ7R9I3CpA0+QRH%LYRy5b)R!`g7p731Il O0000002J-1^@s6XaB>y00001b5ch_0Itp) z=>Px#24YJ`L;wH)0002_L%V+f000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iOZ6 z5FZU~yaYY~00q2BL_t(|+U;H2a;q>5blUuRzqvD+7VvpFWE>%_)?7k5*?npguqAmd z8(5Uf*Vk7qf^ZV9(=;gx!g&NNrIcY9%E!ltq9Ht=fVI{#3`4nIuZo7C3@E%I0mpGH z+6xLIpzyv+um~ueb`dgXz*=j$TrP@=0TUO+Zl@)sQ3vT-lF8GjhNS)Y)Np5NBKI{~L@T3m#*2iTKp zt@p;JX@cbN4E2Ix|BjCFg536j+O}xz_u6Q`^V-S$v$poy&cxQ*Y0r;rMq}sMi^c@` z(Y9kbHGfVm!D!}MMH6RQOQ=PVd8HOe5K@dz0av&_)W-mG0@FVnX-$jszG6Cpd6iG4)S zD4R33W^wegr6p&!^ui1{3`424F0w(E#-nu32HZMgjcogm$jB1kn}usg#Vp4?lQGIP zmJDq6inbT557~swV%+wP_%pYAzYQ~vV>tL(hik9?P_~PVkL=oF50e?tN^s;oR77r% zlT|&VC}Ga0&tEJ%k7- zoJv4FMiNe2g8%YGh@d4{5VmDN2~q_u!NU6zP)o2N0s>_EwNi4;;4^G#zyC`L>8-YI zIsZ<;Sq-zMv%STs5t%X@*w0xZXGHX=S58L)URT4u^Pb?4-gC!@j zGZO+Nz0VPNkPS1cMpr9pK zPzLm{wVGyxy%obpDUi2TLEY1CBu?G4a_w4M*7W_50a2rjQkgL}dUVxOnilo5_XJ|? z^0b6KgUQ;2DyO!8Gi7vpi4|3GMVi2@-Nh0d2`yX4qE34Ty0;9h7ucR!#o2^lg6|D> zq>N@KDl1M!v148j=!p*!BwK!Xg({IeZ9%}cIAvzMSJ)Ae5UHkn2oMDWN!z_bn~X9f z@-5QES=A0wM|(C$1t(DkMz$~$G8#J+SMOZ5Dyv8A`w~27zqUXna*hph7O3bmD~Gp^ z*;fa=*%<}bla(WZrnkg+@^mC+kFs@kF8aj)Hk+cY4=Q!sYBVE3usz00Cd{g}$bgX+ zEs`2}PM|AlPwbhc>#U3~dKV?KArhvt%U4th9!;L?oeXA`K|g&EO%g=b=rg7ws`Z0W zfG^}&b8$*k*B4={a+xJocKjaIK(oCqTOT@;wzHCX)@Jr%Fnd8LdMj})ftln4_kht_ z?hOuGQ#w0_X^UxNi{yO`dG|z5aq*tmGIh6m-ucZ4$E=q33^;eTcR-I+1i!M{_!a$H z+wPGv{WJp#!l6$>RG?fqm4Ls$zapS;ZU)p6ES#PJ^<&F|2q=hvg78!V{`~xifWmnM uoCT@+p&H=~TxzX#9LMtc`Kf3KPscx4r4cOw-wj9r0000c73e^-^QHU$G0h_3|cuDljd5QbT#Je?6pNPP^G($^aTorE>q=yral%n2Rktlk|u< zB6SbBG`&ZF=tG%tj9|RLw-;=+A0K(VYgY{_m@_Mu;#9$;A9&jo($nUG3m{pPG9sKJ z)-SrEJ!oZpgRkTbv#N2w?Avv1g`*hj3@X!Cn+Jh2Ml;^V7@mz6b|Fo-YFT&Oc=qw1 z@}>V_jJMQ>kyo}tc5CX?e65}5iLW`a*?=JPI$Jx)*JdpOpdFk$7LNZlSowU@cr#Mjx)>#Vh2qRYMG@4%U~V=*(;bxq6%o;REM)$>G`C7nd~m&p*#P>~ zXHur`Yquq~Y&12(1U{S4izUj!VqeX6#jVc9i4wfL*s)~-o}QjXMEK_BCOa2bR1e|w zfOiwc9TpT4;xRu`3f2tu^&xUXTv-ZkyvdBZz~6YF9A*}l+0tzM1w6ihdTKaGCcM-b zM}+kR##h<)t_vDPGSvAu;zhryW3SGaF8dM)M|gO64tMi+Iy@ydmbFeUae-c2{QNoG z(9m#bJ|Lb-MPIsvICAtT6Qr%J&FlJgLwoz<%m(`4rx$N)fyA(+zm0CXPABZ`Y;G;L z{_bdyy$#F#KH(XXsO3Jb1Q#zc1fq{*U zjYV~JP>U?NSCL2Ad=K{iTFJ6FGWAV|A0&YtJIM(N3JQvei!+~p$aC|>Dl6&yL|#Xg zIX+2Weg&eas2K77JvQjh9i*O~D5!_YojcEE+(AXktE#$w{w%LP_%H5M=b04kBWh}D zxc2O9VLyNW)gECtF*P+|5T~J=o2apg$$#_(d-_h^TCnHtq71c!2zRWxWDpjn!_UuO zcWv<0kxLtcNl8iN)zxTQTLC2}o9m(byTL;$JWs}{A3oS^ZEvS;Z{E>Cp-_rSN|AlCExY6x%V{lP3aGQ&Z}<7hzfQ zF07zj10`OsC@iK}tTCCaB&2|+E-(9l0(Hy>@X!C-*+HtR-ujI2c$AdYyXh^~)F4Il zzzMlLC8a)YPnWbhjIFPa%gD$GmE?PCduwZ^?eCPKudkxBi;LOH8N8LwW`;LSS$4%) zx?ENsdRA0Kgd_bexl4mJQOGB;;>g}!^1**?gy$7$wPR|Ei zVs8!%jpMNr88)kWN^?ogde$9cWo2b)X&FJ2;y!k)F9OgLp&JTI(cO{q^YfcwF#H{j z%mHD&8k`>k(lj9Q-C;Og+VS&=mg%exwn**okO~FI#6R7i^cR~amJZy`{L_nl_Uzd# zP+riFoNM<}Q<iF240XUkipnh)?rRKXHCsH%<~~eP9Nw zkqau%sz*Z!{@*$FcNP?o@?cZr%EaUjMedC|I-tV!fV+9RVQ_4jZKfCbIfH;Kg45E_jJnnwJDq^pApCdwVgPKmHB z!=6@FPNzCr)C6drgvA1wG8MJ9x;!~AS&DhwVSc;3B#qv%<6L7Hx)0{h+mg+0 z0jqK$SZNPm{q3QtspPPKfBq{eiS~+YJS!pb6?`OSoRqamr_%>N_q^qN00y+O`IQf2 z+ONq@jb3~&ch@XXS3^S)t+$ts^fgp^l*D2hS>*bVDk_42(C2Bz#jeZyq=~0Iw_8tY z=KJ_03RcSYhZI2ZA^5$2n^Z zhKHkI8AsB4C}Cb-U2XZaezlWJK@9Yhu?X!asz+tBKS$Zr%IdX3`!1>nqM47)$jG={ z6Hw*j?B(e@8paOM)YQD_>MGBrf)C%jMf%)G{A_Ab!GaWc-rAa)nHj@)ozmsgEFfWL zXIE5Pd(7NL^`S8bMGS3ZguyK+PiESq78xme#+H`U#qGE0lGfJNvkkwHO>4CJD>xwo z1A{jM11ylm>2^1Vo*e(Pl1LDQ5Ws)HygDLK6i)xZ|&>dfsOPKeXm+M(}+hAe4X z6^(1_>#6teN95%pc2{4Es^8g=`ug?jBeWA}$-@!V(E(v)V{=!8L18fV@bGXsTtjrf znx^KxYlUG#U=E@&U;>bLx5xnj0W$+?(|PNsIb8382bo;|XlLL`xUQxqTtr0V=kjuF zbF&(t;zeg?&f;NqvRMLSa&mHZZZ58_PO-bU7l}ggM@B{}!jl?)gFFKHeR&Zq0D+2% zretIY!nj${CML!8^?U#T%DQSrV~56cXy{^gjJZ5-NJt2yBl4*FtzUx9&dx=n^A{Z* z<3>hoGP1Hd>2zVBB+57`HanY674K}2^S*xF8jnx@@#E^^RNIN1oSaWB#cMgJ*Otw*rB&I6XkW|M$G6uvyt`6=4Q|K`kZ_71o=n5$YD92 zJ{1C@Q+zl8Tt!rSyB;@d6scf;|L*S2Lai5x)ZLRPtfZ|?1=~Oy8x#I6Pp+)3br$G^ z42_NbX`h$s5(7DsmzRH{J7@@G0_>a>lRU=kBQ^b#^fF9~Kp@mz9e@J|CF~Z; z=i}oO1g5^dRdnUai@D1~BN_7E-_c)hH&#LIcW)}f^hZ^u!v4CB{}Fsm_VV)Tm@5qD zjdcf6#)5f&1{ecDqyO64P9`KI#K*@&x)g(!n&@@JQ3+sRI=q{XKyeVzcDKRmK@VQGJz^%tG zO*DH_jWQ#&1@Sat zu45x^o;XwQrjLI%y5Cr6|6eo|$`MN}mI6S}%?;gTi+K0Wd__BDY6`#c=MU}03j`ox z^qWHiar!iqj*br68Cc1Nu2gRuM_H0oc5HR5WMzw#YBJ+Wsm%9p=9#t=@;89dymqau zKP+D>F!{yAmoIV_{<5;N^>;SCQP(Ui607kFI%@i(8yU7p?}*InZkocy4qt5dWs-8? zfgi_Qz*j9%K=LhN|IXK+Sz20ZXd>1-)p-pgacy +dnl That code is public domain and can be freely used or copied. + +dnl Macro that check if doxygen is available or not. + +dnl EFL_CHECK_DOXYGEN([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl Test for the doxygen program +dnl Defines efl_doxygen +dnl Defines the automake conditionnal EFL_BUILD_DOC +dnl +AC_DEFUN([EFL_CHECK_DOXYGEN], +[ + +dnl +dnl Disable the build of the documentation +dnl +AC_ARG_ENABLE([doc], + [AC_HELP_STRING( + [--disable-doc], + [Disable documentation build @<:@default=enabled@:>@])], + [ + if test "x${enableval}" = "xyes" ; then + efl_enable_doc="yes" + else + efl_enable_doc="no" + fi + ], + [efl_enable_doc="yes"]) + +AC_MSG_CHECKING([whether to build documentation]) +AC_MSG_RESULT([${efl_enable_doc}]) + +if test "x${efl_enable_doc}" = "xyes" ; then + +dnl +dnl Specify the file name, without path +dnl + + efl_doxygen="doxygen" + + AC_ARG_WITH([doxygen], + [AC_HELP_STRING( + [--with-doxygen=FILE], + [doxygen program to use @<:@default=doxygen@:>@])], +dnl +dnl Check the given doxygen program. +dnl + [efl_doxygen=${withval} + AC_CHECK_PROG([efl_have_doxygen], + [${efl_doxygen}], + [yes], + [no]) + if test "x${efl_have_doxygen}" = "xno" ; then + echo "WARNING:" + echo "The doxygen program you specified:" + echo "${efl_doxygen}" + echo "was not found. Please check the path and make sure " + echo "the program exists and is executable." + AC_MSG_WARN([no doxygen detected. Documentation will not be built]) + fi + ], + [AC_CHECK_PROG([efl_have_doxygen], + [${efl_doxygen}], + [yes], + [no]) + if test "x${efl_have_doxygen}" = "xno" ; then + echo "WARNING:" + echo "The doxygen program was not found in your execute path." + echo "You may have doxygen installed somewhere not covered by your path." + echo "" + echo "If this is the case make sure you have the packages installed, AND" + echo "that the doxygen program is in your execute path (see your" + echo "shell manual page on setting the \$PATH environment variable), OR" + echo "alternatively, specify the program to use with --with-doxygen." + AC_MSG_WARN([no doxygen detected. Documentation will not be built]) + fi + ]) +fi + +dnl +dnl Substitution +dnl +AC_SUBST([efl_doxygen]) + +if ! test "x${efl_have_doxygen}" = "xyes" ; then + efl_enable_doc="no" +fi + +AM_CONDITIONAL(EFL_BUILD_DOC, test "x${efl_enable_doc}" = "xyes") + +if test "x${efl_enable_doc}" = "xyes" ; then + m4_default([$1], [:]) +else + m4_default([$2], [:]) +fi + +]) + +dnl End of doxygen.m4 diff --git a/legacy/eeze/src/Makefile.am b/legacy/eeze/src/Makefile.am new file mode 100644 index 0000000000..97baf85931 --- /dev/null +++ b/legacy/eeze/src/Makefile.am @@ -0,0 +1,2 @@ +MAINTAINERCLEANFILES = Makefile.in +SUBDIRS = lib bin diff --git a/legacy/eeze/src/bin/Makefile.am b/legacy/eeze/src/bin/Makefile.am new file mode 100644 index 0000000000..b328ad00b1 --- /dev/null +++ b/legacy/eeze/src/bin/Makefile.am @@ -0,0 +1,21 @@ +MAINTAINERCLEANFILES = Makefile.in + +EEZE_CPPFLAGS = \ +-I$(top_srcdir)/src/lib/udev \ +@ECORE_CFLAGS@ + +LIBS = \ +@ECORE_LIBS@ + +if BUILD_EUDEV +EUDEV_PROG = eeze_udev_test +endif + +bin_PROGRAMS = \ +$(EUDEV_PROG) + +if BUILD_EUDEV +eeze_udev_test_SOURCES = eeze_udev_test.c +eeze_udev_test_CPPFLAGS = $(EEZE_CPPFLAGS) +eeze_udev_test_LDADD = $(top_builddir)/src/lib/udev/libeudev.la +endif diff --git a/legacy/eeze/src/bin/eeze_udev_test.c b/legacy/eeze/src/bin/eeze_udev_test.c new file mode 100644 index 0000000000..41e17a5720 --- /dev/null +++ b/legacy/eeze/src/bin/eeze_udev_test.c @@ -0,0 +1,162 @@ +#include +#include +#include + +typedef struct kbdmouse +{ + Eina_List *kbds; + Eina_List *mice; + Eina_Hash *hash; +} kbdmouse; + +static void +/* event will always be a syspath starting with /sys */ +catch_events(const char *event, void *data, Eudev_Watch *watch) +{ + kbdmouse *akbdmouse = data; + Eina_List *l; + const char *name, *dev, *type; + int new = 0; + + /* the event that comes through will be prefixed by "/sys" + * but the saved name will not, so we check for the saved name + * inside the event name + */ + EINA_LIST_FOREACH(akbdmouse->kbds, l, name) + if (strstr(event, name)) goto end; + EINA_LIST_FOREACH(akbdmouse->mice, l, name) + if (strstr(event, name)) goto end; + + /* check to see if the device was just plugged in */ + if (e_udev_syspath_is_kbd(event) || e_udev_syspath_is_mouse(event)) + { + new = 1; + goto end; + } + /* if we reach here, the event is neither a keyboard nor a mouse that we saw + * previously, so we print a moderately amusing message and bail + */ + printf("Sneaky sneaky! But %s is not a keyboard or a mouse!!\n", event); + return; + +end: + /* we stored the devpaths for all the syspaths previously so that + * we can retrieve them now even though the device has been removed and + * is inaccessible to udev + */ + if (new) + { + dev = e_udev_syspath_get_devpath(event); + type = "plugged in"; + } + else + { + dev = eina_hash_find(akbdmouse->hash, name); + type = "unplugged"; + } + printf("You %s %s!\n", type, dev); + printf("All tests completed, exiting successfully!\n"); + /* now we free the lists */ + eina_list_free(akbdmouse->kbds); + eina_list_free(akbdmouse->mice); + /* and the hash */ + eina_hash_free(akbdmouse->hash); + /* and the random storage struct */ + free(akbdmouse); + /* and quit the main loop */ + ecore_main_loop_quit(); + /* and delete the watch */ + e_udev_watch_del(watch); + /* and shut down eudev */ + e_udev_shutdown(); +} + +static void +hash_free(void *data) +{ + eina_stringshare_del(data); +} + +int main() +{ + Eina_List *type, *l; + const char *name, *check; + kbdmouse *akbdmouse; + Eina_Hash *hash; + + ecore_init(); + e_udev_init(); + + hash = eina_hash_stringshared_new(hash_free); + akbdmouse = malloc(sizeof(kbdmouse)); + akbdmouse->hash = hash; + + printf("For my first trick, I will find all of your keyboards and return their syspaths.\n"); + /* find all keyboards using type EUDEV_TYPE_KEYBOARD */ + type = e_udev_find_by_type(EUDEV_TYPE_KEYBOARD, NULL); + EINA_LIST_FOREACH(type, l, name) + { /* add the devpath to the hash for use in the cb later */ + eina_hash_direct_add(hash, name, e_udev_syspath_get_devpath(name)); + printf("Found keyboard: %s\n", name); + } + /* we save this list for later, because once a device is unplugged it can + * no longer be detected by udev, and any related properties are unusable unless + * they have been previously stored + */ + akbdmouse->kbds = type; + + printf("\nNext, I will find all of your mice and print the corresponding manufacturer.\n"); + /* find all mice using type EUDEV_TYPE_MOUSE */ + type = e_udev_find_by_type(EUDEV_TYPE_MOUSE, NULL); + EINA_LIST_FOREACH(type, l, name) + { /* add the devpath to the hash for use in the cb later */ + eina_hash_direct_add(hash, name, e_udev_syspath_get_devpath(name)); /* get a property using the device's syspath */ + printf("Found mouse %s with vendor: %s\n", name, e_udev_syspath_get_property(name, "ID_VENDOR")); + } + /* we save this list for later, because once a device is unplugged it can + * no longer be detected by udev, and any related properties are unusable unless + * they have been previously stored + */ + akbdmouse->mice = type; + + printf("\nNow let's try something a little more difficult. Mountable filesystems!\n"); + /* find all mountable drives using type EUDEV_TYPE_DRIVE_MOUNTABLE */ + type = e_udev_find_by_type(EUDEV_TYPE_DRIVE_MOUNTABLE, NULL); + EINA_LIST_FOREACH(type, l, name) + { + printf("Found device: %s\n", name); /* get a property using the device's syspath */ + printf("\tYou probably know it better as %s\n", e_udev_syspath_get_property(name, "DEVNAME")); + printf("\tIt's formatted as %s", e_udev_syspath_get_property(name, "ID_FS_TYPE")); + check = e_udev_syspath_get_property(name, "FSTAB_DIR"); + if (check) + printf(", and gets mounted at %s", check); + printf("!\n"); + } + eina_list_free(type); + + printf("\nInternal drives, anyone? With serial numbers?\n"); + /* find all internal drives using type EUDEV_TYPE_DRIVE_INTERNAL */ + type = e_udev_find_by_type(EUDEV_TYPE_DRIVE_INTERNAL, NULL); + EINA_LIST_FOREACH(type, l, name) /* get a property using the device's syspath */ + printf("%s: %s\n", name, e_udev_syspath_get_property(name, "ID_SERIAL")); + eina_list_free(type); + + printf("\nGot any removables? I'm gonna find em!\n"); + /* find all removable media using type EUDEV_TYPE_DRIVE_REMOVABLE */ + type = e_udev_find_by_type(EUDEV_TYPE_DRIVE_REMOVABLE, NULL); + EINA_LIST_FOREACH(type, l, name) /* get a property using the device's syspath */ + printf("\tOoh, a %s attached on your %s bus!\n", e_udev_syspath_get_property(name, "ID_MODEL"), + e_udev_syspath_get_property(name, "ID_BUS")); + eina_list_free(type); + + + /* set a udev watch, grab all events because no EUDEV_TYPE filter is specified, + * set the events to be sent to callback function catch_events(), and attach + * kbdmouse to the watch as associated data + */ + e_udev_watch_add(EUDEV_TYPE_NONE, catch_events, akbdmouse); + printf("\nAnd now for something more complicated. Plug or unplug your keyboard or mouse for me.\n"); + + /* main loop must be started to use ecore fd polling */ + ecore_main_loop_begin(); +} diff --git a/legacy/eeze/src/lib/Makefile.am b/legacy/eeze/src/lib/Makefile.am new file mode 100644 index 0000000000..240797d51d --- /dev/null +++ b/legacy/eeze/src/lib/Makefile.am @@ -0,0 +1,2 @@ +MAINTAINERCLEANFILES = Makefile.in +SUBDIRS=udev diff --git a/legacy/eeze/src/lib/udev/E_Udev.h b/legacy/eeze/src/lib/udev/E_Udev.h new file mode 100644 index 0000000000..0c3ea23efd --- /dev/null +++ b/legacy/eeze/src/lib/udev/E_Udev.h @@ -0,0 +1,137 @@ +#ifndef E_UDEV_H +#define E_UDEV_H + +#include +#include + +#ifdef EAPI +#undef EAPI +#endif +#ifdef _MSC_VER +#error "This will not run on windows!" +#else +# ifdef __GNUC__ +# if __GNUC__ >= 4 +# define EAPI __attribute__ ((visibility("default"))) +# else +# define EAPI +# endif +# else +# define EAPI +# endif +#endif + +/** + * @defgroup Subsystem_Types Subsystem_Types + * + * ac97 + * acpi + * bdi + * block + * bsg + * dmi + * graphics + * hid + * hwmon + * i2c + * input + * mem + * misc + * net + * pci + * pci_bus + * pci_express + * platform + * pnp + * rtc + * scsi + * scsi_device + * scsi_disk + * scsi_generic + * scsi_host + * serio + * sound + * thermal + * tty + * usb + * usb_device + * vc + * vtconsole + * + * @ingroup udev + */ + +/** + * @defgroup Device_Types Device_Types + * + * atapi + * audio + * block + * cd + * char + * disk + * floppy + * generic + * hid + * hub + * media + * optical + * printer + * rbc + * scsi + * storage + * tape + * video + * + * @ingroup udev + */ + +/*FIXME: these probably need to be bitmasks with categories*/ +typedef enum +{ + EUDEV_TYPE_NONE, + EUDEV_TYPE_KEYBOARD, + EUDEV_TYPE_MOUSE, + EUDEV_TYPE_TOUCHPAD, + EUDEV_TYPE_DRIVE_MOUNTABLE, + EUDEV_TYPE_DRIVE_INTERNAL, + EUDEV_TYPE_DRIVE_REMOVABLE, + EUDEV_TYPE_DRIVE_CDROM, + EUDEV_TYPE_POWER_AC, + EUDEV_TYPE_POWER_BAT +/* EUDEV_TYPE_ANDROID */ +} Eudev_Type; + +struct Eudev_Watch; +typedef struct Eudev_Watch Eudev_Watch; + +#ifdef __cplusplus +extern "C" { +#endif + + EAPI int e_udev_init(void); + EAPI int e_udev_shutdown(void); + + EAPI Eina_List *e_udev_find_by_type(const Eudev_Type type, const char *name); + EAPI Eina_List *e_udev_find_by_filter(const char *subsystem, const char *type, const char *name); + + EAPI const char *e_udev_syspath_rootdev_get(const char *syspath); + EAPI const char *e_udev_syspath_get_devpath(const char *syspath); + EAPI const char *e_udev_syspath_get_subsystem(const char *syspath); + EAPI const char *e_udev_syspath_get_property(const char *syspath, const char *property); + + EAPI const char *e_udev_devpath_get_syspath(const char *devpath); + EAPI const char *e_udev_devpath_get_subsystem(const char *devpath); + + EAPI Eina_Bool e_udev_syspath_is_mouse(const char *syspath); + EAPI Eina_Bool e_udev_syspath_is_kbd(const char *syspath); + EAPI Eina_Bool e_udev_syspath_is_touchpad(const char *syspath); + + EAPI Eudev_Watch *e_udev_watch_add(Eudev_Type type, void(*func)(const char *, void *, Eudev_Watch *), void *user_data); + EAPI void *e_udev_watch_del(Eudev_Watch *watch); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/legacy/eeze/src/lib/udev/Makefile.am b/legacy/eeze/src/lib/udev/Makefile.am new file mode 100644 index 0000000000..dccca18099 --- /dev/null +++ b/legacy/eeze/src/lib/udev/Makefile.am @@ -0,0 +1,21 @@ +MAINTAINERCLEANFILES = Makefile.in + +AM_CPPFLAGS = @ECORE_CFLAGS@ + +if BUILD_EUDEV + +lib_LTLIBRARIES = libeudev.la +include_HEADERS = E_Udev.h + +noinst_HEADERS = e_udev_private.h + +libeudev_la_SOURCES = \ +E_Udev.h \ +e_udev.c \ +e_udev_watch.c \ +e_udev_main.c + +libeudev_la_LIBADD = @ECORE_LIBS@ @UDEV_LIBS@ +libeudev_la_LDFLAGS = -no-undefined -version-info @version_info@ @eudev_release_info@ + +endif diff --git a/legacy/eeze/src/lib/udev/e_udev.c b/legacy/eeze/src/lib/udev/e_udev.c new file mode 100644 index 0000000000..ef536f33d2 --- /dev/null +++ b/legacy/eeze/src/lib/udev/e_udev.c @@ -0,0 +1,513 @@ +#include +#include "e_udev_private.h" + +/** + * @defgroup udev udev + * + * These are functions which interact directly with udev. + */ + +/** + * Find the root device of a device from its syspath. + * + * @param syspath The syspath of a device, with or without "/sys/" + * @return The syspath of the parent device + * + * Return a syspath (/sys/$syspath) for the parent device. + * + * @ingroup udev + */ +EAPI const char * +e_udev_syspath_rootdev_get(const char *syspath) +{ + struct udev *udev; + struct udev_device *device, *parent; + const char *ret; + + if (!syspath) return NULL; + + udev = udev_new(); + if (!udev) return NULL; + + device = udev_device_new_from_syspath(udev, syspath); + parent = udev_device_get_parent(device); + ret = eina_stringshare_add(udev_device_get_property_value(parent, "DEVPATH")); + + udev_device_unref(device); + udev_unref(udev); + + return ret; +} + +/** + * Find devices using a EUDEV_TYPE_* and/or a name. + * + * @param type A Eudev_Type or 0 + * @param name A filter for the device name or NULL + * @return A Eina_List* of matched devices or NULL on failure + * + * Return a list of syspaths (/sys/$syspath) for matching udev devices. + * + * @ingroup udev + */ +EAPI Eina_List * +e_udev_find_by_type(const Eudev_Type etype, const char *name) +{ + struct udev *udev; + struct udev_enumerate *en; + struct udev_list_entry *devs, *cur; + struct udev_device *device, *parent; + const char *sysname, *devname; + Eina_List *ret = NULL; + + if (!etype && !name) return NULL; + + udev = udev_new(); + if (!udev) return NULL; + en = udev_enumerate_new(udev); + if (!en) return NULL; + + switch (etype) + { + case EUDEV_TYPE_NONE: + break; + case EUDEV_TYPE_KEYBOARD: + udev_enumerate_add_match_subsystem(en, "input"); + udev_enumerate_add_match_property(en, "ID_INPUT_KEYBOARD", "1"); + break; + case EUDEV_TYPE_MOUSE: + udev_enumerate_add_match_subsystem(en, "input"); + udev_enumerate_add_match_property(en, "ID_INPUT_MOUSE", "1"); + break; + case EUDEV_TYPE_TOUCHPAD: + udev_enumerate_add_match_subsystem(en, "input"); + udev_enumerate_add_match_property(en, "ID_INPUT_TOUCHPAD", "1"); + break; + case EUDEV_TYPE_DRIVE_MOUNTABLE: + udev_enumerate_add_match_subsystem(en, "block"); + udev_enumerate_add_match_property(en, "ID_FS_USAGE", "filesystem"); + udev_enumerate_add_nomatch_sysattr(en, "capability", "52"); + break; + case EUDEV_TYPE_DRIVE_INTERNAL: + udev_enumerate_add_match_subsystem(en, "block"); + udev_enumerate_add_match_property(en, "ID_TYPE", "disk"); + udev_enumerate_add_match_property(en, "ID_BUS", "ata"); + udev_enumerate_add_match_sysattr(en, "removable", "0"); + break; + case EUDEV_TYPE_DRIVE_REMOVABLE: + udev_enumerate_add_match_subsystem(en, "block"); + udev_enumerate_add_match_property(en, "ID_TYPE", "disk"); + udev_enumerate_add_match_sysattr(en, "removable", "1"); + break; + case EUDEV_TYPE_DRIVE_CDROM: + udev_enumerate_add_match_subsystem(en, "block"); + udev_enumerate_add_match_property(en, "ID_CDROM", "1"); + break; + case EUDEV_TYPE_POWER_AC: + udev_enumerate_add_match_subsystem(en, "power_supply"); + udev_enumerate_add_match_property(en, "POWER_SUPPLY_TYPE", "Mains"); + break; + case EUDEV_TYPE_POWER_BAT: + udev_enumerate_add_match_subsystem(en, "power_supply"); + udev_enumerate_add_match_property(en, "POWER_SUPPLY_TYPE", "Battery"); + break; +/* + case EUDEV_TYPE_ANDROID: + udev_enumerate_add_match_subsystem(en, "block"); + udev_enumerate_add_match_property(en, "ID_MODEL", "Android_*"); + break; +*/ + default: + break; + } + udev_enumerate_scan_devices(en); + devs = udev_enumerate_get_list_entry(en); + + udev_list_entry_foreach(cur, devs) + { + devname = udev_list_entry_get_name(cur); + device = udev_device_new_from_syspath(udev, devname); + + if (name) + if (!strstr(sysname,name)) + goto out; + + ret = eina_list_append(ret, eina_stringshare_add(udev_device_get_property_value(device, "DEVPATH"))); + +out: + udev_device_unref(device); + } + udev_enumerate_unref(en); + udev_unref(udev); + + return ret; +} + +/** + * A more advanced find, allows finds using udev properties. + * + * @param subsystem The udev subsystem to filter by, or NULL + * @param type "ID_INPUT_KEY", "ID_INPUT_MOUSE", "ID_INPUT_TOUCHPAD", NULL, etc + * @param name A filter for the device name, or NULL + * @return A Eina_List* of matched devices or NULL on failure + * + * Return a list of syspaths (/sys/$syspath) for matching udev devices. + * Requires at least one filter. + * + * @ingroup udev + */ +EAPI Eina_List * +e_udev_find_by_filter(const char *subsystem, const char *type, const char *name) +{ + struct udev *udev; + struct udev_enumerate *en; + struct udev_list_entry *devs, *cur; + struct udev_device *device, *parent; + const char *sysname, *id_type, *devname; + Eina_List *ret = NULL; + + if (!subsystem && !type && !name) return NULL; + + udev = udev_new(); + if (!udev) return NULL; + en = udev_enumerate_new(udev); + if (!en) return NULL; + + if (subsystem) + udev_enumerate_add_match_subsystem(en, subsystem); + + udev_enumerate_add_match_property(en, type, "1"); + udev_enumerate_scan_devices(en); + devs = udev_enumerate_get_list_entry(en); + + udev_list_entry_foreach(cur, devs) + { + devname = udev_list_entry_get_name(cur); + device = udev_device_new_from_syspath(udev, devname); + + if (name) + if (!strstr(sysname,name)) + goto out; + + ret = eina_list_append(ret, eina_stringshare_add(udev_device_get_property_value(device, "DEVPATH"))); + +out: + udev_device_unref(device); + } + udev_enumerate_unref(en); + udev_unref(udev); + + return ret; +} + + +/** + * Get the /dev/ path from the /sys/ path. + * + * @param syspath The /sys/ path with or without the /sys/ + * @return A const char* with the /dev/ path or NULL on failure + * + * Takes /sys/$PATH and turns it into the corresponding "/dev/x/y". + * + * @ingroup udev + */ +EAPI const char * +e_udev_syspath_get_devpath(const char *syspath) +{ + struct udev *udev; + struct udev_device *device; + const char *name; + Eina_Strbuf *sbuf; + + if (!syspath) return NULL; + udev = udev_new(); + if (!udev) return NULL; + + sbuf = eina_strbuf_new(); + if (!strstr(syspath, "/sys/")) + eina_strbuf_append(sbuf, "/sys/"); + eina_strbuf_append(sbuf, syspath); + + device = udev_device_new_from_syspath(udev, eina_strbuf_string_get(sbuf)); + name = eina_stringshare_add(udev_device_get_property_value(device, "DEVNAME")); + + udev_device_unref(device); + udev_unref(udev); + eina_strbuf_free(sbuf); + + return name; +} + +/** + * Get the subsystem of a device from the /sys/ path. + * + * @param syspath The /sys/ path with or without the /sys/ + * @return A const char* with the subsystem of the device or NULL on failure + * + * Takes /sys/$PATH and returns the corresponding device subsystem, + * such as "input" for keyboards/mice. + * + * @ingroup udev + */ +EAPI const char * +e_udev_syspath_get_subsystem(const char *syspath) +{ + struct udev *udev; + struct udev_device *device; + const char *subsystem; + Eina_Strbuf *sbuf; + + if (!syspath) return NULL; + udev = udev_new(); + if (!udev) return NULL; + + sbuf = eina_strbuf_new(); + if (!strstr(syspath, "/sys/")) + eina_strbuf_append(sbuf, "/sys/"); + eina_strbuf_append(sbuf, syspath); + + device = udev_device_new_from_syspath(udev, eina_strbuf_string_get(sbuf)); + subsystem = eina_stringshare_add(udev_device_get_property_value(device, "SUBSYSTEM")); + + udev_device_unref(device); + udev_unref(udev); + eina_strbuf_free(sbuf); + + return subsystem; +} + +/** + * Get the property value of a device from the /sys/ path. + * + * @param syspath The /sys/ path with or without the /sys/ + * @param property The property to get; full list of these is a FIXME + * @return A const char* with the subsystem of the device or NULL on failure + * + * Takes /sys/$PATH and returns the corresponding device subsystem, + * such as "input" for keyboards/mice. + * + * @ingroup udev + */ +EAPI const char * +e_udev_syspath_get_property(const char *syspath, const char *property) +{ + struct udev *udev; + struct udev_device *device; + const char *value; + Eina_Strbuf *sbuf; + + if (!syspath) return NULL; + udev = udev_new(); + if (!udev) return NULL; + + sbuf = eina_strbuf_new(); + if (!strstr(syspath, "/sys/")) + eina_strbuf_append(sbuf, "/sys/"); + eina_strbuf_append(sbuf, syspath); + + device = udev_device_new_from_syspath(udev, eina_strbuf_string_get(sbuf)); + value = eina_stringshare_add(udev_device_get_property_value(device, property)); + + udev_device_unref(device); + udev_unref(udev); + eina_strbuf_free(sbuf); + + return value; +} + +/** + * Get the syspath of a device from the /dev/ path. + * + * @param devpath The /dev/ path of the device + * @return A const char* which corresponds to the /sys/ path of the device or NULL on failure + * + * Takes "/dev/path" and returns the corresponding /sys/ path (without the "/sys/") + * + * @ingroup udev + */ +EAPI const char * +e_udev_devpath_get_syspath(const char *devpath) +{ + struct udev *udev; + struct udev_enumerate *en; + struct udev_list_entry *devs, *cur; + struct udev_device *device, *parent; + const char *name, *ret; + + if (!devpath) return NULL; + udev = udev_new(); + if (!udev) return NULL; + en = udev_enumerate_new(udev); + if (!en) return NULL; + + udev_enumerate_add_match_property(en, "DEVNAME", devpath); + udev_enumerate_scan_devices(en); + devs = udev_enumerate_get_list_entry(en); + + udev_list_entry_foreach(cur, devs) + { + name = udev_list_entry_get_name(cur); + device = udev_device_new_from_syspath(udev, name); + ret = eina_stringshare_add(udev_device_get_sysname(device)); + + udev_device_unref(device); + break; /*just in case there's more than one somehow*/ + } + udev_enumerate_unref(en); + udev_unref(udev); + + return ret; +} + +/** + * Get the subsystem of a device from the /dev/ path. + * + * @param devpath The /dev/ path of the device + * @return A const char* with the subsystem of the device or NULL on failure + * + * Takes "/dev/path" and returns the subsystem of the device. + * + * @ingroup udev + */ +EAPI const char * +e_udev_devpath_get_subsystem(const char *devpath) +{ + struct udev *udev; + struct udev_enumerate *en; + struct udev_list_entry *devs, *cur; + struct udev_device *device; + const char *name, *ret; + + if (!devpath) return NULL; + udev = udev_new(); + if (!udev) return NULL; + en = udev_enumerate_new(udev); + if (!en) return NULL; + + udev_enumerate_add_match_property(en, "DEVNAME", devpath); + udev_enumerate_scan_devices(en); + devs = udev_enumerate_get_list_entry(en); + + udev_list_entry_foreach(cur, devs) + { + name = udev_list_entry_get_name(cur); + device = udev_device_new_from_syspath(udev, name); + ret = eina_stringshare_add(udev_device_get_subsystem(device)); + + udev_device_unref(device); + break; /*just in case there's more than one somehow*/ + } + udev_enumerate_unref(en); + udev_unref(udev); + + return ret; +} + +/** + * Checks whether the device is a mouse. + * + * @param syspath The /sys/ path of the device + * @return If true, the device is a mouse + * + * @ingroup udev + */ +EAPI Eina_Bool +e_udev_syspath_is_mouse(const char *syspath) +{ + struct udev *udev; + struct udev_device *device; + Eina_Bool mouse = 0; + Eina_Strbuf *sbuf; + const char *test = NULL; + + if (!syspath) return 0; + udev = udev_new(); + if (!udev) return 0; + + sbuf = eina_strbuf_new(); + if (!strstr(syspath, "/sys/")) + eina_strbuf_append(sbuf, "/sys/"); + eina_strbuf_append(sbuf, syspath); + + device = udev_device_new_from_syspath(udev, eina_strbuf_string_get(sbuf)); + test = udev_device_get_property_value(device, "ID_INPUT_MOUSE"); + if (test) mouse = atoi(test); + + udev_device_unref(device); + udev_unref(udev); + + return mouse; +} + +/** + * Checks whether the device is a keyboard. + * + * @param syspath The /sys/ path of the device + * @return If true, the device is a keyboard + * + * @ingroup udev + */ +EAPI Eina_Bool +e_udev_syspath_is_kbd(const char *syspath) +{ + struct udev *udev; + struct udev_device *device; + Eina_Bool kbd = 0; + Eina_Strbuf *sbuf; + const char *test = NULL; + + if (!syspath) return 0; + udev = udev_new(); + if (!udev) return 0; + + sbuf = eina_strbuf_new(); + if (!strstr(syspath, "/sys/")) + eina_strbuf_append(sbuf, "/sys/"); + eina_strbuf_append(sbuf, syspath); + + device = udev_device_new_from_syspath(udev, eina_strbuf_string_get(sbuf)); + test = udev_device_get_property_value(device, "ID_INPUT_KEYBOARD"); + if (test) kbd = atoi(test); + + udev_device_unref(device); + udev_unref(udev); + + return kbd; +} + +/** + * Checks whether the device is a touchpad. + * + * @param syspath The /sys/ path of the device + * @return If true, the device is a touchpad + * + * @ingroup udev + */ +EAPI Eina_Bool +e_udev_syspath_is_touchpad(const char *syspath) +{ + struct udev *udev; + struct udev_device *device; + Eina_Bool touchpad = 0; + Eina_Strbuf *sbuf; + const char *test = NULL; + + if (!syspath) return 0; + udev = udev_new(); + if (!udev) return 0; + + sbuf = eina_strbuf_new(); + if (!strstr(syspath, "/sys/")) + eina_strbuf_append(sbuf, "/sys/"); + eina_strbuf_append(sbuf, syspath); + + device = udev_device_new_from_syspath(udev, eina_strbuf_string_get(sbuf)); + test = udev_device_get_property_value(device, "ID_INPUT_TOUCHPAD"); + if (test) touchpad = atoi(test); + + udev_device_unref(device); + udev_unref(udev); + + return touchpad; +} + diff --git a/legacy/eeze/src/lib/udev/e_udev_main.c b/legacy/eeze/src/lib/udev/e_udev_main.c new file mode 100644 index 0000000000..e2bb21901b --- /dev/null +++ b/legacy/eeze/src/lib/udev/e_udev_main.c @@ -0,0 +1,46 @@ +#include +#include "e_udev_private.h" + +int _e_eeze_udev_log_dom = -1; +int _e_eeze_udev_init_count = 0; + +EAPI int +e_udev_init(void) +{ + if (++_e_eeze_udev_init_count != 1) + return _e_eeze_udev_init_count; + + if (!eina_init()) + return --_e_eeze_udev_init_count; + + _e_eeze_udev_log_dom = eina_log_domain_register + ("e_udev", E_EEZE_COLOR_DEFAULT); + if (_e_eeze_udev_log_dom < 0) + { + EINA_LOG_ERR("Could not register 'e_udev' log domain."); + goto shutdown_eina; + } + + return _e_eeze_udev_init_count; + + unregister_log_domain: + eina_log_domain_unregister(_e_eeze_udev_log_dom); + _e_eeze_udev_log_dom = -1; + shutdown_eina: + eina_shutdown(); + + return _e_eeze_udev_init_count; +} + +EAPI int +e_udev_shutdown(void) +{ + if (--_e_eeze_udev_init_count != 0) + return _e_eeze_udev_init_count; + + eina_log_domain_unregister(_e_eeze_udev_log_dom); + _e_eeze_udev_log_dom = -1; + eina_shutdown(); + + return _e_eeze_udev_init_count; +} diff --git a/legacy/eeze/src/lib/udev/e_udev_private.h b/legacy/eeze/src/lib/udev/e_udev_private.h new file mode 100644 index 0000000000..f6c853000f --- /dev/null +++ b/legacy/eeze/src/lib/udev/e_udev_private.h @@ -0,0 +1,26 @@ +#ifndef E_UDEV_PRIVATE_H +#define E_UDEV_PRIVATE_H + +#ifndef E_EEZE_COLOR_DEFAULT +#define E_EEZE_COLOR_DEFAULT EINA_COLOR_CYAN +#endif +extern int _e_eeze_udev_log_dom; +#ifdef ERR +#undef ERR +#endif +#ifdef INF +#undef INF +#endif +#ifdef WARN +#undef WARN +#endif +#ifdef DBG +#undef DBG +#endif + +#define DBG(...) EINA_LOG_DOM_DBG(_e_eeze_udev_log_dom, __VA_ARGS__) +#define INFO(...) EINA_LOG_DOM_INFO(_e_eeze_udev_log_dom, __VA_ARGS__) +#define WARN(...) EINA_LOG_DOM_WARN(_e_eeze_udev_log_dom, __VA_ARGS__) +#define ERR(...) EINA_LOG_DOM_ERR(_e_eeze_udev_log_dom, __VA_ARGS__) + +#endif diff --git a/legacy/eeze/src/lib/udev/e_udev_watch.c b/legacy/eeze/src/lib/udev/e_udev_watch.c new file mode 100644 index 0000000000..c0069b4781 --- /dev/null +++ b/legacy/eeze/src/lib/udev/e_udev_watch.c @@ -0,0 +1,228 @@ +#include +#include "e_udev_private.h" + +/* opaque */ +struct Eudev_Watch +{ + struct udev_monitor *mon; + Ecore_Fd_Handler *handler; + Eudev_Type type; +}; + +/* private */ +struct _store_data +{ + void(*func)(const char *, void *, Eudev_Watch *); + void *data; + struct udev_monitor *mon; + Eudev_Type type; + Eudev_Watch *watch; +}; + +/* private function to further filter watch results based on Eudev_Type + * specified + */ +static int +_get_syspath_from_watch(void *data, Ecore_Fd_Handler *fd_handler) +{ + struct _store_data *store = data; + struct udev_device *device; + const char *ret, *test; + void(*func)(const char *, void *, Eudev_Watch *) = store->func; + void *sdata = store->data; + Eudev_Watch *watch = store->watch; + int cap = 0; + + if (!ecore_main_fd_handler_active_get(fd_handler, ECORE_FD_READ)) + return 0; + device = udev_monitor_receive_device(store->mon); + if (!device) return 0; + + switch (store->type) + { + case EUDEV_TYPE_KEYBOARD: + if (!udev_device_get_property_value(device, "ID_INPUT_KEYBOARD")) + goto error; + break; + case EUDEV_TYPE_MOUSE: + if (!udev_device_get_property_value(device, "ID_INPUT_MOUSE")) + goto error; + break; + case EUDEV_TYPE_TOUCHPAD: + if (!udev_device_get_property_value(device, "ID_INPUT_TOUCHPAD")) + goto error; + break; + case EUDEV_TYPE_DRIVE_MOUNTABLE: + test = udev_device_get_sysattr_value(device, "capability"); + if (test) cap = atoi(test); + if (!(test = (udev_device_get_property_value(device, "ID_FS_USAGE"))) || + strcmp("filesystem", test) || cap == 52) + goto error; + break; + case EUDEV_TYPE_DRIVE_INTERNAL: + if (!(test = udev_device_get_property_value(device, "ID_BUS")) || strcmp("ata", test) || + !(test = udev_device_get_sysattr_value(device, "removable")) || atoi(test)) + goto error; + break; + case EUDEV_TYPE_DRIVE_REMOVABLE: + if ((!(test = udev_device_get_sysattr_value(device, "removable")) || !atoi(test)) && + (!(test = udev_device_get_sysattr_value(device, "capability")) || atoi(test) != 10)) + goto error; + break; + case EUDEV_TYPE_DRIVE_CDROM: + if (!udev_device_get_property_value(device, "ID_CDROM")) + goto error; + break; + case EUDEV_TYPE_POWER_AC: + if (!(test = (udev_device_get_property_value(device, "POWER_SUPPLY_TYPE"))) || + strcmp("Mains", test)) + break; + case EUDEV_TYPE_POWER_BAT: + if (!(test = (udev_device_get_property_value(device, "POWER_SUPPLY_TYPE"))) || + strcmp("Battery", test)) + break; +/* + case EUDEV_TYPE_ANDROID: + udev_monitor_filter_add_match_subsystem_devtype(mon, "input", "usb_interface"); + break; +*/ + default: + break; + } + + ret = eina_stringshare_add(udev_device_get_syspath(device)); + if (!ret) return 0; + + udev_device_unref(device); + + (*func)(ret, sdata, watch); + + return 1; + +error: + udev_device_unref(device); + return 0; +} +/** + * Add a watch in a subsystem for a device type + * + * @param subsystem The subsystem type. See @ref Subsystem_Types + * @param device_type The device type. See @ref Device_Types + * @param func The function to call when the watch receives data + * @param user_data Data to pass to the callback function + * + * @return A watch struct for the watch type specified, or NULL on failure + * + * @ingroup udev + */ +EAPI Eudev_Watch * +e_udev_watch_add(Eudev_Type type, void(*func)(const char *, void *, Eudev_Watch *), void *user_data) +{ + struct udev *udev; + struct udev_monitor *mon; + int fd; + Ecore_Fd_Handler *handler; + Eudev_Watch *watch; + struct _store_data *store; + const char *subsystem, *device_type; + + if (!(store = malloc(sizeof(struct _store_data)))) return NULL; + if (!(watch = malloc(sizeof(Eudev_Watch)))) + goto error; + + if (!(udev = udev_new())) + goto error; + if (!(mon = udev_monitor_new_from_netlink(udev, "udev"))) + goto error; + switch (type) + { + case EUDEV_TYPE_KEYBOARD: + udev_monitor_filter_add_match_subsystem_devtype(mon, "input", "usb_interface"); + break; + case EUDEV_TYPE_MOUSE: + udev_monitor_filter_add_match_subsystem_devtype(mon, "input", "usb_interface"); + break; + case EUDEV_TYPE_TOUCHPAD: + udev_monitor_filter_add_match_subsystem_devtype(mon, "input", "usb_interface"); + break; + case EUDEV_TYPE_DRIVE_MOUNTABLE: + udev_monitor_filter_add_match_subsystem_devtype(mon, "block", "disk"); + break; + case EUDEV_TYPE_DRIVE_INTERNAL: + udev_monitor_filter_add_match_subsystem_devtype(mon, "block", "disk"); + break; + case EUDEV_TYPE_DRIVE_REMOVABLE: + udev_monitor_filter_add_match_subsystem_devtype(mon, "block", "disk"); + break; + case EUDEV_TYPE_DRIVE_CDROM: + udev_monitor_filter_add_match_subsystem_devtype(mon, "block", "disk"); + break; + case EUDEV_TYPE_POWER_AC: + udev_monitor_filter_add_match_subsystem_devtype(mon, "power_supply", "*"); + break; + case EUDEV_TYPE_POWER_BAT: + udev_monitor_filter_add_match_subsystem_devtype(mon, "power_supply", "*"); + break; +/* + case EUDEV_TYPE_ANDROID: + udev_monitor_filter_add_match_subsystem_devtype(mon, "input", "usb_interface"); + break; +*/ + default: + break; + } + if (udev_monitor_enable_receiving(mon)) + goto error; + + fd = udev_monitor_get_fd(mon); + store->func = func; + store->data = user_data; + store->mon = mon; + store->type = type; + store->watch = watch; + if (!(handler = ecore_main_fd_handler_add(fd, ECORE_FD_READ, _get_syspath_from_watch, store, NULL, NULL))) + goto error; + watch->mon = mon; + watch->handler = handler; + + return watch; + +error: + free(store); + free(watch); + udev_monitor_unref(mon); + udev_unref(udev); + return NULL; +} + +/** + * Deletes a watch. + * + * @param watch An Eudev_Watch object + * @return The data originally associated with the watch, or NULL + * + * Deletes a watch, closing file descriptors and freeing related udev memory. + * + * @ingroup udev + */ +EAPI void * +e_udev_watch_del(Eudev_Watch *watch) +{ + struct udev *udev; + struct udev_monitor *mon = watch->mon; + Ecore_Fd_Handler *handler = watch->handler; + struct _store_data *sdata; + void *ret; + + if (!watch || !mon || !handler) return NULL; + + udev = udev_monitor_get_udev(mon); + udev_monitor_unref(mon); + udev_unref(udev); + sdata = ecore_main_fd_handler_del(handler); + ret = sdata->data; + free(sdata); + free(watch); + + return ret; +}